Compare commits

...

389 Commits

Author SHA1 Message Date
Brenda Wallace
f08e740ac6 Removed owner_matches?
it's not used anymore
2017-04-19 08:22:03 +00:00
Brenda Wallace
5f23bcfad6 Photo#show for signed in and not signed in, and other members 2017-04-19 08:22:03 +00:00
Brenda Wallace
3cd7b86c99 Photos#show links to items 2017-04-19 08:22:03 +00:00
Brenda Wallace
bd53d4a271 updating view spec - link to delete photo has changed 2017-04-19 08:22:03 +00:00
Brenda Wallace
16d88730ec controller specs for PhotoAssociations 2017-04-19 08:22:03 +00:00
Brenda Wallace
5ad88eb6bd Responsive image on photos#show 2017-04-19 08:22:03 +00:00
Brenda Wallace
b617eb3140 Deleting photo's association with another item 2017-04-19 08:22:03 +00:00
Brenda Wallace
acc4d3ad84 Only delete own associations 2017-04-19 08:22:03 +00:00
Brenda Wallace
beb3f7e2b8 Don't overwrite edited photo titles 2017-04-19 08:22:03 +00:00
Brenda Wallace
ab46a8dd96 UI for removing photos from plantings 2017-04-19 08:22:03 +00:00
Brenda Wallace
b6b578d7e6 Layout change on photos 2017-04-19 08:22:03 +00:00
Brenda Wallace
4d07cf80fa Editing title of photos 2017-04-19 08:22:03 +00:00
Brenda Wallace
93f6b65d8d bugfix: Only show harvests if we have some 2017-04-19 08:22:03 +00:00
Brenda Wallace
b40a6723e1 gardens#show Include crop, owner, harvesss and garden in query 2017-04-19 08:22:03 +00:00
Brenda Wallace
2058d28b37 Include owner in query, because we need it later 2017-04-19 08:22:03 +00:00
Brenda Wallace
682c6d6f5e Reduced query count by .includes() on plantings 2017-04-19 08:22:03 +00:00
Brenda Wallace
2be55acc92 Route for flickr auth callback -- Fixes #1106 2017-04-19 08:22:03 +00:00
Brenda Wallace
a9a040182c Rubocop compliance for members controller 2017-04-19 08:22:03 +00:00
Shiny
53eb171dfc Merge pull request #1317 from Growstuff/dev
release 22
2017-04-17 05:00:59 +00:00
deppbot
b0b6931678 Bundle Update on 2017-04-17 2017-04-17 03:45:39 +00:00
Daniel O'Connor
d515dba7f2 Merge pull request #1316 from Br3nda/garden-thumbnail
Garden thumbnail display cleanup
2017-04-16 15:50:52 +09:30
Shiny
4958330c9e Merge branch 'master' into dev 2017-04-16 02:42:38 +00:00
Brenda Wallace
17236a4a8a Garden thumbnail display cleanup 2017-04-16 13:48:22 +12:00
Daniel O'Connor
3ccab3f857 Merge pull request #1309 from Br3nda/fix_1305
Fix 1305
2017-04-15 17:11:02 +09:30
Daniel O'Connor
0201e873eb Merge branch 'dev' into fix_1305 2017-04-15 17:03:15 +09:30
Daniel O'Connor
20289e6566 Merge pull request #1310 from Br3nda/counter-caches
Adding counter caches
2017-04-15 17:01:20 +09:30
Shiny
85ded414ec Merge branch 'dev' into fix_1305 2017-04-15 06:50:16 +00:00
Shiny
299c95c5f5 Merge branch 'dev' into counter-caches 2017-04-14 07:40:19 +00:00
Taylor Griffin
8f51090098 make mentionbot settings file 2017-04-14 07:40:01 +00:00
deppbot
5551eeba24 Bundle Update on 2017-04-14 2017-04-14 07:10:10 +00:00
Shiny
7a5a68f511 Merge branch 'dev' into counter-caches 2017-04-14 01:44:44 +00:00
Shiny
6d4ec9ad34 Merge branch 'dev' into fix_1305 2017-04-14 01:44:35 +00:00
Brenda Wallace
fffef75813 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 01:43:42 +00:00
Brenda Wallace
0e2d7b4393 Allow instance variables in partials for now 2017-04-14 01:43:42 +00:00
Brenda Wallace
f08068c289 Upgrade haml_lint 2017-04-14 01:43:42 +00:00
deppbot
ff653934ad Bundle Update on 2017-04-08 2017-04-14 01:43:42 +00:00
Brenda Wallace
c4bed2cf4d Merge branch 'haml-lint-fix' into counter-caches 2017-04-14 11:42:02 +12:00
Brenda Wallace
47c0f74f81 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 11:40:52 +12:00
Brenda Wallace
171e34914b Allow instance variables in partials for now 2017-04-14 11:40:46 +12:00
Brenda Wallace
8010a8b56c Upgrade haml_lint 2017-04-14 11:40:40 +12:00
Brenda Wallace
ac165ce0cd Adding counter caches 2017-04-14 11:32:31 +12:00
Brenda Wallace
4925fde28f Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 09:43:16 +12:00
Brenda Wallace
6580cf38b0 Allow instance variables in partials for now 2017-04-13 23:02:16 +12:00
Brenda Wallace
fdf10202ba Upgrade haml_lint 2017-04-13 22:56:07 +12:00
Brenda Wallace
85a368999b we love rubocop 2017-04-13 14:30:51 +12:00
Daniel O'Connor
6ba4b4560e Fix #1305 by adding aggregation
Expand test coverage
member_id is owner_id on plantings
Argue with ActionView::Template::Error about what we can group on

Rename variable
2017-04-13 14:30:41 +12:00
Cesy
71aedb136a Merge pull request #1300 from Growstuff/bundle-update-2017-04-02-131809
Bundle Update on 2017-04-02
2017-04-08 15:06:16 +01:00
Shiny
65c988790b Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-06 08:04:46 +12:00
Brenda Wallace
0372d3b9b0 Removing pre-commit.sh script 2017-04-06 08:04:09 +12:00
Shiny
3272ea1ca5 Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-06 07:51:19 +12:00
Shiny
39b461c348 Merge pull request #1243 from Growstuff/dev
Release 21
2017-04-06 07:49:08 +12:00
pozorvlak
a8f7031447 Merge pull request #1303 from Br3nda/disable-eslint
Disable eslint

Fixes #1302, at least temporarily.
2017-04-05 11:15:10 +01:00
Shiny
17967b7c72 Merge branch 'dev' into disable-eslint 2017-04-04 09:07:02 +12:00
Brenda Wallace
e422c8b072 Disable eslint 2017-04-03 21:05:35 +00:00
Cesy
5392d7d900 Merge branch 'dev' into bundle-update-2017-04-02-131809 2017-04-03 08:47:32 +01:00
Cesy
d42bbe7fa3 Merge pull request #1299 from Br3nda/gemfile-ruby-bump
Gemfile.lock bumping ruby version to match other files
2017-04-03 08:46:19 +01:00
deppbot
45f2abeab5 Bundle Update on 2017-04-02 2017-04-02 13:18:11 +08:00
Brenda Wallace
7e754b8293 Gemfile.lock bumping ruby version to match other files 2017-04-01 15:19:18 +13:00
pozorvlak
1dcd84009a Merge pull request #1298 from CloCkWeRX/ruby_234
Ruby 2.3.4
2017-03-31 14:07:36 +01:00
Daniel O'Connor
8615df264e Ruby 2.3.4 2017-03-31 16:29:21 +10:00
Daniel O'Connor
4e400cc899 Merge pull request #1295 from Growstuff/bundle-update-2017-03-30-121732
Bundle Update on 2017-03-30
2017-03-31 16:27:43 +10:00
Daniel O'Connor
3cead5fb6b Pin to earlier rubocop 2017-03-31 16:15:55 +10:00
Shiny
1decf6ea11 Merge branch 'dev' into bundle-update-2017-03-30-121732 2017-03-30 21:37:57 +13:00
Harry Brodsky
23c0f901c6 Add name to CONTRIBUTORS.md 2017-03-30 19:15:48 +13:00
Harry Brodsky
78f4b3dbf3 Update irregular crop pluralizations 2017-03-30 19:15:48 +13:00
deppbot
9340b8d7e5 Bundle Update on 2017-03-30 2017-03-30 12:17:33 +08:00
pozorvlak
0094473bbe Merge pull request #1287 from Br3nda/bw/readme-new-contributors
Readme update for new contributors - force-merging because it only touches README.md.
2017-03-28 23:56:37 +01:00
pozorvlak
743f482818 Merge pull request #1292 from Br3nda/query-optimising
Query optimising
2017-03-28 23:55:05 +01:00
Brenda Wallace
b8ea6116d4 Add photos to plantings to make them interesting in the spec 2017-03-29 10:46:15 +13:00
Brenda Wallace
2521e52d71 Remove test called to Planting.interesting(...)
Interesting plantings with no photos is not used in the code.
The method was converted to a scope.
2017-03-29 08:28:58 +13:00
Brenda Wallace
d44f9ef4e9 Removed assignment of useless variable 2017-03-29 08:21:34 +13:00
Brenda Wallace
63cee1edc9 Back to reading @garden.plantings 2017-03-29 08:21:02 +13:00
Brenda Wallace
3791b34fe3 One planting per owner (used for intersetingness) 2017-03-28 22:39:03 +13:00
Brenda Wallace
5d58be110e Fixed crop.interesting, no more duplicate crops 2017-03-28 19:33:34 +13:00
Brenda Wallace
911593b480 Reduces query numbes on gardens#show 2017-03-24 21:10:45 +13:00
Shiny
b72a3d6942 Merge branch 'dev' into query-optimising 2017-03-24 18:31:18 +13:00
Brenda Wallace
804ac8662a Rubocop fix ups 2017-03-24 17:29:39 +13:00
Brenda Wallace
1601e966ad Planting.interesting is in a scope 2017-03-24 16:59:09 +13:00
Brenda Wallace
e7553868f2 Removed variables on homes controller
following the comment there
2017-03-24 16:57:51 +13:00
Brenda Wallace
5e8ca392d2 Moved Member.interest near top of file 2017-03-24 16:45:55 +13:00
Brenda Wallace
815915d933 Loading child records of interesting crops 2017-03-24 16:45:36 +13:00
Brenda Wallace
6223076dae Pull in interesting members data in controller 2017-03-24 16:30:56 +13:00
Brenda Wallace
0182a99654 Optimising Member.interesting 2017-03-24 16:28:37 +13:00
Brenda Wallace
5baa357bb3 Use bullet to find queries to optomise 2017-03-24 16:07:05 +13:00
deppbot
0fb4d74685 Bundle Update on 2017-03-24 2017-03-24 09:24:40 +13:00
Daniel O'Connor
eebaef6fde Merge branch 'dev' into bw/readme-new-contributors 2017-03-21 14:03:22 +10:30
Daniel O'Connor
59fc550f3c Merge pull request #1290 from Growstuff/bundle-update-2017-03-19-161121
Bundle Update on 2017-03-19
2017-03-20 14:15:06 +10:30
Shiny
64ffaab1ec Merge branch 'dev' into bundle-update-2017-03-19-161121 2017-03-20 10:01:48 +13:00
Cesy
21f53e362f Merge pull request #1279 from Br3nda/plantings-harvests
View harvests for a planting
2017-03-19 09:46:57 +00:00
deppbot
20cfa0c5b2 Bundle Update on 2017-03-19 2017-03-19 16:11:22 +08:00
Shiny
204633d533 Merge branch 'dev' into bw/readme-new-contributors 2017-03-18 14:21:43 +13:00
Shiny
c77ed8c6d0 Merge branch 'dev' into plantings-harvests 2017-03-17 08:18:56 +13:00
Shiny
fe7ae18e7b Merge pull request #1285 from Growstuff/add-contributor-megan
Added Megan to contributors
2017-03-17 08:13:03 +13:00
Shiny
8746cc67e2 Merge branch 'dev' into plantings-harvests 2017-03-17 08:11:33 +13:00
Shiny
f1feb59818 Merge branch 'dev' into add-contributor-megan 2017-03-17 08:10:32 +13:00
Shiny
bb62b11070 Merge branch 'dev' into bw/readme-new-contributors 2017-03-16 21:15:30 +13:00
deppbot
1660d54c01 Bundle Update on 2017-03-16 2017-03-16 21:15:11 +13:00
Shiny
cb7715b6d9 Merge branch 'dev' into bw/readme-new-contributors 2017-03-16 15:35:22 +13:00
Shiny
a60d0faedd Merge branch 'dev' into add-contributor-megan 2017-03-16 15:35:15 +13:00
Shiny
7f592579cd Merge branch 'dev' into plantings-harvests 2017-03-16 15:35:06 +13:00
Brenda Wallace
998befb30f Limited plantings to member's own garden, and approved crops 2017-03-16 15:29:25 +13:00
Shiny
ebbf6df87d Merge branch 'dev' into plantings-harvests 2017-03-16 14:59:54 +13:00
Shiny
40e4f8df8a Merge branch 'dev' into add-contributor-megan 2017-03-16 14:59:26 +13:00
Brenda Wallace
81d41398a2 Link to waffle from readme 2017-03-16 14:55:30 +13:00
Brenda Wallace
4f02f45ae8 Updated wiki link 2017-03-16 14:55:22 +13:00
Arun Kumar
f7ec1826b0 Use presence instead of regex validation 2017-03-16 13:27:13 +13:00
Shiny
d619cd160d Added Megan to contributors 2017-03-16 13:04:31 +13:00
Daniel O'Connor
4a20f68d3a Merge branch 'dev' into plantings-harvests 2017-03-16 09:40:56 +10:30
Daniel O'Connor
62d2b5e9fb Merge pull request #1273 from Br3nda/yaml-cleanup
Yaml file clean up
2017-03-16 09:39:33 +10:30
Daniel O'Connor
5935d2e73f Merge pull request #1276 from Br3nda/bw/install-linters
Install npm modules locally
2017-03-16 09:38:54 +10:30
Daniel O'Connor
92b8972b24 Merge pull request #1278 from Br3nda/bw/crop-model-dupe
Reduced duplication of the term "approved" in crop model
2017-03-16 09:37:24 +10:30
Daniel O'Connor
12254fe0ca Merge pull request #1275 from Br3nda/bw/discourse-removal
Removing references to Discourse (talk.growstuff.org)
2017-03-16 09:36:29 +10:30
Daniel O'Connor
ea54fca2b2 Merge pull request #1282 from Br3nda/gardens-order
Gardens order
2017-03-16 09:35:17 +10:30
Daniel O'Connor
d7db9007fd Merge pull request #1280 from Br3nda/public-error-pages
Update public error pages
2017-03-16 09:32:52 +10:30
Daniel O'Connor
c2acb8cf73 Merge pull request #1274 from Br3nda/fix-traxis-badge
Tie travis badge to a branch
2017-03-16 09:30:27 +10:30
Shiny
8d04d4b223 Merge branch 'dev' into plantings-harvests 2017-03-15 23:10:15 +13:00
Shiny
35d9c8e9f1 Merge branch 'dev' into bw/crop-model-dupe 2017-03-15 23:09:31 +13:00
Shiny
b23118a9db Merge branch 'dev' into public-error-pages 2017-03-15 23:09:21 +13:00
Shiny
5585dbada1 Merge branch 'dev' into gardens-order 2017-03-15 23:09:09 +13:00
Thomas Countz
fa49234669 remove "add new garden" on other member's page (#1283)
* update garden#show view logic
* added name to contributors
Closes #1167
2017-03-15 23:06:32 +13:00
Shiny
8833571ab3 Merge branch 'dev' into bw/discourse-removal 2017-03-14 16:21:44 +13:00
Shiny
a54e66f2fd Merge branch 'dev' into bw/install-linters 2017-03-12 22:56:11 +13:00
Shiny
7913f85cf4 Merge branch 'dev' into yaml-cleanup 2017-03-12 22:55:11 +13:00
Shiny
bf46c0a6d2 Merge branch 'dev' into bw/crop-model-dupe 2017-03-12 22:54:32 +13:00
Shiny
082bdb035f Merge branch 'dev' into plantings-harvests 2017-03-12 22:54:17 +13:00
Shiny
15bedb1659 Merge branch 'dev' into public-error-pages 2017-03-12 22:54:03 +13:00
Shiny
5995812215 Merge branch 'dev' into gardens-order 2017-03-12 22:53:34 +13:00
Brenda Wallace
195d1bbdbb order gardens by recently updated 2017-03-12 20:12:28 +13:00
deppbot
55e0579384 Bundle Update on 2017-03-12 2017-03-12 18:50:42 +13:00
Megan Talbot
d167a427b9 Update public error pages
Author:    Megan Talbot <meganftalbot@gmail.com>
Date:      Wed Mar 1 15:55:30 2017 -0700
2017-03-12 14:46:40 +13:00
Brenda Wallace
c89c20e842 View harvests for a planting 2017-03-12 14:44:11 +13:00
Shiny
ad04a48c8f Merge branch 'dev' into bw/discourse-removal 2017-03-12 13:56:04 +13:00
Shiny
d3a47b3dc6 Merge branch 'dev' into fix-traxis-badge 2017-03-12 12:49:22 +13:00
Brenda Wallace
02de30f617 Reduced duplication of the term "approved" in crop model 2017-03-12 12:31:38 +13:00
Shiny
a4360a0fa5 Merge branch 'dev' into yaml-cleanup 2017-03-12 11:44:21 +13:00
Brenda Wallace
39d4dec294 Npm sourced linters in package.json 2017-03-12 11:26:50 +13:00
Brenda Wallace
4c189b4d56 Lock haml_lint to 0.20.0 and update other gems 2017-03-12 10:53:55 +13:00
Brenda Wallace
8267b7d16d Removing references to Discource (talk.growstuff.org)
and adding one link to github issues.
2017-03-12 10:51:25 +13:00
Brenda Wallace
bf9f86d516 Tie travis badge to a branch
Instead of showing the most recent buid (on any branch),
show the dev branch.
2017-03-12 10:42:17 +13:00
Brenda Wallace
a93c4e9fb8 Yaml file clean up 2017-03-12 10:38:39 +13:00
deppbot
3243716d13 Bundle Update on 2017-03-06 2017-03-08 10:41:52 +13:00
Cesy
685418507b Merge pull request #1266 from Br3nda/spec-fixups
bugfix in some spec expectations
2017-03-05 08:32:09 +00:00
Shiny
418c5fdcd0 Merge branch 'dev' into spec-fixups 2017-03-05 21:11:06 +13:00
Brenda Wallace
322f28eaa6 bugfix in some spec expectations 2017-03-05 00:36:10 +13:00
Cesy
7a06ab0b61 Merge pull request #1264 from Br3nda/js-clean
Added missing semicolons to js files
2017-03-04 11:07:19 +00:00
Shiny
a5dda8ab9b Merge branch 'dev' into js-clean 2017-03-04 23:58:04 +13:00
Cesy
54b5c139f3 Merge pull request #1263 from Br3nda/bundle-audit-update
Bundle audit needs updating in test runs
2017-03-04 10:34:39 +00:00
Shiny
864990dc8a Merge branch 'dev' into js-clean 2017-03-04 17:09:01 +13:00
Brenda Wallace
1e0ccd72a2 Added missing semicolons to js files 2017-03-04 17:06:29 +13:00
Shiny
513a8924d8 Merge branch 'dev' into bundle-audit-update 2017-03-04 16:52:19 +13:00
Brenda Wallace
478d68ee25 Bundle audit needs updating 2017-03-04 16:45:43 +13:00
deppbot
175780aa06 Bundle Update on 2017-03-03 2017-03-04 16:33:18 +13:00
Miles Gould
c9558be2d3 Add deppbot to CONTRIBUTORS.md
This prevents deppbot-generated pull requests from failing the "are you
in CONTRIBUTORS.md?" check in CI.
2017-03-04 16:16:28 +13:00
Miles Gould
f1d3a70bbd Install git-guilt linter 2017-03-03 14:25:03 +13:00
Miles Gould
d3dd6f88f2 Fix typo in CONTRIBUTING.md 2017-03-03 14:25:03 +13:00
Brenda Wallace
882d641683 Photo changes expire homepage too 2017-03-03 08:49:24 +13:00
pozorvlak
a53f6073a6 Merge pull request #1253 from Br3nda/rubocop-progress
Rubocop progress
2017-03-02 17:45:39 +00:00
pozorvlak
7c7020f50a Merge branch 'dev' into rubocop-progress 2017-03-02 14:31:39 +00:00
pozorvlak
41b3c0f4fc Merge pull request #1254 from Br3nda/bw/unneeded-percent-q
Rubocop fix for unneeded %Q
2017-03-02 14:29:05 +00:00
pozorvlak
314087321c Merge branch 'dev' into bw/unneeded-percent-q 2017-03-02 13:41:01 +00:00
pozorvlak
c67067acaf Merge pull request #1247 from Br3nda/overcommit
Run the linters etc from overcommit
2017-03-02 13:11:19 +00:00
Shiny
d23be43c2f Merge branch 'dev' into overcommit 2017-03-02 22:24:18 +13:00
Brenda Wallace
6c282ffbd7 rubocop fix for redundant self assignment 2017-03-02 22:21:15 +13:00
Brenda Wallace
0ecc65bbe0 rubocop fix for redundant self 2017-03-02 22:21:15 +13:00
Brenda Wallace
076da040b5 Revert "Intentionally making rubocop fail"
This reverts commit 17858cc17c.
2017-03-02 21:53:20 +13:00
Brenda Wallace
17858cc17c Intentionally making rubocop fail 2017-03-02 21:50:48 +13:00
Brenda Wallace
66fec1f4a3 Adding yaml linter 2017-03-02 21:32:53 +13:00
Brenda Wallace
69848f11ca Docs on using overcommit 2017-03-02 21:22:22 +13:00
Brenda Wallace
affbe2a460 renamed ruby files to .rb
so rubocop cop catches these in her net
2017-03-02 21:13:35 +13:00
Brenda Wallace
cc40bb35fb bundle exec on the contributor check 2017-03-02 21:04:21 +13:00
Shiny
542cc1f546 Merge branch 'dev' into bw/unneeded-percent-q 2017-03-02 21:02:28 +13:00
Brenda Wallace
0d2fb25881 Removed gemfile check. overcommit can do this 2017-03-02 20:59:45 +13:00
Brenda Wallace
29f050d19f Removed check_conflicts. overcommit does this 2017-03-02 20:48:21 +13:00
Brenda Wallace
2238374080 Moved overcommit call into check_static 2017-03-02 20:47:18 +13:00
Brenda Wallace
cad8ecad8f Added bundle-audit 2017-03-02 20:40:25 +13:00
Brenda Wallace
d161053328 Always create db - so we can check rails schema is up to date 2017-03-02 20:19:22 +13:00
Brenda Wallace
dbb74c5675 Moved phantom verion output to script 2017-03-02 20:10:47 +13:00
Brenda Wallace
6422070f04 Moved linter installs to own script 2017-03-02 20:06:47 +13:00
Brenda Wallace
b6512ce8e4 RailsSchemaUpToDate and BundleAudit added to overcommit 2017-03-02 20:00:46 +13:00
Brenda Wallace
a3e0bc0798 Rubocop fix for Gemfile 2017-03-02 19:59:59 +13:00
Brenda Wallace
5ec70d1438 Moved merge conflict checking to overcommit 2017-03-02 19:54:18 +13:00
Brenda Wallace
e848e18574 Removed commented out overcommit linters 2017-03-02 19:49:49 +13:00
Brenda Wallace
cfff970812 Revert "Intentionally making rubocop unhappy"
This reverts commit 6e3f5f9d77fb4b3b81265665adea1e1b416469fe.
2017-03-01 20:48:15 +00:00
Brenda Wallace
0db8c2feb2 Intentionally making rubocop unhappy
to test travis
2017-03-01 20:48:15 +00:00
Brenda Wallace
7e06bf4fd0 Wrap shell script variables in "" 2017-03-01 20:48:15 +00:00
Brenda Wallace
dd710860de Run the linters etc from overcommit 2017-03-01 20:48:15 +00:00
pozorvlak
4718a9edab Merge pull request #1256 from Br3nda/numeric
Rubocop fix for some numerics
2017-03-01 13:31:10 +00:00
Brenda Wallace
8c5db9229a fixed forced octal 2017-03-01 17:49:42 +13:00
Brenda Wallace
e229438997 rubocop fox for numeric literals 2017-03-01 17:46:12 +13:00
Brenda Wallace
85a4490740 Rubocop fix for unneeded %Q 2017-03-01 17:35:06 +13:00
Brenda Wallace
9684e84420 Moved metrics to bottom of rubocop.yml
Waiting to be completed
2017-03-01 11:38:16 +13:00
Brenda Wallace
4364c028a2 Removed offense counts 2017-03-01 11:36:40 +13:00
Brenda Wallace
4e44e26c6c Removed rubocop todos that are done 2017-03-01 11:24:26 +13:00
Daniel O'Connor
b07c033863 Merge pull request #1249 from Growstuff/bundle-update-2017-02-28-091217
Bundle Update on 2017-02-28
2017-02-28 11:59:57 +10:30
deppbot
f167f5cbd4 Bundle Update on 2017-02-28 2017-02-28 09:12:18 +08:00
pozorvlak
7a1b192392 Merge pull request #1238 from CloCkWeRX/bundle-update-2017-02-23-1
Upgrade rails, other gems
2017-02-27 15:18:43 +00:00
pozorvlak
642f371416 Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-27 15:01:14 +00:00
pozorvlak
f4e2b6e115 Merge pull request #1244 from Br3nda/photos-controller
DRY the photos controller
2017-02-27 11:26:14 +00:00
Daniel O'Connor
1873d28b50 Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-27 16:08:50 +10:30
Brenda Wallace
ce03b4efde DRY the photos controller 2017-02-26 17:03:29 +13:00
Shiny
102c113b0c Merge branch 'master' into dev 2017-02-25 22:56:23 +13:00
Shiny
245cd2e44c Merge branch 'dev' into bundle-update-2017-02-23-1 2017-02-25 22:56:01 +13:00
Cesy
f28456875b Merge pull request #1242 from Br3nda/schema-update
Schema is out of sync -- fixing
2017-02-24 21:15:12 +00:00
Brenda Wallace
9604eed2f3 Schema is out of sync -- fixing 2017-02-24 20:19:01 +13:00
Brenda Wallace
4eda3a506b Fix up csv importer, should make duplicates
Now matches the old functionality.
2017-02-24 20:08:01 +13:00
Daniel O'Connor
14f3dc7526 Add explaining notes 2017-02-23 14:34:38 +10:30
Daniel O'Connor
f2d3c88c85 Revert "Upgrade to the 4.x series of d3-rails"
This reverts commit 5bd7d9aa43.
2017-02-23 14:33:33 +10:30
Daniel O'Connor
f4e0efc8da Update autoprefixer-rails 2017-02-23 14:32:47 +10:30
Daniel O'Connor
13bfdeaa1a Pin Kaminari for the moment, until https://github.com/kaminari/kaminari/blob/master/CHANGELOG.md#100 assessed 2017-02-23 14:31:47 +10:30
Daniel O'Connor
e2fb7c940f Upgrade js-routes 2017-02-23 14:30:10 +10:30
Daniel O'Connor
5bd7d9aa43 Upgrade to the 4.x series of d3-rails 2017-02-23 14:28:19 +10:30
Daniel O'Connor
117c717391 Upgrade capybara, codeclimate-test-reporter 2017-02-23 14:25:51 +10:30
Daniel O'Connor
72603a2db0 Pin to specific omniauth versions for the moment, to avoid login test regression 2017-02-23 14:24:29 +10:30
Daniel O'Connor
9f8cfa8de3 Update sexp_processor, ruby-units 2017-02-23 14:23:01 +10:30
Daniel O'Connor
221dd45681 Upgrade to d3 3.5 “Mount Sharp” 2017-02-23 14:19:33 +10:30
Daniel O'Connor
fb2a600433 Pin d3-rails for the moment 2017-02-23 14:18:31 +10:30
Daniel O'Connor
296f8dddfa Update selenium-webdriver, haml_lint, jasmine 2017-02-23 14:15:27 +10:30
Daniel O'Connor
da16a38d1f Upgrade rails 2017-02-23 14:12:27 +10:30
Brenda Wallace
5abc1fb80e duplicate alt name spec (and adding to crop) 2017-02-23 15:35:29 +13:00
Brenda Wallace
86d5f5febd sciname/altnames adding code is very similar 2017-02-23 15:35:29 +13:00
Brenda Wallace
0a840abc58 Added specs for duplicate sci names 2017-02-23 15:35:29 +13:00
Brenda Wallace
968e9bd3ad Rubocop fix up in spec 2017-02-23 15:35:29 +13:00
Brenda Wallace
ddd0e0c285 Fixed typo in string causing spec to fail 2017-02-23 15:35:29 +13:00
Brenda Wallace
00952d5ef6 Updating more specs for new csv importer interface 2017-02-23 15:35:29 +13:00
Brenda Wallace
a0e1d8b11d Update scientific name model spec 2017-02-23 15:35:29 +13:00
Brenda Wallace
3d7f2ec20c Updating specs to match new csv importer 2017-02-23 15:35:29 +13:00
Brenda Wallace
abbd2cf0a4 fix bug: look up parent crop by name in csv import 2017-02-23 15:35:29 +13:00
Brenda Wallace
2f9961651f Call new csv importer from specs 2017-02-23 15:35:29 +13:00
Brenda Wallace
3089c28233 Adding validations to sci names and alt names 2017-02-23 15:35:29 +13:00
Brenda Wallace
4e722dd123 Move crop csv import to own file 2017-02-23 15:35:29 +13:00
Brenda Wallace
5698a78d9b DRY the accounts controller 2017-02-23 09:45:57 +13:00
Daniel O'Connor
71804a0b41 Merge pull request #1235 from Br3nda/accounttypes-controller-DRY
DRY the account types controller
2017-02-22 11:03:00 +10:30
Brenda Wallace
d500c9093d DRY the account types controller 2017-02-22 13:21:59 +13:00
Shiny
9ff468aa50 Merge pull request #1228 from Growstuff/dev
Release 20
2017-02-22 09:21:01 +13:00
Shiny
4261f16cd0 Merge pull request #1133 from pozorvlak/test_runners
Refactor test-runners
2017-02-21 11:59:09 +13:00
Shiny
b8884beb2f Merge branch 'dev' into test_runners 2017-02-21 11:31:02 +13:00
pozorvlak
bc88c4d8c7 Merge pull request #1231 from Br3nda/seeds-controller
DRY seeds controller
2017-02-20 13:49:29 +00:00
pozorvlak
3ac4fbcdb8 Merge branch 'dev' into seeds-controller 2017-02-20 13:36:50 +00:00
pozorvlak
549426e3e0 Merge pull request #1230 from Br3nda/gardens-controller
DRY the gardens controller
2017-02-20 13:36:40 +00:00
pozorvlak
25a1f0da9a Merge branch 'dev' into gardens-controller 2017-02-20 13:11:18 +00:00
pozorvlak
3be2fc6241 Merge pull request #1229 from Br3nda/harvests-controller
DRY the Harvests controller
2017-02-20 13:11:04 +00:00
pozorvlak
837934167b Merge branch 'dev' into harvests-controller 2017-02-20 13:02:58 +00:00
pozorvlak
d43d8ae0e7 Merge pull request #1217 from Br3nda/MultilineMethodCallBraceLayout
Fix up to match rubocop's MultilineMethodCallBraceLayout recommendation
2017-02-20 12:46:17 +00:00
Brenda Wallace
035b2399ca DRY seeds controller 2017-02-20 20:54:06 +13:00
Brenda Wallace
1a3e976ba5 DRY the gardens controller 2017-02-20 02:36:51 +00:00
Brenda Wallace
d31739f86a Further code clarity on the harvest csv filename 2017-02-20 10:07:14 +13:00
Brenda Wallace
0f523381f0 DRY the harvest controller 2017-02-20 09:58:36 +13:00
Brenda Wallace
550848a513 ParenthesesAroundCondition fixup 2017-02-19 16:20:45 +13:00
Brenda Wallace
ae3752e021 DefWithParentheses fixup 2017-02-19 16:19:16 +13:00
Brenda Wallace
50624fb2cb Style/MultilineBlockLayout fix 2017-02-19 16:17:03 +13:00
Brenda Wallace
818466a142 MethodCallWithoutArgsParentheses fixup 2017-02-19 16:17:03 +13:00
Brenda Wallace
e184503caa Fix up to match rubocop's MultilineMethodCallBraceLayout recommendation 2017-02-19 16:17:03 +13:00
Brenda Wallace
d00f743c47 rubocop fix up on spec 2017-02-17 16:00:11 +13:00
pozorvlak
b19a991106 Merge pull request #1226 from Br3nda/scinames-controller
DRY scientific names controller
2017-02-16 23:00:29 +00:00
pozorvlak
88e019a19f Merge branch 'dev' into scinames-controller 2017-02-16 22:52:07 +00:00
pozorvlak
e954ba801b Merge pull request #1225 from Br3nda/comments-controller
DRY comments controller
2017-02-16 22:51:42 +00:00
Brenda Wallace
be23bfc419 DRY scientific names controller 2017-02-17 10:18:34 +13:00
Shiny
5e984ce04a Merge branch 'dev' into comments-controller 2017-02-17 09:57:29 +13:00
Brenda Wallace
d15eb32133 Added some utf8, kōrero mai (te reo māori) 2017-02-17 09:47:12 +13:00
Brenda Wallace
21f11a4d5d highest MethodLength is now 34 2017-02-17 09:26:30 +13:00
Brenda Wallace
ae398f1a63 Spec checks you can't change post id in comments#update 2017-02-17 09:20:15 +13:00
Brenda Wallace
cd3cee5d5f DRY comments controller and add more spec scenarios 2017-02-17 09:14:01 +13:00
Miles Gould
9030e5b978 Merge branch 'dev' into test_runners 2017-02-16 13:31:39 +00:00
Miles Gould
9d6ac9fd8b LINT ALL THE HAML!
.
.
.
lint *all* the HAML?
2017-02-16 13:30:20 +00:00
pozorvlak
403a8814e1 Merge pull request #1222 from Br3nda/forums-controller
Small clean ups on forums controller
2017-02-16 13:26:38 +00:00
Miles Gould
00c34ef30c Document test-running process in CONTRIBUTING.md 2017-02-16 13:25:59 +00:00
Miles Gould
738c0d4e08 Store spec failures, for rspec --only-failures
The list of failing tests is stored in tmp/examples.txt, which is
already gitignored.
2017-02-16 13:24:50 +00:00
Miles Gould
82e27f8a71 Delete reference to Discussion Forums wiki page
The wiki is dead, that page hasn't been preserved, and most of the
forums it described are dead too. Sic transit gloria mundi.
2017-02-16 13:07:56 +00:00
Miles Gould
fbc203ca0d Make Jasmine tests pass in CI
One test relied on reading the innerHTML attribute of an SVGElement
object; this worked in the browser, but not when run with
`rake jasmine:ci`. I've changed the test to use the `textContent`
attribute instead, which works in both places.
2017-02-16 13:01:40 +00:00
Miles Gould
c83bfc101e Allow console.log in Jasmine tests, for debugging 2017-02-16 13:00:34 +00:00
pozorvlak
22905235c1 Merge branch 'dev' into forums-controller 2017-02-16 12:41:20 +00:00
pozorvlak
4d3b94b7f0 Merge pull request #1216 from Br3nda/more-rubocop
Rubocop fix for MultilineHashBraceLayout
2017-02-16 12:41:10 +00:00
pozorvlak
9e19aae0ca Merge branch 'dev' into forums-controller 2017-02-16 12:33:55 +00:00
pozorvlak
d8c3f7ed34 Merge branch 'dev' into more-rubocop 2017-02-16 12:30:38 +00:00
pozorvlak
28a6cfe25c Merge pull request #1223 from Br3nda/posts-controller
DRY the posts controller
2017-02-16 12:28:47 +00:00
pozorvlak
630d539f7d Merge branch 'dev' into more-rubocop 2017-02-16 12:24:20 +00:00
Brenda Wallace
4704bd89f8 DRY the posts controller 2017-02-16 22:15:30 +13:00
Brenda Wallace
076695d349 Added name presence validation to forum 2017-02-16 21:52:28 +13:00
Brenda Wallace
3925a54340 DRY the forums controller 2017-02-16 21:52:07 +13:00
Brenda Wallace
6c566c56d8 removed unnecesary reloads of @forum 2017-02-16 20:16:13 +13:00
Daniel O'Connor
bcc89674d4 Upgrade to current Hashie 2017-02-16 17:18:44 +13:00
Shiny
e1dab634a2 Merge branch 'dev' into more-rubocop 2017-02-16 13:23:07 +13:00
Daniel O'Connor
e06e002282 Merge pull request #1218 from Br3nda/UnneededInterpolation
Fix up all UnneededInterpolation
2017-02-16 10:29:19 +10:30
Daniel O'Connor
23ed7f91ba Merge pull request #1220 from Br3nda/ReversibleMigration
Marked our one ReversibleMigration as okay
2017-02-16 10:29:02 +10:30
Daniel O'Connor
aa511aedb4 Merge pull request #1219 from Br3nda/TrailingCommas
Removed trailing commas
2017-02-16 10:28:43 +10:30
Brenda Wallace
2b03381a24 Removed trailing commas 2017-02-15 23:33:06 +00:00
Brenda Wallace
6017c4ba23 Marked our one ReversibleMigration as okay 2017-02-16 12:32:37 +13:00
Brenda Wallace
a46b8ebe76 Fix up all UnneededInterpolation 2017-02-16 12:26:47 +13:00
Brenda Wallace
a4f8b3a0e6 Rubocop fix for MultilineHashBraceLayout 2017-02-16 12:20:32 +13:00
Daniel O'Connor
1b8c413b90 Merge pull request #1215 from Br3nda/likeable-dry
Likeable even more dry
2017-02-14 10:27:51 +10:30
Shiny
7a334abf1d Merge branch 'dev' into likeable-dry 2017-02-14 12:40:05 +13:00
pozorvlak
5c067c87b8 Merge pull request #1201 from Br3nda/bw/harvest-planting-link
Linking existing harvests to a planting
2017-02-13 23:02:04 +00:00
Brenda Wallace
87bc1becb0 Reduced repeating code in likes controller 2017-02-14 11:52:20 +13:00
pozorvlak
7c0d6c04df Merge branch 'dev' into bw/harvest-planting-link 2017-02-13 22:39:15 +00:00
pozorvlak
01415fd04f Merge pull request #1214 from Br3nda/authentication-scoping
User can only sign out their own session
2017-02-13 22:38:40 +00:00
pozorvlak
e0def646ce Merge branch 'dev' into authentication-scoping 2017-02-13 22:22:47 +00:00
pozorvlak
a52731dc4b Merge pull request #1198 from Br3nda/bw/grand-haml-cleanup-of-2017
All the haml clean up
2017-02-13 22:20:16 +00:00
Shiny
cd2500c99a Merge branch 'dev' into bw/harvest-planting-link 2017-02-14 00:19:28 +13:00
Shiny
c9a197bc61 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-14 00:18:53 +13:00
Mackenzie Morgan
c5439c8650 use symbols for status codes 2017-02-13 20:56:22 +13:00
Brenda Wallace
6d0a7ebc8f Only show plantings with overlapping date ranges on harvest options 2017-02-13 20:41:43 +13:00
Brenda Wallace
0d1bab04d5 don't load the record again 2017-02-13 20:28:29 +13:00
Brenda Wallace
e6b23262da User can only sign out their own session 2017-02-13 20:08:31 +13:00
Brenda Wallace
06ea3db252 Use .field to format planting options on harvests 2017-02-13 17:30:41 +13:00
Brenda Wallace
8d24ffbffb spec for harvesting from a planting 2017-02-13 17:21:11 +13:00
Brenda Wallace
cce9f513db Linking existing harvests to a planting 2017-02-13 17:21:11 +13:00
Brenda Wallace
c37ba9f041 Use @harvest.planting, instead of @planting 2017-02-13 17:21:11 +13:00
Shiny
f8c56cc217 Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-13 17:19:58 +13:00
Daniel O'Connor
d11e6f484a Pin leaflet-rails for the moment, until we fix tests 2017-02-13 17:19:40 +13:00
Daniel O'Connor
9218a03e2b Upgrade only geocoder 2017-02-13 17:19:40 +13:00
Daniel O'Connor
da760a8a4c Revert "Update geocoder, leaflet-rails"
This reverts commit ecd2bb1c01.
2017-02-13 17:19:40 +13:00
Daniel O'Connor
9ccecf0e04 Update i18n-tasks bootstrap_form font-awesome-sass 2017-02-13 17:19:40 +13:00
Daniel O'Connor
5ec105ad19 Upgrade sidekiq 2017-02-13 17:19:40 +13:00
Daniel O'Connor
5c1f5f4312 Update poltergeist 2017-02-13 17:19:40 +13:00
Daniel O'Connor
48d3a64e7b Update cancancan 2017-02-13 17:19:40 +13:00
Daniel O'Connor
decd48a970 Update geocoder, leaflet-rails 2017-02-13 17:19:40 +13:00
Daniel O'Connor
540ac7b034 Update warden 2017-02-13 17:19:40 +13:00
Daniel O'Connor
8112133cf2 Update unicorn 2017-02-13 17:19:40 +13:00
Daniel O'Connor
55f00ed0f8 Update newrelic 2017-02-13 17:19:40 +13:00
Daniel O'Connor
d0999c2f9a Update activemerchant 2017-02-13 17:19:40 +13:00
Daniel O'Connor
47150a8ad8 Update selenium-webdriver 2017-02-13 17:19:40 +13:00
Daniel O'Connor
9301688763 Update guard 2017-02-13 17:19:40 +13:00
Daniel O'Connor
248b89a564 Update elasticsearch 2017-02-13 17:19:40 +13:00
Daniel O'Connor
8e9ffac64e Pin to hashie 3.4.* for https://github.com/intridea/hashie/issues/408 2017-02-13 17:19:40 +13:00
Brenda Wallace
65024d8f83 Moved hash in haml onto one line, for clarity and glory 2017-02-12 20:41:25 +00:00
Shiny
8ab70a1c1c Merge branch 'dev' into bw/grand-haml-cleanup-of-2017 2017-02-13 08:04:41 +13:00
Brenda Wallace
2c871abd03 don't allow owner in params 2017-02-13 07:41:53 +13:00
Brenda Wallace
8b4491d0ab Tabulation on wrapped form_for 2017-02-13 07:38:26 +13:00
Brenda Wallace
93202fc13c haml clean up for devise views 2017-02-13 07:34:41 +13:00
Brenda Wallace
0f520c0928 More haml clean up for home views 2017-02-13 07:34:31 +13:00
Brenda Wallace
21c989989c add missing new line at end of haml file 2017-02-13 07:34:13 +13:00
Brenda Wallace
123c34b6d1 Haml cleanup for layout 2017-02-13 07:33:48 +13:00
Brenda Wallace
f5e786401d fixed typo 2017-02-13 07:32:43 +13:00
Brenda Wallace
6ecb919f34 haml clean ups for members views 2017-02-13 07:32:43 +13:00
Brenda Wallace
c89d1ae94e Haml clean ups for plantings views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9b7a7d3e8f Haml clean up for product views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9ebe830402 Haml clean up for scientific names views 2017-02-13 07:32:43 +13:00
Brenda Wallace
9a0adadc9a Haml clean up for seeds views 2017-02-13 07:32:43 +13:00
Brenda Wallace
92c3976f0a Haml clean up for shared views 2017-02-13 07:32:43 +13:00
Brenda Wallace
01c25df8cf haml-lint all views 2017-02-13 07:32:43 +13:00
pozorvlak
9ae35ca6eb Merge pull request #1200 from Br3nda/bw/planting_slug
Simplified logic in planting.planting_slug
2017-02-12 15:46:22 +00:00
pozorvlak
43f9707c11 Merge branch 'dev' into bw/planting_slug 2017-02-12 15:21:41 +00:00
Mackenzie
4fa423bcab Merge pull request #1205 from Br3nda/dry-notifications
DRY for the notifications controller
2017-02-12 10:21:31 -05:00
Mackenzie
97d0bb6752 Merge pull request #1207 from Br3nda/DRY-plantparts
DRY the plant parts controller
2017-02-12 10:20:30 -05:00
Mackenzie
b9edd2f89b Merge pull request #1203 from Br3nda/access
Added cancan ability for likes (and DRY-ed)
2017-02-12 10:20:03 -05:00
pozorvlak
4bd50ca433 Merge branch 'dev' into bw/planting_slug 2017-02-12 15:19:55 +00:00
pozorvlak
a2dd675717 Merge pull request #1199 from Br3nda/time-zones
Use timezone when creating dates
2017-02-12 15:19:38 +00:00
Brenda Wallace
1275aa0102 DRY the plant parts controller 2017-02-12 22:58:17 +13:00
Brenda Wallace
f40ff18949 You can only reply to messages that were sent to you. 2017-02-12 22:15:50 +13:00
Brenda Wallace
f25d4dbf8c DRY for the notifications controller 2017-02-12 21:52:22 +13:00
Brenda Wallace
4dd99f54db Removed deprecation notice from controller spec 2017-02-12 20:55:06 +13:00
Brenda Wallace
b8e06a1d1d Specs for deleting someone else's like 2017-02-12 20:50:50 +13:00
Brenda Wallace
f7b8113af1 Fixed spec, now requests json response 2017-02-12 20:36:24 +13:00
Brenda Wallace
b0394d1028 checks json returned by likes controller 2017-02-12 17:42:24 +13:00
Brenda Wallace
fa0c00aa9c Named arg (liked_by_member) fixed
cos i was writing python when this is meant to be ruby
2017-02-12 17:37:32 +13:00
Brenda Wallace
a507eb47bf Removed trailing white space 2017-02-12 17:26:34 +13:00
Brenda Wallace
865f323f97 controller specs for likes controller 2017-02-12 15:35:15 +13:00
Brenda Wallace
c82f47bdda Pass the ID from link to likesdestroy 2017-02-12 15:34:28 +13:00
Brenda Wallace
72d0514e75 Further checks in likes controller 2017-02-12 15:33:54 +13:00
Brenda Wallace
dc62365c7d DRY likes controller further 2017-02-12 15:23:58 +13:00
Brenda Wallace
d8d94d178c Moved some of likes#destroy out to new methods 2017-02-12 15:23:58 +13:00
Brenda Wallace
6afb12c157 Split up big methods in like controller 2017-02-12 15:23:58 +13:00
Brenda Wallace
a0be52fdaa likes doesn't have an index 2017-02-12 15:23:58 +13:00
Brenda Wallace
6b8474e01b Checks for cancan ability before allowing like 2017-02-12 15:23:58 +13:00
Shiny
23ae7fcd8c Merge branch 'dev' into time-zones 2017-02-12 12:14:01 +13:00
Shiny
179cfbf6bc Merge branch 'dev' into bw/planting_slug 2017-02-12 12:13:37 +13:00
Mackenzie
b5f82a8fc8 Merge pull request #1202 from Br3nda/code-climate-knows
Simplified alternate names controller.
2017-02-11 11:06:30 -05:00
Brenda Wallace
54c01cbd82 Removing alternate names from rubocop todo 2017-02-11 19:48:16 +13:00
Brenda Wallace
cf9e5a6652 Adding alternate names to admin menu 2017-02-11 19:45:53 +13:00
Brenda Wallace
01c6a6da9f improvements to alternate names controller 2017-02-11 19:45:33 +13:00
Shiny
cc1daf8f6b Join slug with - 2017-02-10 23:54:16 +13:00
Shiny
a0bf815663 Downcase planting slug 2017-02-10 23:52:10 +13:00
Brenda Wallace
ce573c1e55 Simplified logic in planting.planting_slug 2017-02-10 22:41:28 +13:00
Brenda Wallace
be2426c99f Use timezone when creating dates 2017-02-10 21:53:18 +13:00
Miles Gould
d301f2f2ae Add static check for files with merge conflicts
Fixes #1146
2017-02-07 15:03:52 +00:00
Miles Gould
2accb727e5 Describe rake static 2017-02-07 14:38:04 +00:00
Miles Gould
16db285898 Only run ES tests under GROWSTUFF_ELASTICSEARCH
And vice-versa: only run non-ElasticSearch tests under
GROWSTUFF_ELASTICSEARCH=false
2017-02-07 14:27:14 +00:00
Miles Gould
b8c0882642 Tag ElasticSearch-related tests 2017-02-07 14:27:14 +00:00
Miles Gould
cc54dc54b4 Only build ElasticSearch index for ES tests 2017-02-07 14:27:14 +00:00
Miles Gould
3f8ebdc477 Run JavaScript unit tests from Travis
`rspec spec` doesn't run the Jasmine tests, annoyingly, so I've added a
call to `rake jasmine:ci`.
2017-02-07 14:27:14 +00:00
Miles Gould
68120c5bbe Make rake spec depend on rake assets:precompile 2017-02-07 14:27:14 +00:00
Miles Gould
71ec9fd2d3 Run JS tests from rake and rake spec:unit 2017-02-07 14:27:14 +00:00
Miles Gould
f11bc42507 Turn on asset compilation in test
This is required for running jasmine tests via `rake spec:javascript`.
The comment above this setting warned that it would slow down testing
considerably; in my quick tests the slowdown is only about 2% (3mins 14
vs 3mins 11). We precompile assets in Travis, so this *shouldn't* cause
any more random CI failures...
2017-02-07 14:27:14 +00:00
Miles Gould
7672b9ffc8 Add spec:unit Rake task 2017-02-07 14:27:14 +00:00
Miles Gould
8d237cc2ee Make rake run specs and static checks by default 2017-02-07 14:27:14 +00:00
Miles Gould
a875a7c883 Cache asset-pipeline cache in Travis
This should shave about 30s off each job.
2017-02-07 14:27:14 +00:00
Miles Gould
19d65587be Split static checks into a separate Travis job 2017-02-07 14:27:14 +00:00
Miles Gould
3fed962dcc Add script/check_static to run all static checks
...and invoke it from .travis.yml
2017-02-07 14:27:14 +00:00
Miles Gould
987f50c87e Factor out global env vars in .travis.yml
This should make it slightly more obvious which job is which when
looking at Travis build results.
2017-02-07 13:52:23 +00:00
211 changed files with 1935 additions and 1997 deletions

View File

@@ -20,8 +20,8 @@ engines:
- ruby
- javascript
exclude_fingerprints:
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
fixme:
enabled: true
exclude_fingerprints: # rubocop_todo filename

4
.gitignore vendored
View File

@@ -14,4 +14,6 @@ Pathogen:
custom_plan.rb
zeus.json
.bundle
.idea/**
.idea/**
public/**
node_modules

View File

@@ -1,4 +1,9 @@
linters:
LineLength:
max: 120
InstanceVariables:
enabled: false
IdNames:
enabled: false
ConsecutiveComments:
enabled: false

3
.mention-bot Normal file
View File

@@ -0,0 +1,3 @@
{
"userBlacklist": ["tygriffin","oshiho3"]
}

104
.overcommit.yml Normal file
View File

@@ -0,0 +1,104 @@
---
# Use this file to configure the Overcommit hooks you wish to use. This will
# extend the default configuration defined in:
# https://github.com/brigade/overcommit/blob/master/config/default.yml
#
# At the topmost level of this YAML file is a key representing type of hook
# being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
# customize each hook, such as whether to only run it on certain files (via
# `include`), whether to only display output if it fails (via `quiet`), etc.
#
# For a complete list of hooks, see:
# https://github.com/brigade/overcommit/tree/master/lib/overcommit/hook
#
# For a complete list of options that you can use to customize hooks, see:
# https://github.com/brigade/overcommit#configuration
#
# Uncomment the following lines to make the configuration take effect.
PreCommit:
ALL:
quiet: false
problem_on_unmodified_line: warn
RuboCop:
enabled: true
command: ['bundle', 'exec', 'rubocop', '-D', '--rails']
TrailingWhitespace:
enabled: true
exclude:
- '**/db/structure.sql' # Ignore trailing whitespace in generated files
CoffeeLint:
enabled: true
on_fail: warn
command: ['npm', 'run', 'coffeelint']
HardTabs:
enabled: true
AuthorEmail:
enabled: false
AuthorName:
enabled: false
CssLint:
enabled: true
exclude:
- '**/bootstrap.min.css'
command: ['npm', 'run', 'csslint']
HamlLint:
enabled: true
requires_files: true
on_warn: fail
command: ['bundle', 'exec', 'haml-lint', 'app/views']
JsonSyntax:
enabled: true
BundleOutdated:
enabled: true
on_warn: warn
BundleAudit:
enabled: true
on_warn: warn
JsHint:
enabled: true
exclude:
- 'app/assets/**'
- 'spec/javascripts/support/vendor/**'
- '**/bootstrap*'
command: ['npm', 'run', 'jshint']
ScssLint:
enabled: true
RailsSchemaUpToDate:
enabled: true
MergeConflicts:
enabled: true
YamlLint:
enabled: true
PostCommit:
GitGuilt:
enabled: true
command: ['npm', 'run', 'git-guilt']
PostCheckout:
ALL:
quiet: false
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
PostMerge:
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
# PrePush:
# ALL:
# on_warn: fail # Treat all warnings as failures
# quiet: false
# # Brakeman:
# # enabled: true
# RSpec:
# enabled: true
# command: ['bundle', 'exec', 'rspec', '--fail-fast']
#
# IndexTags:
# enabled: true # Generate a tags file with `ctags` each time HEAD changes

View File

@@ -27,38 +27,9 @@ Style/MultilineMethodCallIndentation:
Style/AlignParameters:
EnforcedStyle: with_fixed_indentation
Metrics/MethodLength:
Description: 'Avoid methods longer than 30 lines of code.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
# Set to 30 once all methods are fixed.
# Max: 30
Max: 104
# Remove the following once the code style matches
# Offense count: 59
Metrics/AbcSize:
Max: 32
# Offense count: 5
# Configuration parameters: CountComments.
Metrics/BlockLength:
Max: 62
# Offense count: 6
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 269
# Offense count: 6
Metrics/CyclomaticComplexity:
Max: 11
Metrics/LineLength:
Max: 120
# Offense count: 8
Metrics/PerceivedComplexity:
Max: 9
# See https://github.com/bbatsov/rubocop/issues/3629
Rails/HttpPositionalArguments:
@@ -76,3 +47,21 @@ Rails/Output:
Exclude:
- 'config/unicorn.rb'
- 'db/seeds.rb'
Metrics/BlockLength:
Exclude:
- 'spec/**/*'
- '**/*.rake'
- 'config/**/*.rb'
# Remove the following once the code style matches
Metrics/MethodLength:
Max: 34
Metrics/AbcSize:
Max: 32
Metrics/ClassLength:
Max: 207
Metrics/CyclomaticComplexity:
Max: 11
Metrics/PerceivedComplexity:
Max: 9

View File

@@ -1,12 +1,11 @@
# This configuration was generated by
# `rubocop --auto-gen-config --exclude-limit 500`
# on 2017-01-21 15:58:02 +1030 using RuboCop version 0.47.1.
# `rubocop --auto-gen-config --no-offense-counts`
# on 2017-03-01 11:18:11 +1300 using RuboCop version 0.47.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 22
Lint/AmbiguousRegexpLiteral:
Exclude:
- 'spec/controllers/admin/orders_controller_spec.rb'
@@ -19,12 +18,10 @@ Lint/AmbiguousRegexpLiteral:
- 'spec/views/members/show.rss.haml_spec.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
# Offense count: 1
Lint/HandleExceptions:
Exclude:
- 'lib/tasks/testing.rake'
# Offense count: 11
# Cop supports --auto-correct.
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
Lint/UnusedBlockArgument:
@@ -34,7 +31,6 @@ Lint/UnusedBlockArgument:
- 'config/unicorn.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
Lint/UnusedMethodArgument:
@@ -45,67 +41,36 @@ Lint/UnusedMethodArgument:
- 'app/validators/approved_validator.rb'
- 'spec/views/plantings/show.html.haml_spec.rb'
# Offense count: 5
Lint/Void:
Exclude:
- 'spec/models/crop_spec.rb'
- 'spec/models/garden_spec.rb'
- 'spec/models/post_spec.rb'
# Offense count: 55
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Exclude:
- '**/*'
# Offense count: 2
# Cop supports --auto-correct.
Performance/StringReplacement:
Exclude:
- 'app/models/planting.rb'
- 'spec/rails_helper.rb'
# Offense count: 9
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: strict, flexible
Rails/Date:
Exclude:
- 'app/controllers/harvests_controller.rb'
- 'db/seeds.rb'
- 'lib/tasks/growstuff.rake'
- 'spec/controllers/plantings_controller_spec.rb'
- 'spec/factories/planting.rb'
- 'spec/features/plantings/planting_a_crop_spec.rb'
- 'spec/features/shared_examples/append_date.rb'
# Offense count: 4
Rails/FilePath:
Exclude:
- 'spec/rails_helper.rb'
# Offense count: 3
Rails/OutputSafety:
Exclude:
- 'app/helpers/application_helper.rb'
- 'app/helpers/auto_suggest_helper.rb'
- 'app/helpers/gardens_helper.rb'
# Offense count: 1
# Configuration parameters: Include.
# Include: db/migrate/*.rb
Rails/ReversibleMigration:
Exclude:
- 'db/migrate/20130215131921_rename_notification_fields.rb'
# Offense count: 4
# Configuration parameters: Blacklist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
# Blacklist: decrement!, decrement_counter, increment!, increment_counter
# toggle!, touch, update_all, update_attribute, update_column, update_columns,
# update_counters
Rails/SkipsModelValidations:
Exclude:
- 'app/controllers/plantings_controller.rb'
- 'db/seeds.rb'
# Offense count: 7
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: strict, flexible
Rails/TimeZone:
@@ -116,7 +81,6 @@ Rails/TimeZone:
- 'spec/models/post_spec.rb'
- 'spec/views/plantings/index.html.haml_spec.rb'
# Offense count: 7
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: always, conditionals
@@ -125,12 +89,10 @@ Style/AndOr:
- 'config/unicorn.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 1
Style/AsciiComments:
Exclude:
- 'config/initializers/comfortable_mexican_sofa.rb'
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: percent_q, bare_percent
@@ -139,7 +101,6 @@ Style/BarePercentLiterals:
- 'app/helpers/auto_suggest_helper.rb'
- 'spec/support/feature_helpers.rb'
# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
# SupportedStyles: line_count_based, semantic, braces_for_chaining
@@ -148,11 +109,6 @@ Style/BarePercentLiterals:
# IgnoredMethods: lambda, proc, it
Style/BlockDelimiters:
Exclude:
- 'app/controllers/alternate_names_controller.rb'
- 'app/controllers/members_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'app/controllers/scientific_names_controller.rb'
- 'spec/controllers/harvests_controller_spec.rb'
- 'spec/controllers/order_items_controller_spec.rb'
- 'spec/features/notifications_spec.rb'
- 'spec/models/ability_spec.rb'
@@ -163,17 +119,13 @@ Style/BlockDelimiters:
- 'spec/models/post_spec.rb'
- 'spec/views/crops/edit.html.haml_spec.rb'
# Offense count: 8
# Cop supports --auto-correct.
Style/BlockEndNewline:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
# Offense count: 4
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: nested, compact
Style/ClassAndModuleChildren:
@@ -183,20 +135,17 @@ Style/ClassAndModuleChildren:
- 'lib/haml/filters/escaped_markdown.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/ClassMethods:
Exclude:
- 'app/models/planting.rb'
# Offense count: 2
# Cop supports --auto-correct.
Style/ColonMethodCall:
Exclude:
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: Keywords.
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
@@ -204,29 +153,18 @@ Style/CommentAnnotation:
Exclude:
- 'app/controllers/crops_controller.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/DefWithParentheses:
Exclude:
- 'spec/views/posts/_single.html.haml_spec.rb'
# Offense count: 10
# Cop supports --auto-correct.
Style/EachForSimpleLoop:
Exclude:
- 'spec/models/crop_spec.rb'
- 'spec/views/home/_crops.html.haml_spec.rb'
# Offense count: 11
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: compact, expanded
Style/EmptyMethod:
Exclude:
- 'app/controllers/account_types_controller.rb'
- 'app/controllers/accounts_controller.rb'
- 'app/controllers/alternate_names_controller.rb'
- 'app/controllers/gardens_controller.rb'
- 'app/controllers/photos_controller.rb'
- 'app/controllers/plant_parts_controller.rb'
- 'app/controllers/posts_controller.rb'
@@ -235,7 +173,6 @@ Style/EmptyMethod:
- 'app/controllers/scientific_names_controller.rb'
- 'app/controllers/seeds_controller.rb'
# Offense count: 5
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: format, sprintf, percent
Style/FormatString:
@@ -244,12 +181,10 @@ Style/FormatString:
- 'spec/helpers/application_helper_spec.rb'
- 'spec/views/shop/index_spec.rb'
# Offense count: 2
Style/IdenticalConditionalBranches:
Exclude:
- 'app/controllers/follows_controller.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
@@ -260,7 +195,6 @@ Style/IfUnlessModifier:
- 'config/initializers/geocoder.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 7
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: line_count_dependent, lambda, literal
@@ -269,118 +203,35 @@ Style/Lambda:
- 'spec/controllers/member_controller_spec.rb'
- 'spec/models/photo_spec.rb'
# Offense count: 2
# Cop supports --auto-correct.
Style/MethodCallWithoutArgsParentheses:
Exclude:
- 'spec/helpers/application_helper_spec.rb'
- 'spec/views/plantings/new.html.haml_spec.rb'
# Offense count: 8
# Cop supports --auto-correct.
Style/MultilineBlockLayout:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: symmetrical, new_line, same_line
Style/MultilineHashBraceLayout:
Exclude:
- 'app/models/planting.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/MultilineIfModifier:
Exclude:
- 'spec/rails_helper.rb'
# Offense count: 5
# Cop supports --auto-correct.
Style/MultilineIfThen:
Exclude:
- 'script/check_contributors_md'
- 'script/gemfile_check'
# Offense count: 95
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: symmetrical, new_line, same_line
Style/MultilineMethodCallBraceLayout:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/seeds_controller.rb'
- 'spec/controllers/order_items_controller_spec.rb'
- 'spec/helpers/gardens_helper_spec.rb'
- 'spec/helpers/harvests_helper_spec.rb'
- 'spec/helpers/plantings_helper_spec.rb'
- 'spec/helpers/seeds_helper_spec.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/crop_spec.rb'
- 'spec/models/harvest_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/order_spec.rb'
- 'spec/models/plant_part_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/models/post_spec.rb'
- 'spec/views/account_types/edit.html.haml_spec.rb'
- 'spec/views/account_types/new.html.haml_spec.rb'
- 'spec/views/account_types/show.html.haml_spec.rb'
- 'spec/views/crops/_grown_for.html.haml_spec.rb'
- 'spec/views/crops/_planting_advice.html.haml_spec.rb'
- 'spec/views/forums/edit.html.haml_spec.rb'
- 'spec/views/harvests/index.html.haml_spec.rb'
- 'spec/views/orders/show.html.haml_spec.rb'
- 'spec/views/photos/edit.html.haml_spec.rb'
- 'spec/views/plant_parts/edit.html.haml_spec.rb'
- 'spec/views/plant_parts/new.html.haml_spec.rb'
- 'spec/views/plantings/_form.html.haml_spec.rb'
- 'spec/views/plantings/edit.html.haml_spec.rb'
- 'spec/views/plantings/index.html.haml_spec.rb'
- 'spec/views/plantings/new.html.haml_spec.rb'
- 'spec/views/plantings/show.html.haml_spec.rb'
- 'spec/views/posts/edit.html.haml_spec.rb'
- 'spec/views/products/edit.html.haml_spec.rb'
- 'spec/views/products/new.html.haml_spec.rb'
- 'spec/views/roles/edit.html.haml_spec.rb'
- 'spec/views/roles/index.html.haml_spec.rb'
- 'spec/views/roles/new.html.haml_spec.rb'
- 'spec/views/roles/show.html.haml_spec.rb'
- 'spec/views/scientific_names/edit.html.haml_spec.rb'
- 'spec/views/scientific_names/show.html.haml_spec.rb'
# Offense count: 2
Style/MultilineTernaryOperator:
Exclude:
- 'app/controllers/notifications_controller.rb'
- 'app/controllers/order_items_controller.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/MutableConstant:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/models/planting.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/NegatedIf:
Exclude:
- 'app/helpers/crops_helper.rb'
# Offense count: 2
Style/NestedTernaryOperator:
Exclude:
- 'app/controllers/harvests_controller.rb'
- 'app/controllers/plantings_controller.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
@@ -388,26 +239,11 @@ Style/Next:
Exclude:
- 'lib/tasks/growstuff.rake'
# Offense count: 2
# Cop supports --auto-correct.
Style/NilComparison:
Exclude:
- 'lib/tasks/growstuff.rake'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedOctalStyle, SupportedOctalStyles.
# SupportedOctalStyles: zero_with_o, zero_only
Style/NumericLiteralPrefix:
Exclude:
- 'spec/views/plantings/_form.html.haml_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/NumericLiterals:
MinDigits: 9
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles.
# SupportedStyles: predicate, comparison
@@ -419,23 +255,11 @@ Style/NumericPredicate:
- 'lib/tasks/growstuff.rake'
- 'script/check_contributors_md'
# Offense count: 3
# Cop supports --auto-correct.
Style/ParallelAssignment:
Exclude:
- 'app/mailers/notifier.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: AllowSafeAssignment.
Style/ParenthesesAroundCondition:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/orders_controller.rb'
- 'app/helpers/crops_helper.rb'
- 'config/factory_girl.rb'
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
@@ -445,25 +269,11 @@ Style/PercentLiteralDelimiters:
- 'spec/features/signin_spec.rb'
- 'spec/features/signout_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/PerlBackrefs:
Exclude:
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/RedundantParentheses:
Exclude:
- 'app/helpers/plantings_helper.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/RedundantSelf:
Exclude:
- 'lib/geocodable.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
@@ -476,20 +286,12 @@ Style/RegexpLiteral:
- 'spec/views/posts/index.html.haml_spec.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/SelfAssignment:
Exclude:
- 'app/helpers/crops_helper.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles.
# SupportedStyles: use_perl_names, use_english_names
Style/SpecialGlobalVars:
EnforcedStyle: use_perl_names
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
# IgnoredMethods: respond_to, define_method
@@ -498,59 +300,11 @@ Style/SymbolProc:
- 'app/controllers/crops_controller.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowSafeAssignment.
# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex
Style/TernaryParentheses:
Exclude:
- 'app/helpers/plantings_helper.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInArguments:
Exclude:
- 'db/seeds.rb'
- 'lib/actions/oauth_signup_action.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInLiteral:
Exclude:
- 'config/environments/test.rb'
- 'spec/rails_helper.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/UnlessElse:
Exclude:
- 'app/controllers/omniauth_callbacks_controller.rb'
# Offense count: 12
# Cop supports --auto-correct.
Style/UnneededInterpolation:
Exclude:
- 'spec/features/crops/crop_wranglers_spec.rb'
- 'spec/features/following_spec.rb'
- 'spec/features/shared_examples/append_date.rb'
- 'spec/models/crop_spec.rb'
- 'spec/models/forum_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/plant_part_spec.rb'
- 'spec/views/layouts/_header_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/UnneededPercentQ:
Exclude:
- 'spec/support/feature_helpers.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, WordRegex.
# SupportedStyles: percent, brackets

View File

@@ -1 +1 @@
2.3.3
2.3.4

View File

@@ -4,35 +4,43 @@ cache:
bundler: true
directories:
- travis_phantomjs
- tmp/cache/assets/test/sprockets
env:
matrix:
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='false'
- GROWSTUFF_ELASTICSEARCH='true' RSPEC_TAG=elasticsearch STATIC_CHECKS=false
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch STATIC_CHECKS=false
- STATIC_CHECKS=true
global:
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.3.3
- 2.3.4
before_install:
- ./script/install_phantomjs;
- export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
- >
if [ $(phantomjs --version) != '2.1.1' ]; then
PHANTOM_URL=https://assets.membergetmember.co/software/phantomjs-2.1.1-linux-x86_64.tar.bz2;
rm -rf $PWD/travis_phantomjs;
mkdir -p $PWD/travis_phantomjs;
wget $PHANTOM_URL -O $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2;
tar -xvf $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs;
fi
- phantomjs --version
before_script:
- bundle exec rake db:create db:migrate db:test:prepare
- bundle exec rake assets:precompile
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/install_linters;
else
bundle exec rake assets:precompile;
fi
- set +e
script:
- bundle exec rubocop --display-cop-names --rails
- bundle exec haml-lint app/views/account_types app/views/admin app/views/alternate_names app/views/account_types app/views/comments app/views/crops app/views/forums app/views/gardens app/views/harvests app/views/notifier app/views/orders app/views/photos
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/check_static.rb
else
bundle exec rake db:migrate --trace;
bundle exec rspec --tag $RSPEC_TAG spec/;
bundle exec rake jasmine:ci;
fi;
- set +e
services:
- elasticsearch
before_deploy:
@@ -40,7 +48,7 @@ before_deploy:
deploy:
provider: heroku
api_key:
secure: WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg=
secure: "WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg="
on:
repo: Growstuff/growstuff
app:

View File

@@ -7,7 +7,32 @@ When you create a pull request, please include the following:
* Make sure you have automated tests for your work, where possible.
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
If you would like to discuss your work before submitting a pull request,
please join any of our [Discussion
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
our dev team will be happy to help you.
All pull requests should pass our automatic continuous integration and style
checks before being merged. You can run tests locally as follows:
- `rake spec` to run all Ruby tests
- `rake spec:models` to run Ruby model tests (or `rake spec:views` for view tests, etc)
- `rake static` to run all static checks (code style, unfixed Git conflicts, etc)
- `rake jasmine:ci` to run JavaScript unit tests in headless mode
- `rake jasmine` to start a server for running JavaScript unit tests in a
browser (eg for debugging). Point your browser at http://localhost:8888 to
run the tests.
- `rspec ./spec/path/to/my_spec.rb` to run all Ruby tests in the file `my_spec.rb`
- `rspec ./spec/path/to/my_spec.rb:45` to run the Ruby test starting on line 45 of
`my_spec.rb`. RSpec will output a list of command-lines in this form for all
failing tests so you can easily re-run particular ones.
- `rspec --only-failures` to re-run all Ruby tests that failed last time.
Growstuff runs several linters and checkers before a change is merged. These
run from overcommit. To automatically run the same linters yourself you can
install overcommit too.
- `./script/install_linters`
You can run `rake -T` to see a list of available Rake tasks. If you can't get
some tests to pass, please submit a pull request anyway - we'll be happy to
help you debug the failures.
If you would like to discuss an idea before submitting a pull request,
please open a [GitHub Issue](https://github.com/growstuff/growstuff/issues),
where our dev team will be happy to help you.

View File

@@ -76,3 +76,11 @@ submit the change with your pull request.
- Brenda Wallace / [br3nda](https://github.com/br3nda)
- Jim Stallings / [jestallin](https://github.com/jestallin)
- Alyssa Ransbury / [alran](https://github.com/alran)
- Thomas Countz / [thomascountz](https://github.com/thomascountz)
- Megan Talbot / [meganft](https://github.com/meganft)
- Arun Kumar / [arun1595](https://github.com/arun1595)
- Harry Brodsky / [hbrodsk1](https://github.com/hbrodsk1)
## Bots
- Security and Dependency Updates / [deppbot](https://github.com/deppbot)

26
Gemfile
View File

@@ -1,7 +1,7 @@
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '2.3.3'
ruby '2.3.4'
gem 'rails', '~> 4.2.7'
@@ -27,7 +27,7 @@ gem 'csv_shaper' # CSV export
gem 'figaro' # for handling config via ENV variables
gem 'gibbon', '~>1.2.0' # for Mailchimp newsletter subscriptions
gem 'leaflet-markercluster-rails'
gem 'leaflet-rails'
gem 'leaflet-rails', '~> 0.7.7' # Newer versions break tests - see https://travis-ci.org/CloCkWeRX/growstuff/builds/200984350
gem 'pg'
gem 'ruby-units' # for unit conversion
gem 'unicorn' # http server
@@ -35,10 +35,10 @@ gem 'unicorn' # http server
gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
gem 'kaminari' # pagination
gem 'kaminari', '~> 0.17.0' # pagination
gem 'active_utils'
gem 'activemerchant'
gem 'active_utils'
gem 'sidekiq'
# Markdown formatting for updates etc
@@ -63,13 +63,13 @@ gem 'geocoder'
gem 'bootstrap-datepicker-rails'
# For connecting to other services (eg Twitter)
gem 'omniauth'
gem 'omniauth', '~> 1.3'
gem 'omniauth-facebook'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-twitter'
gem 'omniauth-twitter', '~> 1.2'
# For charting data
gem 'd3-rails'
gem 'd3-rails', '~> 3.5' # 4.* produces Error: <spyOn> : could not find an object to spy upon for linear() - see https://travis-ci.org/Growstuff/growstuff/jobs/204461482
# client for Elasticsearch. Elasticsearch is a flexible
# and powerful, distributed, real-time search and analytics engine.
@@ -81,6 +81,7 @@ gem 'd3-rails'
gem "elasticsearch-api", "~> 2.0.0"
gem "elasticsearch-model"
gem "elasticsearch-rails"
gem "hashie", ">= 3.5.3"
gem 'rake', '>= 10.0.0'
@@ -111,6 +112,7 @@ end
group :development, :test do
gem "active_merchant-paypal-bogus-gateway"
gem 'bullet' # performance tuning by finding unnecesary queries
gem 'byebug' # debugging
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
@@ -119,17 +121,17 @@ group :development, :test do
gem 'database_cleaner', '~> 1.5.0'
gem 'factory_girl_rails' # for creating test data
gem 'haml-i18n-extractor'
gem 'haml_lint' # Checks haml files for goodness
gem 'haml-rails' # HTML templating language
gem 'haml_lint' # Checks haml files for goodness
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'jasmine' # javascript unit testing
gem 'poltergeist' # for headless JS testing
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework
gem 'rubocop', require: false
gem 'rainbow', '< 2.2.0' # See https://github.com/sickill/rainbow/issues/44
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework
gem 'rubocop', '<= 0.47.1', require: false # Pin to rubocop (0.47.1) as 0.48.0 is buggy
gem 'selenium-webdriver'
gem 'webrat' # provides HTML matchers for view tests
gem 'webrat' # provides HTML matchers for view tests
end
group :test do

View File

@@ -1,58 +1,58 @@
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
actionmailer (4.2.8)
actionpack (= 4.2.8)
actionview (= 4.2.8)
activejob (= 4.2.8)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.7.1)
actionview (= 4.2.7.1)
activesupport (= 4.2.7.1)
actionpack (4.2.8)
actionview (= 4.2.8)
activesupport (= 4.2.8)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.7.1)
activesupport (= 4.2.7.1)
actionview (4.2.8)
activesupport (= 4.2.8)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_link_to (1.0.3)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_link_to (1.0.4)
actionpack
addressable
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.2.3)
activesupport (>= 3.2, < 5.1.0)
active_utils (3.3.3)
activesupport (>= 3.2, < 5.2.0)
i18n
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
activejob (4.2.8)
activesupport (= 4.2.8)
globalid (>= 0.3.0)
activemerchant (1.61.0)
activemerchant (1.64.0)
activesupport (>= 3.2.14, < 5.1)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (4.2.7.1)
activesupport (= 4.2.7.1)
activemodel (4.2.8)
activesupport (= 4.2.8)
builder (~> 3.1)
activerecord (4.2.7.1)
activemodel (= 4.2.7.1)
activesupport (= 4.2.7.1)
activerecord (4.2.8)
activemodel (= 4.2.8)
activesupport (= 4.2.8)
arel (~> 6.0)
activesupport (4.2.7.1)
activesupport (4.2.8)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.0)
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
arel (6.0.4)
ast (2.3.0)
autoprefixer-rails (6.6.1)
autoprefixer-rails (6.7.7.2)
execjs
bcrypt (3.1.11)
better_errors (2.1.1)
@@ -62,7 +62,9 @@ GEM
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
bluecloth (2.2.0)
bonsai-elasticsearch-rails (0.0.4)
bonsai-elasticsearch-rails (0.2.0)
elasticsearch-model (~> 0)
elasticsearch-rails (~> 0)
bootstrap-datepicker-rails (1.6.4.1)
railties (>= 3.0)
bootstrap-kaminari-views (0.0.5)
@@ -71,11 +73,14 @@ GEM
bootstrap-sass (3.3.7)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.5.3)
bootstrap_form (2.6.0)
builder (3.2.3)
bullet (5.5.1)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.10.0)
byebug (9.0.6)
cancancan (1.15.0)
capybara (2.10.1)
cancancan (1.16.0)
capybara (2.13.0)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -88,14 +93,14 @@ GEM
capybara-screenshot (1.0.14)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
childprocess (0.6.3)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.1.0)
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
codeclimate-test-reporter (1.0.3)
simplecov
codeclimate-test-reporter (1.0.8)
simplecov (<= 0.13)
codemirror-rails (5.16.0)
railties (>= 3.0, < 6.0)
coderay (1.1.1)
@@ -121,7 +126,7 @@ GEM
rails (>= 4.0.0, < 5.1)
rails-i18n (>= 4.0.0)
sass-rails (>= 4.0.3)
concurrent-ruby (1.0.4)
concurrent-ruby (1.0.5)
connection_pool (2.2.1)
coveralls (0.8.19)
json (>= 1.8, < 3)
@@ -131,12 +136,12 @@ GEM
tins (~> 1.6)
csv_shaper (1.3.0)
activesupport (>= 3.0.0)
d3-rails (3.4.13)
d3-rails (3.5.17)
railties (>= 3.1)
dalli (2.7.6)
database_cleaner (1.5.3)
debug_inspector (0.0.2)
devise (4.2.0)
devise (4.2.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.1)
@@ -148,48 +153,48 @@ GEM
json
thread
thread_safe
elasticsearch (2.0.0)
elasticsearch-api (= 2.0.0)
elasticsearch-transport (= 2.0.0)
elasticsearch-api (2.0.0)
elasticsearch (2.0.2)
elasticsearch-api (= 2.0.2)
elasticsearch-transport (= 2.0.2)
elasticsearch-api (2.0.2)
multi_json
elasticsearch-model (0.1.9)
activesupport (> 3)
elasticsearch (> 0.4)
hashie
elasticsearch-rails (0.1.9)
elasticsearch-transport (2.0.0)
elasticsearch-transport (2.0.2)
faraday
multi_json
erubis (2.7.0)
excon (0.54.0)
excon (0.55.0)
execjs (2.7.0)
factory_girl (4.8.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
railties (>= 3.0.0)
faraday (0.9.2)
faraday (0.11.0)
multipart-post (>= 1.2, < 3)
ffi (1.9.17)
ffi (1.9.18)
figaro (1.1.1)
thor (~> 0.14)
flickraw (0.9.9)
font-awesome-sass (4.6.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
formatador (0.2.5)
friendly_id (5.0.5)
activerecord (>= 4.0.0)
geocoder (1.4.1)
geocoder (1.4.3)
gibbon (1.2.1)
httparty
multi_json (>= 1.9.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
globalid (0.4.0)
activesupport (>= 4.2.0)
gravatar-ultimate (2.0.0)
activesupport (>= 2.3.14)
rack
guard (2.14.0)
guard (2.14.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
lumberjack (~> 1.0)
@@ -217,25 +222,26 @@ GEM
haml (>= 4.0.6, < 5.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
haml_lint (0.20.0)
haml (~> 4.0)
haml_lint (0.24.0)
haml (>= 4.0, < 5.1)
rainbow
rake (>= 10, < 13)
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashie (3.4.6)
hashie (3.5.5)
heroku-api (0.4.2)
excon (~> 0.45)
multi_json (~> 1.8)
highline (1.7.8)
html2haml (2.0.0)
html2haml (2.1.0)
erubis (~> 2.7.0)
haml (~> 4.0.0)
nokogiri (~> 1.6.0)
haml (~> 4.0)
nokogiri (>= 1.6.0)
ruby_parser (~> 3.5)
httparty (0.14.0)
multi_xml (>= 0.5.2)
i18n (0.7.0)
i18n-tasks (0.9.9)
i18n (0.8.1)
i18n-tasks (0.9.12)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -245,27 +251,27 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jasmine (2.5.1)
jasmine (2.5.2)
jasmine-core (>= 2.5.1, < 3.0.0)
phantomjs
rack (>= 1.2.1)
rake
jasmine-core (2.5.2)
jquery-rails (4.2.2)
jquery-rails (4.3.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
js-routes (1.3.0)
js-routes (1.3.3)
railties (>= 3.2)
sprockets-rails
json (1.8.6)
json (2.0.4)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
kgio (2.11.0)
kramdown (1.13.2)
launchy (2.4.3)
addressable (~> 2.3)
@@ -295,22 +301,22 @@ GEM
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.17.1.326)
nokogiri (1.6.8.1)
newrelic_rpm (4.1.0.333)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth (0.5.1)
oauth2 (1.2.0)
faraday (>= 0.8, < 0.10)
oauth2 (1.3.1)
faraday (>= 0.8, < 0.12)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.3.2)
hashie (>= 1.2, < 4)
rack (>= 1.0, < 3)
omniauth (1.6.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
omniauth-oauth2 (~> 1.2)
omniauth-flickr (0.0.19)
@@ -322,9 +328,9 @@ GEM
omniauth-oauth2 (1.4.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-twitter (1.4.0)
omniauth-oauth (~> 1.1)
rack
orm_adapter (0.5.0)
paperclip (5.1.0)
activemodel (>= 4.2.0)
@@ -332,13 +338,13 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
parser (2.3.3.1)
parser (2.4.0.0)
ast (~> 2.2)
pg (0.19.0)
pg (0.20.0)
phantomjs (2.1.1.0)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.11.0)
poltergeist (1.14.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
@@ -355,16 +361,16 @@ GEM
rack
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.7.1)
actionmailer (= 4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
activemodel (= 4.2.7.1)
activerecord (= 4.2.7.1)
activesupport (= 4.2.7.1)
rails (4.2.8)
actionmailer (= 4.2.8)
actionpack (= 4.2.8)
actionview (= 4.2.8)
activejob (= 4.2.8)
activemodel (= 4.2.8)
activerecord (= 4.2.8)
activesupport (= 4.2.8)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.7.1)
railties (= 4.2.8)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
@@ -382,18 +388,18 @@ GEM
rails_stdout_logging
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (4.2.7.1)
actionpack (= 4.2.7.1)
activesupport (= 4.2.7.1)
railties (4.2.8)
actionpack (= 4.2.8)
activesupport (= 4.2.8)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.1.0)
raindrops (0.17.0)
raindrops (0.18.0)
rake (12.0.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.7)
rb-inotify (0.9.8)
ffi (>= 0.5.0)
redis (3.3.2)
redis (3.3.3)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec (3.5.0)
@@ -428,11 +434,11 @@ GEM
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
ruby-units (2.0.1)
ruby-units (2.1.0)
ruby_dep (1.5.0)
ruby_parser (3.8.4)
ruby_parser (3.9.0)
sexp_processor (~> 4.1)
rubyzip (1.2.0)
rubyzip (1.2.1)
sass (3.4.23)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
@@ -440,26 +446,22 @@ GEM
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
selenium-webdriver (3.0.5)
selenium-webdriver (3.3.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
sexp_processor (4.7.0)
sexp_processor (4.9.0)
shellany (0.0.1)
sidekiq (4.1.4)
sidekiq (4.2.10)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0)
redis (~> 3.2, >= 3.2.1)
sinatra (>= 1.4.7)
simplecov (0.12.0)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
slop (3.6.0)
sparkpost_rails (1.4.0)
rails (>= 4.0, < 5.1)
@@ -471,33 +473,34 @@ GEM
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sysexits (1.2.0)
term-ansicolor (1.4.0)
term-ansicolor (1.6.0)
tins (~> 1.0)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.13.0)
thread_safe (0.3.6)
tilt (2.0.7)
tins (1.13.2)
trollop (1.16.2)
tzinfo (1.2.2)
tzinfo (1.2.3)
thread_safe (~> 0.1)
uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode-display_width (1.1.3)
unicorn (5.1.0)
unicorn (5.3.0)
kgio (~> 2.6)
raindrops (~> 0.7)
warden (1.2.6)
uniform_notifier (1.10.0)
warden (1.2.7)
rack (>= 1.0)
webrat (0.7.3)
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
websocket (1.2.3)
websocket-driver (0.6.4)
websocket (1.2.4)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
will_paginate (3.1.5)
@@ -518,6 +521,7 @@ DEPENDENCIES
bootstrap-datepicker-rails
bootstrap-kaminari-views
bootstrap-sass (~> 3.3.6)
bullet
bundler (>= 1.1.5)
byebug
cancancan (~> 1.9)
@@ -529,7 +533,7 @@ DEPENDENCIES
comfortable_mexican_sofa (~> 1.12.0)
coveralls
csv_shaper
d3-rails
d3-rails (~> 3.5)
dalli
database_cleaner (~> 1.5.0)
devise (>= 4.0.0)
@@ -550,22 +554,23 @@ DEPENDENCIES
haml-i18n-extractor
haml-rails
haml_lint
hashie (>= 3.5.3)
heroku-api
i18n-tasks
jasmine
jquery-rails
jquery-ui-rails (~> 5.0.2)
js-routes
kaminari
kaminari (~> 0.17.0)
leaflet-markercluster-rails
leaflet-rails
leaflet-rails (~> 0.7.7)
letter_opener
memcachier
newrelic_rpm
omniauth
omniauth (~> 1.3)
omniauth-facebook
omniauth-flickr (>= 0.0.15)
omniauth-twitter
omniauth-twitter (~> 1.2)
pg
poltergeist
pry
@@ -576,7 +581,7 @@ DEPENDENCIES
rake (>= 10.0.0)
rspec-activemodel-mocks
rspec-rails
rubocop
rubocop (<= 0.47.1)
ruby-units
sass-rails (~> 5.0.4)
selenium-webdriver
@@ -588,7 +593,7 @@ DEPENDENCIES
will_paginate (~> 3.0)
RUBY VERSION
ruby 2.3.3p222
ruby 2.3.4p301
BUNDLED WITH
1.13.7
1.14.6

View File

@@ -1,6 +1,6 @@
# Growstuff
[![Build Status](https://travis-ci.org/Growstuff/growstuff.png)](https://travis-ci.org/Growstuff/growstuff)
[![Build Status](https://travis-ci.org/Growstuff/growstuff.svg?branch=dev)](https://travis-ci.org/Growstuff/growstuff)
[![Coverage Status](https://coveralls.io/repos/Growstuff/growstuff/badge.png)](https://coveralls.io/r/Growstuff/growstuff)
[![Code Climate](https://codeclimate.com/github/Growstuff/growstuff/badges/gpa.svg)](https://codeclimate.com/github/Growstuff/growstuff)
@@ -19,7 +19,6 @@ encourage participation from people of all backgrounds and skill levels.
* [Issues](http://github.com/Growstuff/growstuff/issues) (features we're
working on, known bugs, etc)
* [Discussion forums](http://talk.growstuff.org/) (design ideas, planning releases)
* [IRC](https://webchat.freenode.net/) growstuff channel (general chat, brainstorming and troubleshooting) or [Gitter](https://gitter.im/Growstuff/growstuff)
* [Wiki](https://github.com/Growstuff/growstuff/wiki) (general documentation, etc. Help by migrating from the [old wiki](https://web.archive.org/web/*/wiki.growstuff.org))
@@ -30,8 +29,7 @@ frontend features. We welcome contributions -- see
[CONTRIBUTING](CONTRIBUTING.md) for details.
* To set up your development environment, see [Getting started](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide).
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers. [Find a pair programming partner.](http://talk.growstuff.org/t/find-a-pair-programming-partner/13)
* Drop in to our [discussion forums](http://talk.growstuff.org/), IRC or Gitter to chat to other developers, get help, etc.
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers.
* You may also be interested in our [API](https://github.com/Growstuff/growstuff/wiki/API).
## For designers, writers, researchers, data wranglers, and other contributors
@@ -41,23 +39,23 @@ your skills and interests.
You might like to check out:
* The [Get Involved](http://wiki.growstuff.org/index.php/Get_involved)
* The [New Contributor Guide](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide)
page on our wiki, which has lots of detail for different areas
* [Growstuff Talk](http://talk.growstuff.org/) especially the [Idea category](http://talk.growstuff.org/c/idea)
Here on Github, you might find these useful:
* [Waffle](http://waffle.io/Growstuff/growstuff) has stories in "ready" that can be worked on.
* [needs: design](https://github.com/Growstuff/growstuff/labels/needs:%20design) - tasks requiring high-level design
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
* [curated:beginner](https://github.com/Growstuff/growstuff/labels/curated:%20beginner) - tasks that are ideal for beginner programmers or people new to the project
Feel free to comment on any of the issues you find there, or open up a broader conversation on [Growstuff Talk](http://talk.growstuff.org).
Feel free to comment on any of the issues on [Github](https://github.com/Growstuff/growstuff/issues).
## Contact
For more information about this project, contact [info@growstuff.org](mailto:info@growstuff.org).
You can also contact us on [Twitter](http://twitter.com/growstufforg/) or
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494).
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494) or [Github](https://github.com/Growstuff/growstuff/issues)..

View File

@@ -31,10 +31,10 @@ This file draws the labels to the left of each bar.
var barLabelTopEdge = 17;
return i * barHeight * (barLabelSpread) + barLabelTopEdge;
})
.text(function(d){return d});
.text(function(d){return d;});
};
growstuff.BarLabelGroup = BarLabelGroup;
}())
}());

View File

@@ -26,7 +26,7 @@ to the display size of the svg
WidthScale.prototype.getMaxValue = function(){
return d3.max(this._data.bars.map(function(bar) { return bar.value; }));
}
};
growstuff.WidthScale = WidthScale;

View File

@@ -11,7 +11,7 @@ $(document).ready(function () {
like_control.text("Unlike");
} else {
like_control.data("method", "post");
like_control.attr("href", '/likes.json?post_id=' + data.id);
like_control.attr("href", '/likes.json?post_id=' + data.id);
like_control.text("Like");
}
});

View File

@@ -21,10 +21,10 @@ $ ->
$('#remove-sci_name-row').click ->
if (sci_index > 2)
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
alt_template = "<div id='alt_template[INDEX]' class='template col-md-12'><div class='col-md-2'><label>Alternate name INDEX:</label></div><div class='col-md-8'><input name='alt_name[INDEX]' class='form-control', id='alt_name[INDEX]')'></input><span class='help-block'>Alternate name of crop.</span></div><div class='col-md-2'></div></div>"

View File

@@ -333,3 +333,6 @@ $state-success-bg: lighten($green, 50%)
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
ul.plantings
list-style-type: none

View File

@@ -1,67 +1,48 @@
class AccountTypesController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /account_types
def index
@account_types = AccountType.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@account_types)
end
# GET /account_types/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account_types)
end
# GET /account_types/new
def new
@account_type = AccountType.new
respond_to do |format|
format.html # new.html.erb
end
respond_with(@account_type)
end
# GET /account_types/1/edit
def edit
respond_with(@account_type)
end
# POST /account_types
def create
@account_type = AccountType.new(account_type_params)
respond_to do |format|
if @account_type.save
format.html { redirect_to @account_type, notice: I18n.t('account_types.created') }
else
format.html { render action: "new" }
end
end
flash[:notice] = I18n.t('account_types.created') if @account_type.save
respond_with(@account_type)
end
# PUT /account_types/1
def update
respond_to do |format|
if @account_type.update(account_type_params)
format.html { redirect_to @account_type, notice: I18n.t('account_types.updated') }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account_types.updated') if @account_type.update(account_type_params)
respond_with(@account_type)
end
# DELETE /account_types/1
def destroy
@account_type.destroy
respond_to do |format|
format.html { redirect_to account_types_url, notice: I18n.t('account_types.deleted') }
end
flash[:notice] = I18n.t('account_types.deleted')
respond_with(@account_type)
end
private

View File

@@ -1,21 +1,17 @@
class AccountsController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /accounts
def index
@accounts = Account.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@accounts)
end
# GET /accounts/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account)
end
# GET /accounts/1/edit
@@ -24,13 +20,8 @@ class AccountsController < ApplicationController
# PUT /accounts/1
def update
respond_to do |format|
if @account.update(params[:account])
format.html { redirect_to @account, notice: I18n.t('account.update') }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account.update') if @account.update(params[:account])
respond_with(@account)
end
private

View File

@@ -1,16 +1,13 @@
class AlternateNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
# GET /alternate_names
# GET /alternate_names.json
def index
@alternate_names = AlternateName.all
respond_to do |format|
format.html # index.html.haml
format.json { render json: @alternate_names }
end
respond_with(@alternate_names)
end
# GET /alternate_names/new
@@ -18,16 +15,10 @@ class AlternateNamesController < ApplicationController
def new
@alternate_name = AlternateName.new
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_to do |format|
format.html # new.html.haml
format.json { render json: @alternate_name }
end
end
# GET /alternate_names/1/edit
def edit
end
def edit; end
# POST /alternate_names
# POST /alternate_names.json
@@ -35,28 +26,20 @@ class AlternateNamesController < ApplicationController
params[:alternate_name][:creator_id] = current_member.id
@alternate_name = AlternateName.new(alternate_name_params)
respond_to do |format|
if @alternate_name.save
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.' }
format.json { render json: @alternate_name, status: :created, location: @alternate_name }
else
format.html { render action: "new" }
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
end
if @alternate_name.save
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully created.'
else
render action: "new"
end
end
# PUT /alternate_names/1
# PUT /alternate_names/1.json
def update
respond_to do |format|
if @alternate_name.update(alternate_name_params)
format.html { redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @alternate_name.errors, status: :unprocessable_entity }
end
if @alternate_name.update(alternate_name_params)
redirect_to @alternate_name.crop, notice: 'Alternate name was successfully updated.'
else
render action: "edit"
end
end
@@ -65,13 +48,7 @@ class AlternateNamesController < ApplicationController
def destroy
@crop = @alternate_name.crop
@alternate_name.destroy
respond_to do |format|
format.html {
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
}
format.json { head :no_content }
end
redirect_to @crop, notice: 'Alternate name was successfully deleted.'
end
private

View File

@@ -7,12 +7,12 @@ class ApplicationController < ActionController::Base
before_action :set_locale
def store_location
unless (request.path.in?(["/members/sign_in",
"/members/sign_up",
"/members/password/new",
"/members/password/edit",
"/members/confirmation",
"/members/sign_out"]) || request.xhr?)
unless request.path.in?(["/members/sign_in",
"/members/sign_up",
"/members/password/new",
"/members/password/edit",
"/members/confirmation",
"/members/sign_out"]) || request.xhr?
store_location_for(:member, request.fullpath)
end
end
@@ -59,8 +59,7 @@ class ApplicationController < ActionController::Base
# profile stuff
:bio, :location, :latitude, :longitude,
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder
)
:show_email, :newsletter, :send_notification_email, :send_planting_reminder)
end
devise_parameter_sanitizer.permit(:account_update) do |member|
@@ -73,8 +72,11 @@ class ApplicationController < ActionController::Base
# email settings
:show_email, :newsletter, :send_notification_email, :send_planting_reminder,
# update password
:current_password
)
:current_password)
end
end
def expire_homepage
expire_fragment("homepage_stats")
end
end

View File

@@ -18,7 +18,8 @@ class AuthenticationsController < ApplicationController
.find_or_create_by(
provider: auth['provider'],
uid: auth['uid'],
name: name)
name: name
)
flash[:notice] = "Authentication successful."
else
@@ -29,7 +30,6 @@ class AuthenticationsController < ApplicationController
# DELETE /authentications/1
def destroy
@authentication = Authentication.find(params[:id])
@authentication.destroy
respond_to do |format|

View File

@@ -1,17 +1,15 @@
class CommentsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: :index
# GET /comments
# GET /comments.json
# GET /comments.rss
def index
@comments = Comment.paginate(page: params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @comments }
format.rss { render layout: false }
end
respond_with(@comments)
end
# GET /comments/new
@@ -22,13 +20,10 @@ class CommentsController < ApplicationController
if @post
@comments = @post.comments
respond_to do |format|
format.html # new.html.erb
format.json { render json: @comment }
end
respond_with(@comment)
else
redirect_to request.referer || root_url,
alert: "Can't post a comment on a non-existent post"
redirect_to(request.referer || root_url,
alert: "Can't post a comment on a non-existent post")
end
end
@@ -40,37 +35,20 @@ class CommentsController < ApplicationController
# POST /comments
# POST /comments.json
def create
params[:comment][:author_id] = current_member.id
@comment = Comment.new(comment_params)
respond_to do |format|
if @comment.save
format.html { redirect_to @comment.post, notice: "Comment was successfully created." }
format.json { render json: @comment, status: :created, location: @comment }
else
format.html { render action: "new" }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
@comment.author = current_member
flash[:notice] = "Comment was successfully created." if @comment.save
respond_with(@comment.post)
end
# PUT /comments/1
# PUT /comments/1.json
def update
# you should never be able to change the author or post when
# updating
params[:comment].delete("post_id")
params[:comment].delete("author_id")
respond_to do |format|
if @comment.update(comment_params)
format.html { redirect_to @comment.post, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
# only body can be updated
if @comment.update(body: comment_params['body'])
flash[:notice] = 'Comment was successfully updated.'
end
respond_with(@comment.post)
end
# DELETE /comments/1
@@ -78,16 +56,12 @@ class CommentsController < ApplicationController
def destroy
@post = @comment.post
@comment.destroy
respond_to do |format|
format.html { redirect_to @post }
format.json { head :no_content }
end
respond_with(@post)
end
private
def comment_params
params.require(:comment).permit(:author_id, :body, :post_id)
params.require(:comment).permit(:body, :post_id)
end
end

View File

@@ -1,86 +1,51 @@
class ForumsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
# GET /forums
# GET /forums.json
def index
@forums = Forum.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @forums }
end
respond_with(@forums)
end
# GET /forums/1
# GET /forums/1.json
def show
@forum = Forum.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @forum }
end
respond_with(@forum)
end
# GET /forums/new
# GET /forums/new.json
def new
@forum = Forum.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @forum }
end
respond_with(@forum)
end
# GET /forums/1/edit
def edit
@forum = Forum.find(params[:id])
end
def edit; end
# POST /forums
# POST /forums.json
def create
@forum = Forum.new(forum_params)
respond_to do |format|
if @forum.save
format.html { redirect_to @forum, notice: 'Forum was successfully created.' }
format.json { render json: @forum, status: :created, location: @forum }
else
format.html { render action: "new" }
format.json { render json: @forum.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Forum was successfully created.' if @forum.save
respond_with(@forum)
end
# PUT /forums/1
# PUT /forums/1.json
def update
@forum = Forum.find(params[:id])
respond_to do |format|
if @forum.update(forum_params)
format.html { redirect_to @forum, notice: 'Forum was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @forum.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Forum was successfully updated.' if @forum.update(forum_params)
respond_with(@forum)
end
# DELETE /forums/1
# DELETE /forums/1.json
def destroy
@forum = Forum.find(params[:id])
@forum.destroy
respond_to do |format|
format.html { redirect_to forums_url, notice: 'Forum was successfully deleted' }
format.json { head :no_content }
end
flash[:notice] = 'Forum was successfully deleted'
redirect_to forums_url
end
private

View File

@@ -1,6 +1,8 @@
class GardensController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
# GET /gardens
# GET /gardens.json
@@ -9,93 +11,58 @@ class GardensController < ApplicationController
@show_all = params[:all] == '1'
@gardens = gardens
respond_to do |format|
format.html # index.html.erb
format.json { render json: @gardens }
end
respond_with(@gardens)
end
# GET /gardens/1
# GET /gardens/1.json
def show
respond_to do |format|
format.html # show.html.erb
format.json { render json: @garden }
end
respond_with(@garden)
end
# GET /gardens/new
# GET /gardens/new.json
def new
@garden = Garden.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @garden }
end
respond_with(@garden)
end
# GET /gardens/1/edit
def edit
end
def edit; end
# POST /gardens
# POST /gardens.json
def create
@garden.owner_id = current_member.id
respond_to do |format|
if @garden.save
format.html { redirect_to @garden, notice: I18n.t('gardens.created') }
format.json { render json: @garden, status: :created, location: @garden }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('gardens.created') if @garden.save
respond_with(@garden)
end
# PUT /gardens/1
# PUT /gardens/1.json
def update
respond_to do |format|
if @garden.update(garden_params)
format.html { redirect_to @garden, notice: I18n.t('gardens.updated') }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('gardens.updated') if @garden.update(garden_params)
respond_with(@garden)
end
# DELETE /gardens/1
# DELETE /gardens/1.json
def destroy
@garden.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html do
redirect_to gardens_by_owner_path(owner: @garden.owner), notice: I18n.t('gardens.deleted')
end
format.json { head :no_content }
end
flash[:notice] = I18n.t('gardens.deleted')
redirect_to(gardens_by_owner_path(owner: @garden.owner))
end
private
def garden_params
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
params.require(:garden).permit(:name, :slug, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
end
def gardens
g = @owner ? @owner.gardens : Garden.all
g = g.active unless @show_all
g = g.includes(:owner).order(:name)
g = g.paginate(page: params[:page])
g
g.includes(:owner).order(:updated_at).paginate(page: params[:page])
end
end

View File

@@ -1,48 +1,36 @@
class HarvestsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
# GET /harvests
# GET /harvests.json
def index
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@harvests = if @owner
@owner.harvests.includes(:owner, :crop)
elsif @crop
@crop.harvests.includes(:owner, :crop)
else
Harvest.includes(:owner, :crop)
end
@planting = Planting.find_by(slug: params['planting_id'])
respond_to do |format|
format.html { @harvests = @harvests.paginate(page: params[:page]) }
format.json { render json: @harvests }
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
render csv: @harvests
end
end
@harvests = harvests
@filename = csv_filename
respond_with(@harvests)
end
# GET /harvests/1
# GET /harvests/1.json
def show
@planting = @harvest.planting if @harvest.planting_id
@matching_plantings = matching_plantings if @harvest.owner == current_member
respond_with(@harvest)
end
# GET /harvests/new
# GET /harvests/new.json
def new
@harvest = Harvest.new('harvested_at' => Date.today)
@harvest = Harvest.new(harvested_at: Time.zone.today)
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_to do |format|
format.html # new.html.erb
format.json { render json: @harvest }
end
@crop = Crop.find_by(id: params[:crop_id])
respond_with(@harvest)
end
# GET /harvests/1/edit
@@ -54,41 +42,22 @@ class HarvestsController < ApplicationController
# POST /harvests.json
def create
@harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
respond_to do |format|
if @harvest.save
format.html { redirect_to @harvest, notice: I18n.t('harvests.created') }
format.json { render json: @harvest, status: :created, location: @harvest }
else
format.html { render action: "new" }
format.json { render json: @harvest.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('harvests.created') if @harvest.save
respond_with(@harvest)
end
# PUT /harvests/1
# PUT /harvests/1.json
def update
respond_to do |format|
if @harvest.update(harvest_params)
format.html { redirect_to @harvest, notice: I18n.t('harvests.updated') }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @harvest.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('harvests.updated') if @harvest.update(harvest_params)
respond_with(@harvest)
end
# DELETE /harvests/1
# DELETE /harvests/1.json
def destroy
@harvest.destroy
respond_to do |format|
format.html { redirect_to harvests_url }
format.json { head :no_content }
end
respond_with(@harvest)
end
private
@@ -100,4 +69,31 @@ class HarvestsController < ApplicationController
:plant_part_id, :slug, :si_weight)
.merge(owner_id: current_member.id)
end
def matching_plantings
Planting.where(crop: @harvest.crop, owner: @harvest.owner)
.where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
.where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
end
def harvests
if @owner
@owner.harvests
elsif @crop
@crop.harvests
elsif @planting_id
@planting.harvests
else
Harvest
end.includes(:owner, :crop).paginate(page: params[:page])
end
def csv_filename
specifics = if @owner
"#{@owner.login_name}-"
elsif @crop
"#{@crop.name}-"
end
"Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
end
end

View File

@@ -1,71 +1,57 @@
class LikesController < ApplicationController
before_action :authenticate_member!, except: :index
before_action :authenticate_member!
respond_to :html, :json
def create
@like = Like.new
@like.member = current_member
@like.likeable = find_likeable
@like = Like.new(member: current_member, likeable: find_likeable)
return failed(@like, message: 'Unable to like') unless @like.likeable && @like.save
respond_to do |format|
if @like.save
format.html { redirect_to @like.likeable }
format.json do
render(
json: {
id: @like.likeable.id,
liked_by_member: true,
description: ActionController::Base.helpers.pluralize(@like.likeable.likes.count, "like"),
url: like_path(@like, format: :json)
},
status: 201
)
end
else
format.html do
flash[:error] = 'Unable to like'
redirect_to @like.likeable
end
end
end
success(@like, liked_by_member: true, status_code: :created)
end
def destroy
like = Like.find(params[:id])
likeable = like.likeable
respond_to do |format|
if like.destroy
format.html { redirect_to likeable }
format.json do
render(
json: {
id: likeable.id,
liked_by_member: false,
description: ActionController::Base.helpers.pluralize(likeable.likes.count, "like"),
url: likes_path(Like.new, "#{likeable.class.name.underscore}_id", likeable.id, format: :json)
},
status: 200
)
end
else
format.html do
flash[:error] = 'Unable to unlike'
redirect_to likeable
end
end
end
@like = Like.find_by(id: params[:id], member: current_member)
return failed(@like, message: 'Unable to unlike') unless @like && @like.destroy
success(@like, liked_by_member: false, status_code: :ok)
end
private
def find_likeable
params.each do |name, value|
return Regexp.last_match[1].classify.constantize.find(value) if name =~ /(.+)_id$/
Post.find(params[:post_id]) if params[:post_id]
end
def render_json(like, liked_by_member: true)
{
id: like.likeable.id,
liked_by_member: liked_by_member,
description: ActionController::Base.helpers.pluralize(like.likeable.likes.count, "like"),
url: like_path(like, format: :json)
}
end
def success(like, liked_by_member: nil, status_code: nil)
respond_to do |format|
format.html { redirect_to like.likeable }
format.json do
render(json: render_json(like, liked_by_member: liked_by_member),
status: status_code)
end
end
end
def like_params
params.require(:like).permit(:member, :likeable)
def failed(like, message)
respond_to do |format|
format.json { render(json: { 'error': message }, status: :forbidden) }
format.html do
flash[:error] = message
if like && like.likeable
redirect_to like.likeable
else
redirect_to root_path
end
end
end
end
end

View File

@@ -14,13 +14,13 @@ class MembersController < ApplicationController
respond_to do |format|
format.html # index.html.haml
format.json {
format.json do
render json: @members.to_json(only: [
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
])
}
end
end
end
@@ -38,17 +38,19 @@ class MembersController < ApplicationController
respond_to do |format|
format.html # show.html.haml
format.json {
format.json do
render json: @member.to_json(only: [
:id, :login_name, :bio,
:created_at, :slug, :location,
:latitude, :longitude
])
}
format.rss { render(
layout: false,
locals: { member: @member }
)}
end
format.rss do
render(
layout: false,
locals: { member: @member }
)
end
end
end
@@ -65,7 +67,7 @@ class MembersController < ApplicationController
EMAIL_TYPE_STRING = {
send_notification_email: "direct message notifications",
send_planting_reminder: "planting reminders"
}
}.freeze
def unsubscribe
verifier = ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])

View File

@@ -2,14 +2,11 @@ class NotificationsController < ApplicationController
include NotificationsHelper
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /notifications
def index
@notifications = Notification.by_recipient(current_member).page(params[:page])
respond_to do |format|
format.html # index.html.erb
end
end
# GET /notifications/1
@@ -17,10 +14,6 @@ class NotificationsController < ApplicationController
@notification.read = true
@notification.save
@reply_link = reply_link(@notification)
respond_to do |format|
format.html # show.html.erb
end
end
# GET /notifications/new
@@ -29,35 +22,24 @@ class NotificationsController < ApplicationController
@notification = Notification.new
@recipient = Member.find_by(id: params[:recipient_id])
@subject = params[:subject] || ""
respond_to do |format|
format.html # new.html.erb
end
end
# GET /notifications/1/reply
def reply
@notification = Notification.new
@sender_notification = Notification.find(params[:id])
@sender_notification = Notification.find_by(id: params[:id], recipient: current_member)
@sender_notification.read = true
@sender_notification.save
@recipient = @sender_notification.sender
@subject = @sender_notification.subject =~ /^Re: / ?
@sender_notification.subject :
"Re: " + @sender_notification.subject
respond_to do |format|
format.html # reply.html.haml
end
end
# DELETE /notifications/1
def destroy
@notification.destroy
respond_to do |format|
format.html { redirect_to notifications_url }
end
redirect_to notifications_url
end
# POST /notifications
@@ -66,12 +48,10 @@ class NotificationsController < ApplicationController
@notification = Notification.new(notification_params)
@recipient = Member.find_by(id: params[:notification][:recipient_id])
respond_to do |format|
if @notification.save
format.html { redirect_to notifications_path, notice: 'Message was successfully sent.' }
else
format.html { render action: "new" }
end
if @notification.save
redirect_to notifications_path, notice: 'Message was successfully sent.'
else
render action: "new"
end
end

View File

@@ -48,7 +48,7 @@ class OrdersController < ApplicationController
end
def complete
if (params[:token] && params['PayerID'])
if params[:token] && params['PayerID']
purchase = EXPRESS_GATEWAY.purchase(
@order.total,
currency: Growstuff::Application.config.currency,

View File

@@ -0,0 +1,13 @@
class PhotoAssociationsController < ApplicationController
before_action :authenticate_member!
respond_to :json, :html
def destroy
@photo = Photo.find_by!(id: params[:photo_id], owner: current_member)
collection = Growstuff::Constants::PhotoModels.get_relation(@photo, params[:type])
item_class = Growstuff::Constants::PhotoModels.get_item(params[:type])
@item = item_class.find_by!(id: params[:id], owner_id: current_member.id)
collection.delete(@item)
respond_with(@photo)
end
end

View File

@@ -1,42 +1,25 @@
class PhotosController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
# GET /photos
# GET /photos.json
def index
@photos = Photo.paginate(page: params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @photos }
end
respond_with(@photos)
end
# GET /photos/new
# GET /photos/new.json
def new
@photo = Photo.new
@type = params[:type]
@id = params[:id]
page = params[:page] || 1
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
if @flickr_auth
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
respond_to do |format|
format.html # new.html.erb
format.json { render json: @photo }
end
@photo = Photo.new
retrieve_from_flickr
respond_with(@photo)
end
# GET /photos/1/edit
@@ -48,30 +31,15 @@ class PhotosController < ApplicationController
def create
find_or_create_photo_from_flickr_photo
add_photo_to_collection
respond_to do |format|
if @photo.present? && @photo.save
format.html { redirect_to photo_path(@photo), notice: 'Photo was successfully added.' }
format.json { render json: @photo, status: :created, location: @photo }
else
format.html { render action: "new" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Photo was successfully added.' if @photo.present? && @photo.save
respond_with(@photo)
end
# PUT /photos/1
# PUT /photos/1.json
def update
respond_to do |format|
if @photo.update(photo_params)
format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Photo was successfully updated.' if @photo.update(photo_params)
respond_with(@photo)
end
# DELETE /photos/1
@@ -79,11 +47,7 @@ class PhotosController < ApplicationController
def destroy
@photo.destroy
flash[:alert] = "Photo successfully deleted."
respond_to do |format|
format.html { redirect_to photos_url }
format.json { head :no_content }
end
respond_with(@photo)
end
private
@@ -97,7 +61,7 @@ class PhotosController < ApplicationController
end
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
params.require(:photo).permit(:flickr_photo_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
end
@@ -122,4 +86,19 @@ class PhotosController < ApplicationController
rescue => e
flash[:alert] = e.message
end
def retrieve_from_flickr
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
return unless @flickr_auth
page = params[:page] || 1
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
end

View File

@@ -1,35 +1,25 @@
class PlantPartsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
# GET /plant_parts
# GET /plant_parts.json
def index
@plant_parts = PlantPart.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @plant_parts }
end
respond_with(@plant_parts)
end
# GET /plant_parts/1
# GET /plant_parts/1.json
def show
respond_to do |format|
format.html # show.html.erb
format.json { render json: @plant_part }
end
respond_with(@plant_part)
end
# GET /plant_parts/new
# GET /plant_parts/new.json
def new
@plant_part = PlantPart.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @plant_part }
end
respond_with(@plant_part)
end
# GET /plant_parts/1/edit

View File

@@ -39,8 +39,8 @@ class PlantingsController < ApplicationController
@planting = Planting.new('planted_at' => Time.zone.today)
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by(id: params[:crop_id]) || Crop.new
@garden = Garden.find_by(id: params[:garden_id]) || Garden.new
@crop = Crop.approved.find_by(id: params[:crop_id]) || Crop.new
@garden = Garden.find_by(owner: current_member, id: params[:garden_id]) || Garden.new
respond_to do |format|
format.html # new.html.erb

View File

@@ -1,38 +1,24 @@
class PostsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: [:index, :show]
# GET /posts
# GET /posts.json
# GET /posts.rss
def index
@author = Member.find_by(slug: params[:author])
@posts = if @author
@author.posts.includes(:author, comments: :author).paginate(page: params[:page])
else
Post.includes(:author, comments: :author).paginate(page: params[:page])
end
respond_to do |format|
format.html # index.html.haml
format.json { render json: @posts }
format.rss { render layout: false } # index.rss.builder
end
@posts = posts
respond_with(@posts)
end
# GET /posts/1
# GET /posts/1.json
# GET /posts/1.rss
def show
@post = Post.includes(:author, comments: :author).find(params[:id])
respond_to do |format|
format.html # show.html.haml
format.json { render json: @post }
format.rss { render(
layout: false,
locals: { post: @post }
)}
end
respond_with(@post)
end
# GET /posts/new
@@ -40,11 +26,7 @@ class PostsController < ApplicationController
def new
@post = Post.new
@forum = Forum.find_by(id: params[:forum_id])
respond_to do |format|
format.html # new.html.haml
format.json { render json: @post }
end
respond_with(@post)
end
# GET /posts/1/edit
@@ -56,41 +38,22 @@ class PostsController < ApplicationController
def create
params[:post][:author_id] = current_member.id
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render json: @post, status: :created, location: @post }
else
format.html { render action: "new" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Post was successfully created.' if @post.save
respond_with(@post)
end
# PUT /posts/1
# PUT /posts/1.json
def update
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Post was successfully updated.' if @post.update(post_params)
respond_with(@post)
end
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post.destroy
respond_to do |format|
format.html { redirect_to posts_url, notice: 'Post was deleted.' }
format.json { head :no_content }
end
flash[:notice] = 'Post was deleted.' if @post.destroy
respond_with(@post)
end
private
@@ -98,4 +61,12 @@ class PostsController < ApplicationController
def post_params
params.require(:post).permit(:body, :subject, :author_id, :forum_id)
end
def posts
if @author
@author.posts
else
Post
end.includes(:author, comments: :author).paginate(page: params[:page])
end
end

View File

@@ -1,25 +1,19 @@
class ScientificNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
# GET /scientific_names
# GET /scientific_names.json
def index
@scientific_names = ScientificName.all
respond_to do |format|
format.html # index.html.haml
format.json { render json: @scientific_names }
end
respond_with(@scientific_names)
end
# GET /scientific_names/1
# GET /scientific_names/1.json
def show
respond_to do |format|
format.html # show.html.haml
format.json { render json: @scientific_name }
end
respond_with(@scientific_name)
end
# GET /scientific_names/new
@@ -27,11 +21,7 @@ class ScientificNamesController < ApplicationController
def new
@scientific_name = ScientificName.new
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_to do |format|
format.html # new.html.haml
format.json { render json: @scientific_name }
end
respond_with(@scientific_name)
end
# GET /scientific_names/1/edit
@@ -41,32 +31,18 @@ class ScientificNamesController < ApplicationController
# POST /scientific_names
# POST /scientific_names.json
def create
params[:scientific_name][:creator_id] = current_member.id
@scientific_name = ScientificName.new(scientific_name_params)
@scientific_name.creator = current_member
respond_to do |format|
if @scientific_name.save
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully created.' }
format.json { render json: @scientific_name, status: :created, location: @scientific_name }
else
format.html { render action: "new" }
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Scientific name was successfully created.' if @scientific_name.save
respond_with(@scientific_name.crop)
end
# PUT /scientific_names/1
# PUT /scientific_names/1.json
def update
respond_to do |format|
if @scientific_name.update(scientific_name_params)
format.html { redirect_to @scientific_name.crop, notice: 'Scientific name was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @scientific_name.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Scientific name was successfully updated.' if @scientific_name.update(scientific_name_params)
respond_with(@scientific_name.crop)
end
# DELETE /scientific_names/1
@@ -74,18 +50,13 @@ class ScientificNamesController < ApplicationController
def destroy
@crop = @scientific_name.crop
@scientific_name.destroy
respond_to do |format|
format.html {
redirect_to @crop, notice: 'Scientific name was successfully deleted.'
}
format.json { head :no_content }
end
flash[:notice] = 'Scientific name was successfully deleted.'
respond_with(@crop)
end
private
def scientific_name_params
params.require(:scientific_name).permit(:crop_id, :name, :creator_id)
params.require(:scientific_name).permit(:crop_id, :name)
end
end

View File

@@ -1,6 +1,9 @@
class SeedsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
respond_to :rss, only: :index
# GET /seeds
# GET /seeds.json
@@ -8,31 +11,15 @@ class SeedsController < ApplicationController
@owner = Member.find_by(slug: params[:owner])
@crop = Crop.find_by(slug: params[:crop])
@seeds = seeds(owner: @owner, crop: @crop)
@filename = csv_filename
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seeds }
format.rss { render layout: false } # index.rss.builder
format.csv do
if @owner
@filename = "Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = @owner.seeds.includes(:owner, :crop)
else
@filename = "Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
@seeds = Seed.includes(:owner, :crop)
end
render csv: @seeds
end
end
respond_with(@seeds)
end
# GET /seeds/1
# GET /seeds/1.json
def show
respond_to do |format|
format.html # show.html.erb
format.json { render json: @seed }
end
respond_with(@seed)
end
# GET /seeds/new
@@ -42,11 +29,7 @@ class SeedsController < ApplicationController
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_or_initialize_by(id: params[:crop_id])
respond_to do |format|
format.html # new.html.erb
format.json { render json: @seed }
end
respond_with(@seed)
end
# GET /seeds/1/edit
@@ -56,52 +39,34 @@ class SeedsController < ApplicationController
# POST /seeds
# POST /seeds.json
def create
params[:seed][:owner_id] = current_member.id
@seed = Seed.new(seed_params)
respond_to do |format|
if @seed.save
format.html { redirect_to @seed, notice: "Successfully added #{@seed.crop} seed to your stash." }
format.json { render json: @seed, status: :created, location: @seed }
else
format.html { render action: "new" }
format.json { render json: @seed.errors, status: :unprocessable_entity }
end
end
@seed.owner = current_member
flash[:notice] = "Successfully added #{@seed.crop} seed to your stash." if @seed.save
respond_with(@seed)
end
# PUT /seeds/1
# PUT /seeds/1.json
def update
respond_to do |format|
if @seed.update(seed_params)
format.html { redirect_to @seed, notice: 'Seed was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @seed.errors, status: :unprocessable_entity }
end
end
flash[:notice] = 'Seed was successfully updated.' if @seed.update(seed_params)
respond_with(@seed)
end
# DELETE /seeds/1
# DELETE /seeds/1.json
def destroy
@seed.destroy
respond_to do |format|
format.html { redirect_to seeds_url }
format.json { head :no_content }
end
respond_with(@seed)
end
private
def seed_params
params.require(:seed).permit(
:owner_id, :crop_id, :description, :quantity, :plant_before,
:crop_id, :description, :quantity, :plant_before,
:days_until_maturity_min, :days_until_maturity_max, :organic, :gmo,
:heirloom, :tradable_to, :slug)
:heirloom, :tradable_to, :slug
)
end
def seeds(owner: nil, crop: nil)
@@ -113,4 +78,12 @@ class SeedsController < ApplicationController
Seed
end.includes(:owner, :crop).paginate(page: params[:page])
end
def csv_filename
if @owner
"Growstuff-#{@owner}-Seeds-#{Time.zone.now.to_s(:number)}.csv"
else
"Growstuff-Seeds-#{Time.zone.now.to_s(:number)}.csv"
end
end
end

View File

@@ -93,11 +93,13 @@ module ApplicationHelper
end
end
def title(type, owner, crop)
def title(type, owner, crop, planting)
if owner
t(".title.owner_#{type}", owner: owner.login_name)
elsif crop
t(".title.crop_#{type}", crop: crop.name)
elsif planting
t(".title.planting_#{type}", planting: planting.to_s)
else
t(".title.default")
end

View File

@@ -5,14 +5,14 @@ module CropsHelper
seeds = member.seeds.select { |seed| seed.crop.name == crop.name }
seeds.each do |seed|
total_quantity = total_quantity + seed.quantity if seed.quantity
total_quantity += seed.quantity if seed.quantity
end
if !seeds.any?
return "You don't have any seeds of this crop."
end
if (total_quantity != 0)
if total_quantity != 0
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
else
"You have an unknown quantity of seeds of this crop."

View File

@@ -21,13 +21,14 @@ module GardensHelper
if plantings.blank?
"None"
else
output = ""
plantings.first(2).each do |planting|
output = '<ul class="plantings">'
plantings.each do |planting|
output += "<li>"
output += planting.quantity.nil? ? "0 " : "#{planting.quantity} "
output += link_to planting.crop.name, planting.crop
output += ", planted on #{planting.planted_at}</li>"
end
output += '</ul>'
output.html_safe
end
end

View File

@@ -1,7 +1,7 @@
class Ability
include CanCan::Ability
def initialize(member) # rubocop:disable Metrics/AbcSize
def initialize(member) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
# everyone can do these things, even non-logged in
@@ -72,11 +72,13 @@ class Ability
can :create, Authentication
can :destroy, Authentication, member_id: member.id
# anyone can create a post, or comment on a post,
# anyone can create a post, like, or comment on a post,
# but only the author can edit/destroy it.
can :create, Post
can :update, Post, author_id: member.id
can :destroy, Post, author_id: member.id
can :create, Like
can :destroy, Like, member_id: member.id
can :create, Comment
can :update, Comment, author_id: member.id
can :destroy, Comment, author_id: member.id
@@ -87,8 +89,8 @@ class Ability
can :destroy, Garden, owner_id: member.id
can :create, Planting
can :update, Planting, garden: { owner_id: member.id }
can :destroy, Planting, garden: { owner_id: member.id }
can :update, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :destroy, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :create, Harvest
can :update, Harvest, owner_id: member.id

View File

@@ -2,4 +2,6 @@ class AlternateName < ActiveRecord::Base
after_commit { |an| an.crop.__elasticsearch__.index_document if an.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end

View File

@@ -21,24 +21,27 @@ class Crop < ActiveRecord::Base
has_and_belongs_to_many :posts # rubocop:disable Rails/HasAndBelongsToMany
before_destroy { |crop| crop.posts.clear }
default_scope { order("lower(name) asc") }
default_scope { order("lower(crops.name) asc") }
scope :recent, lambda {
where(approval_status: "approved").reorder("created_at desc")
approved.reorder("created_at desc")
}
scope :toplevel, lambda {
where(approval_status: "approved", parent_id: nil)
approved.where(parent_id: nil)
}
scope :popular, lambda {
where(approval_status: "approved").reorder("plantings_count desc, lower(name) asc")
approved.reorder("plantings_count desc, lower(name) asc")
}
scope :randomized, lambda {
# ok on sqlite and psql, but not on mysql
where(approval_status: "approved").reorder('random()')
approved.reorder('random()')
}
scope :pending_approval, -> { where(approval_status: "pending") }
scope :approved, -> { where(approval_status: "approved") }
scope :rejected, -> { where(approval_status: "rejected") }
scope :interesting, -> { approved.has_photos }
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
## Wikipedia urls are only necessary when approving a crop
validates :en_wikipedia_url,
format: {
@@ -198,81 +201,6 @@ class Crop < ActiveRecord::Base
["already in database", "not edible", "not enough information", "other"]
end
# Crop.interesting
# returns a list of interesting crops, for use on the homepage etc
def self.interesting
howmany = 12 # max number to find
interesting_crops = []
Crop.includes(:photos).randomized.each do |c|
break if interesting_crops.size == howmany
next unless c.interesting?
interesting_crops.push(c)
end
interesting_crops
end
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def self.create_from_csv(row)
name, en_wikipedia_url, parent, scientific_names, alternate_names = row
cropbot = Member.find_by(login_name: 'cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
crop = Crop.find_or_create_by(name: name)
crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
if parent
parent = Crop.find_by(name: parent)
if parent
crop.update_attributes(parent_id: parent.id)
else
logger.warn("Warning: parent crop #{parent} not found")
end
end
crop.add_scientific_names_from_csv(scientific_names)
crop.add_alternate_names_from_csv(alternate_names)
end
def add_scientific_names_from_csv(scientific_names)
names_to_add = []
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(/,\s*/)
elsif parent && !parent.scientific_names.empty? # pick up from parent
names_to_add = parent.scientific_names.map(&:name)
else
logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
cropbot = Member.find_by(login_name: 'cropbot')
return if names_to_add.empty?
raise "cropbot account not found: run rake db:seed" unless cropbot
add_names_to_list(names_to_add, 'scientific')
end
def add_alternate_names_from_csv(alternate_names)
# i.e. we actually passed something in, which isn't a given
return if alternate_names.blank?
cropbot = Member.find_by!(login_name: 'cropbot')
names_to_add = alternate_names.split(/,\s*/)
add_names_to_list(names_to_add, 'alternate')
rescue
raise "cropbot account not found: run rake db:seed" unless cropbot
end
def rejection_explanation
return rejection_notes if reason_for_rejection == "other"
reason_for_rejection
@@ -320,34 +248,11 @@ class Crop < ActiveRecord::Base
end
def self.case_insensitive_name(name)
where(["lower(name) = :value", { value: name.downcase }])
where(["lower(crops.name) = :value", { value: name.downcase }])
end
private
def add_names_to_list(names_to_add, list_name)
names_to_add.each do |n|
if name_already_exists(list_name, n)
logger.warn("Warning: skipping duplicate #{list_name} name #{n} for #{self}")
else
create_crop_in_list(list_name, n)
end
end
end
def create_crop_in_list(list_name, name)
cropbot = Member.find_by(login_name: 'cropbot')
create_hash = {
creator_id: cropbot.id.to_s,
name: name
}
send("#{list_name}_names").create(create_hash)
end
def name_already_exists(list_name, name)
send("#{list_name}_names").exists?(name: name)
end
def count_uses_of_property(col_name)
plantings.unscoped
.where(crop_id: id)
@@ -357,7 +262,6 @@ class Crop < ActiveRecord::Base
end
# Custom validations
def approval_status_cannot_be_changed_again
previous = previous_changes.include?(:approval_status) ? previous_changes.approval_status : {}
return unless previous.include?(:rejected) || previous.include?(:approved)

View File

@@ -0,0 +1,70 @@
class CsvImporter
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def import_crop(row)
name, en_wikipedia_url, parent_name, scientific_names, alternate_names = row
@crop = Crop.find_or_create_by(name: name)
@crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
add_parent(parent_name) if parent_name
add_scientific_names(scientific_names)
add_alternate_names(alternate_names)
@crop.save!
@crop
end
private
def add_parent(parent_name)
parent = Crop.find_by(name: parent_name)
if parent
@crop.update_attributes(parent_id: parent.id)
else
@crop.logger.warn("Warning: parent crop #{parent_name} not found")
end
end
def add_scientific_names(scientific_names)
names_to_add = []
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(/,\s*/)
elsif @crop.parent && !@crop.parent.scientific_names.empty? # pick up from parent
names_to_add = @crop.parent.scientific_names.map(&:name)
else
@crop.logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
return if names_to_add.empty?
names_to_add.each do |name|
sciname = ScientificName.find_by(name: name, crop: @crop)
sciname = ScientificName.create!(name: name, crop: @crop, creator: cropbot) unless sciname
@crop.scientific_names << sciname
end
end
def add_alternate_names(alternate_names)
# i.e. we actually passed something in, which isn't a given
return if alternate_names.blank?
alternate_names.split(/,\s*/).each do |name|
altname = AlternateName.find_by(name: name, crop: @crop)
altname = AlternateName.create! name: name, crop: @crop, creator: cropbot unless altname
@crop.alternate_names << altname
end
end
def cropbot
@cropbot = Member.find_by!(login_name: 'cropbot') unless @cropbot
@cropbot
rescue
raise "cropbot account not found: run rake db:seed"
end
end

View File

@@ -1,5 +1,6 @@
class Forum < ActiveRecord::Base
extend FriendlyId
validates :name, presence: true
friendly_id :name, use: [:slugged, :finders]
has_many :posts

View File

@@ -4,7 +4,7 @@ class Garden < ActiveRecord::Base
include PhotoCapable
friendly_id :garden_slug, use: [:slugged, :finders]
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
has_many :plantings, -> { order(created_at: :desc) }, dependent: :destroy
has_many :crops, through: :plantings
@@ -62,7 +62,7 @@ class Garden < ActiveRecord::Base
unique_plantings = []
seen_crops = []
plantings.each do |p|
plantings.includes(:garden, :crop, :owner, :harvests).each do |p|
unless seen_crops.include?(p.crop)
unique_plantings.push(p)
seen_crops.push(p.crop)

View File

@@ -5,7 +5,7 @@ class Harvest < ActiveRecord::Base
friendly_id :harvest_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member'
belongs_to :owner, class_name: 'Member', counter_cache: true
belongs_to :plant_part
belongs_to :planting

View File

@@ -36,6 +36,15 @@ class Member < ActiveRecord::Base
scope :recently_joined, -> { reorder("confirmed_at desc") }
scope :wants_newsletter, -> { where(newsletter: true) }
scope :interesting, lambda {
confirmed
.located
.recently_signed_in
.has_plantings
}
scope :has_plantings, -> { joins(:plantings).group("members.id") }
has_many :follows, class_name: "Follow", foreign_key: "follower_id"
has_many :followed, through: :follows
@@ -183,14 +192,6 @@ class Member < ActiveRecord::Base
sets
end
def interesting?
# we assume we're being passed something from
# Member.confirmed.located as those are required for
# interestingness, as well.
return true if plantings.present?
false
end
def self.login_name_or_email(login)
where(["lower(login_name) = :value OR lower(email) = :value", { value: login.downcase }])
end
@@ -199,16 +200,6 @@ class Member < ActiveRecord::Base
where(["lower(login_name) = :value", { value: login.downcase }])
end
def self.interesting
howmany = 12 # max number to find
interesting_members = []
Member.confirmed.located.recently_signed_in.each do |m|
break if interesting_members.size == howmany
interesting_members.push(m) if m.interesting?
end
interesting_members
end
def self.nearest_to(place)
nearby_members = []
if place

View File

@@ -10,6 +10,10 @@ class Photo < ActiveRecord::Base
default_scope { order("created_at desc") }
def associations?
plantings.any? || harvests.any? || gardens.any? || seeds.any?
end
def all_associations
associations = []
Growstuff::Constants::PhotoModels.relations.each do |association_name|
@@ -30,7 +34,7 @@ class Photo < ActiveRecord::Base
licenses = flickr.photos.licenses.getInfo
license = licenses.find { |l| l.id == info.license }
{
title: info.title || "Untitled",
title: calculate_title(info),
license_name: license.name,
license_url: license.url,
thumbnail_url: FlickRaw.url_q(info),
@@ -39,6 +43,16 @@ class Photo < ActiveRecord::Base
}
end
def calculate_title(info)
if id && title # already has a title saved
title
elsif info.title # use title from flickr
info.title
else
'untitled'
end
end
def set_flickr_metadata
update_attributes(flickr_metadata)
end

View File

@@ -8,10 +8,18 @@ class Planting < ActiveRecord::Base
belongs_to :crop, counter_cache: true
has_many :harvests, -> { order(harvested_at: :desc) }, dependent: :destroy
default_scope { order("created_at desc") }
default_scope { order("plantings.created_at desc") }
scope :finished, -> { where(finished: true) }
scope :current, -> { where(finished: false) }
scope :interesting, -> { has_photos.one_per_owner }
scope :one_per_owner, lambda {
joins("JOIN members m ON (m.id=plantings.owner_id)
LEFT OUTER JOIN plantings p2
ON (m.id=p2.owner_id AND plantings.id < p2.id)").where("p2 IS NULL")
}
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
delegate :name,
:en_wikipedia_url,
:default_scientific_name,
@@ -19,8 +27,6 @@ class Planting < ActiveRecord::Base
to: :crop,
prefix: true
default_scope { order("created_at desc") }
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }
@@ -28,7 +34,8 @@ class Planting < ActiveRecord::Base
validates :quantity,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
greater_than_or_equal_to: 0
},
allow_nil: true
SUNNINESS_VALUES = %w(sun semi-shade shade)
@@ -64,15 +71,11 @@ class Planting < ActiveRecord::Base
end
def planting_slug
if garden.present? && crop.present?
"#{owner.login_name}-#{garden.name}-#{crop.name}"
elsif garden.present?
"#{owner.login_name}-#{garden.name}-null"
elsif crop.present?
"#{owner.login_name}-null-#{crop.name}"
else
"#{owner.login_name}-null-null"
end.downcase.gsub(' ', '-')
[
owner.login_name,
garden.present? ? garden.name : 'null',
crop.present? ? crop.name : 'null'
].join('-').tr(' ', '-').downcase
end
# location = garden owner + garden name, i.e. "Skud's backyard"
@@ -89,10 +92,6 @@ class Planting < ActiveRecord::Base
photos.first
end
def interesting?
photos.present?
end
def calculate_days_before_maturity(planting, crop)
p_crop = Planting.where(crop_id: crop).where.not(id: planting)
differences = p_crop.collect do |p|
@@ -138,24 +137,4 @@ class Planting < ActiveRecord::Base
percent
end
# return a list of interesting plantings, for the homepage etc.
# we can't do this via a scope (as far as we know) so sadly we have to
# do it this way.
def Planting.interesting(howmany = 12, require_photo = true)
interesting_plantings = []
seen_owners = Hash.new(false) # keep track of which owners we've seen already
Planting.includes(:photos).each do |p|
break if interesting_plantings.size == howmany # got enough yet?
if require_photo
next unless p.photos.present? # skip those without photos, if required
end
next if seen_owners[p.owner] # skip if we already have one from this owner
seen_owners[p.owner] = true # we've seen this owner
interesting_plantings.push(p)
end
interesting_plantings
end
end

View File

@@ -39,9 +39,7 @@ class Post < ActiveRecord::Base
default_scope { order("created_at desc") }
validates :subject,
format: {
with: /\S/
},
presence: true,
length: { maximum: 255 }
def author_date_subject

View File

@@ -2,4 +2,6 @@ class ScientificName < ActiveRecord::Base
after_commit { |sn| sn.crop.__elasticsearch__.index_document if sn.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end

View File

@@ -4,7 +4,7 @@ class Seed < ActiveRecord::Base
friendly_id :seed_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
default_scope { order("created_at desc") }

View File

@@ -4,6 +4,7 @@
%ul#admin_links
%li= link_to "Account types", account_types_path
%li= link_to "Alternate names", alternate_names_path
%li= link_to "Products", products_path
%li= link_to "Roles", roles_path
%li= link_to "Forums", forums_path

View File

@@ -90,8 +90,7 @@
- unless can? :wrangle, @crop
%p
When you submit this form, your suggestion will be sent to our team of
= link_to 'volunteer crop wranglers', 'http://talk.growstuff.org/c/crop-wrangling'
for review. We'll let you know the outcome as soon as we can.
volunteer crop wranglers for review. We'll let you know the outcome as soon as we can.
-# Now, for crop wranglers, let's have approval/rejection at the bottom of the page
- if can?(:wrangle, @crop) && @crop.requester

View File

@@ -1,17 +1,19 @@
- content_for :title, "Resend confirmation instructions"
= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
= form_for(resource, as: resource_name,
url: confirmation_path(resource_name),
html: { method: :post, class: 'form-horizontal', role: 'form' }) do |f|
= devise_error_messages!
%p Enter either your login name or your email address to resend the confirmation email.
.form-group
= f.label :login, :class => 'control-label col-md-2'
= f.label :login, class: 'control-label col-md-2'
.col-md-8
= f.text_field :login, :class => 'form-control'
= f.text_field :login, class: 'form-control'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Resend confirmation instructions", :class => 'btn btn-primary'
= f.submit "Resend confirmation instructions", class: 'btn btn-primary'
.form-group
.col-md-offset-2.col-md-8

View File

@@ -5,7 +5,7 @@
Your account on #{site_name} has been created. You just need to confirm
your email address through the link below:
%p= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token)
%p= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token)
%p
Once you're confirmed, you can sign in with your login name
@@ -17,9 +17,9 @@
We're excited to have you as a member, and hope you'll enjoy
what #{site_name} has to offer. Take a look around the site,
= succeed "," do
= link_to('plant some things', url_for(:controller => '/crops', :only_path => false))
= link_to('plant some things', url_for(controller: '/crops', only_path: false))
and feel free to drop in on the
= link_to 'forums', url_for(:controller => '/forums', :only_path => false)
= link_to 'forums', url_for(controller: '/forums', only_path: false)
if you have any questions or feedback.
%p

View File

@@ -5,7 +5,7 @@
Someone has requested a link to reset your password on #{site_name}.
We presume this was you, in which case you can do so through this link:
%p= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token)
%p= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token)
%p
If it wasn't you, then someone's made a typo or has been messing
@@ -17,5 +17,5 @@
%p
The #{site_name} team.
%br/
=link_to root_url, root_url
= link_to root_url, root_url

View File

@@ -8,7 +8,7 @@
forgotten your password. In either case, use the link below to unlock
your account:
%p= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @token)
%p= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token)
%p
If you have actually forgotten your password, you can
@@ -20,4 +20,4 @@
%p
The #{site_name} team.
%br/
=link_to root_url, root_url
= link_to root_url, root_url

View File

@@ -1,21 +1,23 @@
- content_for :title, "Change your password"
= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put, :class => 'form-horizontal', :role => 'form' }) do |f|
= form_for(resource, as: resource_name,
url: password_path(resource_name),
html: { method: :put, class: 'form-horizontal', role: 'form' }) do |f|
= devise_error_messages!
= f.hidden_field :reset_password_token
.form-group
= f.label :password, "New password", :class => 'control-label col-md-2'
= f.label :password, "New password", class: 'control-label col-md-2'
.col-md-8
= f.password_field :password, :class => 'form-control'
= f.password_field :password, class: 'form-control'
.form-group
= f.label :password_confirmation, "Confirm new password", :class => 'control-label col-md-2'
= f.label :password_confirmation, "Confirm new password", class: 'control-label col-md-2'
.col-md-8
= f.password_field :password_confirmation, :class => 'form-control'
= f.password_field :password_confirmation, class: 'form-control'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Change my password", :class => 'btn btn-primary'
= f.submit "Change my password", class: 'btn btn-primary'
= render "devise/shared/links"

View File

@@ -1,15 +1,18 @@
- content_for :title, "Forgot your password?"
= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
= form_for(resource, as: resource_name,
url: password_path(resource_name),
html: { method: :post,
class: 'form-horizontal', role: 'form' }) do |f|
= devise_error_messages!
.form-group
= f.label :login, :class => 'control-label col-md-2'
= f.label :login, class: 'control-label col-md-2'
.col-md-8
= f.text_field :login, :class => 'form-control'
= f.text_field :login, class: 'form-control'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Send me reset password instructions", :class => 'btn btn-primary'
= f.submit "Send me reset password instructions", class: 'btn btn-primary'
.form-group
.col-md-offset-2.col-md-8

View File

@@ -1,39 +1,47 @@
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
= form_for(resource, as: resource_name,
url: registration_path(resource_name),
html: { method: :put, class: 'form-horizontal' }) do |_f|
%br/
= devise_error_messages!
.row
.col-md-12
%p
= image_tag "twitter_32.png", :size => "32x32", :alt => 'Twitter logo'
= image_tag "twitter_32.png", size: "32x32", alt: 'Twitter logo'
- if @twitter_auth
You are connected to Twitter as
= succeed "." do
=link_to @twitter_auth.name, "http://twitter.com/#{@twitter_auth.name}"
= link_to "Disconnect", @twitter_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
= link_to @twitter_auth.name, "http://twitter.com/#{@twitter_auth.name}"
= link_to "Disconnect", @twitter_auth,
confirm: "Are you sure you want to remove this connection?",
method: :delete, class: "remove"
- else
=link_to 'Connect to Twitter', '/auth/twitter'
= link_to 'Connect to Twitter', '/auth/twitter'
.row
.col-md-12
%p
= image_tag "flickr_32.png", :size => "32x32", :alt => 'Flickr logo'
= image_tag "flickr_32.png", size: "32x32", alt: 'Flickr logo'
- if @flickr_auth
You are connected to Flickr as
= succeed "." do
=link_to @flickr_auth.name, "http://flickr.com/photos/#{@flickr_auth.uid}"
= link_to "Disconnect", @flickr_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
= link_to @flickr_auth.name, "http://flickr.com/photos/#{@flickr_auth.uid}"
= link_to "Disconnect", @flickr_auth,
confirm: "Are you sure you want to remove this connection?",
method: :delete, class: "remove"
- else
=link_to 'Connect to Flickr', '/auth/flickr'
= link_to 'Connect to Flickr', '/auth/flickr'
.row
.col-md-12
%p
= image_tag "facebook_32.png", :size => "32x32", :alt => 'Facebook logo'
= image_tag "facebook_32.png", size: "32x32", alt: 'Facebook logo'
- if @facebook_auth
You are connected to Facebook as
= succeed "." do
=link_to @facebook_auth.name, "http://facebook.com/profile/#{@facebook_auth.uid}"
= link_to "Disconnect", @facebook_auth, :confirm => "Are you sure you want to remove this connection?", :method => :delete, :class => "remove"
= link_to @facebook_auth.name, "http://facebook.com/profile/#{@facebook_auth.uid}"
= link_to "Disconnect", @facebook_auth,
confirm: "Are you sure you want to remove this connection?",
method: :delete, class: "remove"
- else
=link_to 'Connect to Facebook', '/auth/facebook'
= link_to 'Connect to Facebook', '/auth/facebook'

View File

@@ -1,11 +1,13 @@
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
= form_for(resource, as: resource_name,
url: registration_path(resource_name),
html: { method: :put, class: 'form-horizontal' }) do |f|
%br/
= devise_error_messages!
.form-group
= f.label :email, :class => 'control-label col-md-2'
= f.label :email, class: 'control-label col-md-2'
.col-md-8
= f.email_field :email, :class => 'form-control'
= f.email_field :email, class: 'form-control'
%span.help-block If you change your email address you will have to reconfirm.
.form-group
@@ -32,10 +34,9 @@
= f.check_box :newsletter
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
.help-block
= render :partial => 'newsletter_blurb'
= render partial: 'newsletter_blurb'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Save", :class => 'btn btn-primary'
=f.hidden_field(:tos_agreement, :value => true)
= f.submit "Save", class: 'btn btn-primary'
= f.hidden_field(:tos_agreement, value: true)

View File

@@ -1,23 +1,25 @@
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
= form_for(resource, as: resource_name,
url: registration_path(resource_name),
html: { method: :put, class: 'form-horizontal' }) do |f|
%br/
= devise_error_messages!
.form-group
= f.label :current_password, :class => 'control-label col-md-2'
= f.label :current_password, class: 'control-label col-md-2'
.col-md-4
= f.password_field :current_password, :class => 'form-control'
= f.password_field :current_password, class: 'form-control'
.form-group
= f.label :password, "New password", :class => 'control-label col-md-2'
= f.label :password, "New password", class: 'control-label col-md-2'
.col-md-4
= f.password_field :password, :autocomplete => "off", :class => 'form-control'
= f.password_field :password, autocomplete: "off", class: 'form-control'
.form-group
= f.label :password_confirmation, :class => 'control-label col-md-2'
.col-md-4= f.password_field :password_confirmation, :class => 'form-control'
= f.label :password_confirmation, class: 'control-label col-md-2'
.col-md-4= f.password_field :password_confirmation, class: 'form-control'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Save", :class => 'btn btn-primary'
= f.submit "Save", class: 'btn btn-primary'
=f.hidden_field(:tos_agreement, :value => true)
= f.hidden_field(:tos_agreement, value: true)

View File

@@ -1,23 +1,25 @@
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f|
= form_for(resource, as: resource_name,
url: registration_path(resource_name),
html: { method: :put, class: 'form-horizontal' }) do |f|
%br/
= devise_error_messages!
.form-group
=f.label :location, 'Your location', :class => 'control-label col-md-2'
= f.label :location, 'Your location', class: 'control-label col-md-2'
.col-md-8
=f.text_field :location, :autocomplete => "off", :class => 'form-control'
= f.text_field :location, autocomplete: "off", class: 'form-control'
%span.help-block This will be displayed on a map. You can be as detailed or vague as you like.
.form-group
=f.label :bio, :class => 'control-label col-md-2'
= f.label :bio, class: 'control-label col-md-2'
.col-md-8
=f.text_area :bio, :rows => 6, :class => 'form-control'
= f.text_area :bio, rows: 6, class: 'form-control'
.form-group
%label.control-label.col-md-2
Profile picture
.col-md-8
= render :partial => "members/avatar", :locals => { :member => @member }
= render partial: "members/avatar", locals: { member: @member }
- unless @member.preferred_avatar_uri.present?
%p
%br/
@@ -27,6 +29,5 @@
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Save", :class => 'btn btn-primary'
=f.hidden_field(:tos_agreement, :value => true)
= f.submit "Save", class: 'btn btn-primary'
= f.hidden_field(:tos_agreement, value: true)

View File

@@ -1,25 +1,25 @@
- content_for :title, "Settings for #{current_member.login_name}"
%ul.nav.nav-tabs{:role => 'tablist'}
%ul.nav.nav-tabs{ role: 'tablist' }
%li.active
%a{:href => '#profile', :role => 'tab', 'data-toggle' => 'tab'}
%a{ href: '#profile', role: 'tab', 'data-toggle': 'tab' }
Profile
%li
%a{:href => '#email', :role => 'tab', 'data-toggle' => 'tab'}
%a{ href: '#email', role: 'tab', 'data-toggle': 'tab' }
Email
%li
%a{:href => '#apps', :role => 'tab', 'data-toggle' => 'tab'}
%a{ href: '#apps', role: 'tab', 'data-toggle': 'tab' }
Apps
%li
%a{:href => '#password', :role => 'tab', 'data-toggle' => 'tab'}
%a{ href: '#password', role: 'tab', 'data-toggle': 'tab' }
Password
.tab-content
.tab-pane.active#profile
= render :partial => 'edit_profile'
= render partial: 'edit_profile'
.tab-pane#email
= render :partial => 'edit_email'
= render partial: 'edit_email'
.tab-pane#apps
= render :partial => 'edit_apps'
= render partial: 'edit_apps'
.tab-pane#password
= render :partial => 'edit_password'
= render partial: 'edit_password'

View File

@@ -2,28 +2,30 @@
%p Sign up for a Growstuff account to track your veggie garden and connect with other local growers.
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => "form-horizontal"}) do |f|
= form_for(resource, as: resource_name,
url: registration_path(resource_name),
html: { class: "form-horizontal" }) do |f|
= devise_error_messages!
.form-group
= f.label :login_name, :class => "control-label col-md-2"
= f.label :login_name, class: "control-label col-md-2"
.col-md-8
= f.text_field :login_name, :class => 'form-control'
= f.text_field :login_name, class: 'form-control'
%span.help-inline This is the name that will show on the website.
.form-group
= f.label :email, :class => "control-label col-md-2"
= f.label :email, class: "control-label col-md-2"
.col-md-8
= f.email_field :email, :class => 'form-control'
= f.email_field :email, class: 'form-control'
%span.help-inline We'll use this address to contact you (we never spam!)
.form-group
= f.label :password, :class => "control-label col-md-2"
.col-md-8= f.password_field :password, :class => 'form-control'
= f.label :password, class: "control-label col-md-2"
.col-md-8= f.password_field :password, class: 'form-control'
.form-group
= f.label :password_confirmation, :class => "control-label col-md-2"
.col-md-8= f.password_field :password_confirmation, :class => 'form-control'
= f.label :password_confirmation, class: "control-label col-md-2"
.col-md-8= f.password_field :password_confirmation, class: 'form-control'
.form-group
.col-md-offset-2.col-md-8.checkbox
@@ -35,14 +37,14 @@
.form-group
.col-md-offset-2.col-md-8.checkbox
%label
= f.check_box :newsletter, :checked => true
= f.check_box :newsletter, checked: true
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
.help-inline
= render :partial => 'newsletter_blurb'
= render partial: 'newsletter_blurb'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Sign up", :class => 'btn btn-primary'
= f.submit "Sign up", class: 'btn btn-primary'
.form-group
.col-md-offset-2.col-md-8

View File

@@ -1,17 +1,19 @@
- content_for :title, "Sign in"
= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => {:class => "form-horizontal"}) do |f|
= form_for(resource, as: resource_name,
url: session_path(resource_name),
html: { class: "form-horizontal" }) do |f|
= devise_error_messages!
.form-group
= f.label :login, :class => "control-label col-md-2"
= f.label :login, class: "control-label col-md-2"
.col-md-8
= f.text_field :login, :class => 'form-control'
= f.text_field :login, class: 'form-control'
.form-group
= f.label :password, :class => "control-label col-md-2"
= f.label :password, class: "control-label col-md-2"
.col-md-8
= f.password_field :password, :class => 'form-control'
= f.password_field :password, class: 'form-control'
- if devise_mapping.rememberable?
.form-group
@@ -22,7 +24,7 @@
.form-group
.form-actions.col-md-8.col-md-offset-2
= f.submit "Sign in", :class => 'btn btn-primary'
= f.submit "Sign in", class: 'btn btn-primary'
.form-group
.col-md-8.col-md-offset-2

View File

@@ -1,15 +1,19 @@
- content_for :title, "Resend unlock instructions"
= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post, :class => 'form-horizontal', :role => 'form' }) do |f|
= form_for(resource, as: resource_name,
url: unlock_path(resource_name),
html: { method: :post,
class: 'form-horizontal',
role: 'form' }) do |f|
= devise_error_messages!
.form-group
= f.label :email, :class => 'control-label col-md-2'
= f.label :email, class: 'control-label col-md-2'
.col-md-8
= f.email_field :email, :class => 'form-control'
= f.email_field :email, class: 'form-control'
.form-group
.form-actions.col-md-offset-2.col-md-8
= f.submit "Resend unlock instructions", :class => 'btn btn-primary'
= f.submit "Resend unlock instructions", class: 'btn btn-primary'
.form-group
.col-md-offset-2.col-md-8

View File

@@ -1,7 +1,7 @@
.panel.panel-success
.panel-heading
%h3.panel-title
= link_to display_garden_name(garden), garden
= link_to display_garden_name(garden), garden_path(garden)
- if can? :edit, garden
%a.pull-right{ href: edit_garden_path(garden), role: "button", id: "edit_garden_glyphicon" }
%span.glyphicon.glyphicon-pencil{ title: "Edit" }
@@ -14,7 +14,7 @@
.col-md-8
%dl.dl-horizontal
%dt Name :
%dd= link_to display_garden_name(garden), garden
%dd= link_to display_garden_name(garden), garden_path(garden)
%dt Location :
%dd
- if garden.location.blank?
@@ -29,11 +29,9 @@
%b
= localize_plural(garden.plantings, Planting)
= ":"
= display_garden_plantings(garden.plantings.current)
= display_garden_plantings(garden.plantings.current.includes(:crop).first(2))
- if garden.plantings.size > 2
%br
= link_to "See more plantings >>", garden_path(garden)
.panel-footer
%dt Description
%dd
= display_garden_description(garden)
%dd= display_garden_description(garden)

View File

@@ -55,7 +55,7 @@
%p= localize_plural(@garden.photos, Photo)
.row-fluid
%ul.thumbnails
- @garden.photos.each do |p|
- @garden.photos.includes(:owner).each do |p|
.col-md-2.six-across
= render partial: 'photos/thumbnail', locals: { photo: p }
.row-fluid
@@ -68,7 +68,7 @@
- if @garden.plantings.current.empty?
%p Nothing is currently planted here.
- else
- @garden.plantings.current.each.with_index do |planting_current, _|
- @garden.plantings.current.includes(:crop, :owner, :harvests, :garden).each.with_index do |planting_current, _|
= render partial: "plantings/thumbnail", locals: { planting: planting_current }
.row-fluid
@@ -111,5 +111,5 @@
- else
= link_to othergarden, garden_path(othergarden)
- if can? :create, @garden
- if @garden.owner == current_member
= link_to 'Add New Garden', new_garden_path, class: 'btn btn-default btn-xs'

View File

@@ -0,0 +1,15 @@
%p
- if can? :create, Harvest
- if @planting && @planting.owner == current_member
= link_to 'Add harvest', new_planting_harvest_path(planting: @planting), class: 'btn btn-primary'
- elsif @owner
%p
- if @owner == current_member
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
= link_to "View everyone's harvests", harvests_path, class: 'btn btn-default'
- else # everyone's harvests
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
- if current_member
= link_to 'View your harvests', harvests_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
- else
= render partial: 'shared/signin_signup', locals: { to: 'track your harvests' }

View File

@@ -0,0 +1,15 @@
- if @harvest.planting
= link_to "#{@harvest.planting.crop.name} planted on #{@harvest.planting.planted_at}",
planting_path(@harvest.planting)
in
= link_to @harvest.planting.garden, garden_path(@harvest.planting.garden)
- elsif @matching_plantings && @harvest.owner == current_member
Is this from one of these plantings?
= form_for(@harvest) do |f|
- @matching_plantings.each do |planting|
.field
= f.radio_button :planting_id, planting.id
= label_tag(:planting, planting)
= f.submit "save", class: 'btn btn-default btn-xs'
- else
Unknown

View File

@@ -1,4 +1,4 @@
- content_for :title, title('harvests', @owner, @crop)
- content_for :title, title('harvests', @owner, @crop, @planting)
- if @owner
= link_to "View #{@owner}'s profile >>", member_path(@owner)
@@ -7,20 +7,7 @@
#{ENV['GROWSTUFF_SITE_NAME']} helps you track what you're
harvesting from your home garden and see how productive it is.
%p
- if can? :create, Harvest
- if @owner
%p
- if @owner == current_member
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
= link_to "View everyone's harvests", harvests_path, class: 'btn btn-default'
- else # everyone's harvests
= link_to 'Add harvest', new_harvest_path, class: 'btn btn-primary'
- if current_member
= link_to 'View your harvests', harvests_by_owner_path(owner: current_member.slug), class: 'btn btn-default'
- else
= render partial: 'shared/signin_signup', locals: { to: 'track your harvests' }
= render "nav"
.pagination
= page_entries_info @harvests
= will_paginate @harvests

View File

@@ -25,12 +25,9 @@
%b Harvested:
= @harvest.harvested_at ? @harvest.harvested_at : "not specified"
- if @planting
%p
%b Planting:
= link_to "#{@planting.crop.name} planted on #{@planting.planted_at}", planting_path(@planting)
in
= link_to @planting.garden, garden_path(@planting.garden)
= render partial: 'planting'
%p
%b Quantity:
= display_quantity(@harvest)

View File

@@ -1,20 +1,20 @@
.row
.col-md-8
- cache cache_key_for(Crop, 'interesting'), :expires_in => 1.day do
- cache cache_key_for(Crop, 'interesting'), expires_in: 1.day do
%h2= t('.our_crops')
.hidden-xs
- Crop.interesting.first(8).each do |c|
- Crop.interesting.includes(:scientific_names, :photos).first(8).each do |c|
.col-md-3
= render partial: 'crops/thumbnail', locals: { crop: c }
.visible-xs
- Crop.interesting.first(3).each do |c|
- Crop.interesting.includes(:scientific_names, :photos).first(3).each do |c|
.col-md-3
= render partial: 'crops/thumbnail', locals: { crop: c }
.col-md-4.hidden-xs
- cache cache_key_for(Planting) do
%h2= t('.recently_planted')
= render partial: 'plantings/list', locals: { :plantings => Planting.interesting.first(6) }
= render partial: 'plantings/list', locals: { plantings: Planting.includes(:owner, :photos).interesting.first(6) }
.row
.col-md-12
@@ -22,7 +22,7 @@
%p{ style: 'margin-top: 11.25px' }
%strong
#{t('.recently_added')}:
!= Crop.recent.limit(12).map {|c| link_to(c, c) }.join(", ")
!= Crop.recent.limit(12).map { |c| link_to(c, c) }.join(", ")
%p.text-right
= link_to "#{t('.view_all')} »", crops_path

View File

@@ -2,7 +2,7 @@
- posts = Post.limit(6)
- if posts
= render partial: "posts/summary", locals: {posts: posts, howmany: 6 }
= render partial: "posts/summary", locals: { posts: posts, howmany: 6 }
- cache cache_key_for(Forum) do
- forums = Forum.all

View File

@@ -1,30 +1,28 @@
- seeds = Seed.interesting.first(6)
- if seeds.present?
%h2= t('.title')
- cache cache_key_for(Seed) do
- if seeds.size > 0
%table.table.table-striped
%tr
%th= t('.owner')
%th= t('.crop')
%th.hidden-xs.hidden-sm= t('.description')
%th= t('.trade_to')
%th= t('.from')
%th
%table.table.table-striped
- seeds.each do |seed|
%tr
%th= t('.owner')
%th= t('.crop')
%th.hidden-xs.hidden-sm= t('.description')
%th= t('.trade_to')
%th= t('.from')
%th
- seeds.each do |seed|
%tr
%td= link_to seed.owner.login_name, seed.owner
%td= link_to seed.crop.name, seed.crop
%td.hidden-xs.hidden-sm= truncate(seed.description, :length => 40, :separator => ' ')
%td= seed.tradable? ? seed.tradable_to : ''
%td
- if seed.tradable?
= seed.owner.location.blank? ? t('.unspecified') : truncate(seed.owner.location, :length => 25, :separator => ', ')
%td= link_to t('.details'), seed, class: 'btn btn-default btn-xs'
%td= link_to seed.owner.login_name, seed.owner
%td= link_to seed.crop.name, seed.crop
%td.hidden-xs.hidden-sm= truncate(seed.description, length: 40, separator: ' ')
%td= seed.tradable? ? seed.tradable_to : ''
%td
- if seed.tradable? && seed.owner.location.blank?
= t('.unspecified')
- elsif seed.tradable?
= truncate(seed.owner.location, length: 25, separator: ', ')
%td= link_to t('.details'), seed, class: 'btn btn-default btn-xs'
%p.text-right
= link_to "#{t('.view_all')} »", seeds_path

View File

@@ -1,8 +1,9 @@
- cache("homepage_stats") do
%p.stats
= t('.message_html', { member: link_to(t('.member_linktext', count: Member.confirmed.size.to_i), members_path),
number_crops: link_to(t('.number_crops_linktext', count: Crop.count.to_i), crops_path),
number_plantings: link_to(t('.number_plantings_linktext', count: Planting.count.to_i), plantings_path),
number_gardens: link_to(t('.number_gardens_linktext', count: Garden.count.to_i), gardens_path) })
= t('.message_html',
member: link_to(t('.member_linktext', count: Member.confirmed.size.to_i), members_path),
number_crops: link_to(t('.number_crops_linktext', count: Crop.count.to_i), crops_path),
number_plantings: link_to(t('.number_plantings_linktext', count: Planting.count.to_i), plantings_path),
number_gardens: link_to(t('.number_gardens_linktext', count: Garden.count.to_i), gardens_path))

View File

@@ -7,6 +7,6 @@
!= cms_snippet_content(:footer2)
.col-md-4#footer3
!= cms_snippet_content(:footer3)
%div(style="float: right;")
%a(href="http://opendefinition.org/ossd/")
%img(src="http://assets.okfn.org/images/ok_buttons/os_80x15_blue.png" alt="")
%div{ style: "float: right;" }
%a{ href: "http://opendefinition.org/ossd/" }
%img{ src: "http://assets.okfn.org/images/ok_buttons/os_80x15_blue.png", alt: "" }

View File

@@ -1,33 +1,36 @@
.sr-only
=link_to t(".skip"), "#skipnav"
.navbar.navbar-default.navbar-fixed-top(role="navigation")
= link_to t(".skip"), "#skipnav"
.navbar.navbar-default.navbar-fixed-top{ role: "navigation" }
.container
.navbar-header
%button.navbar-toggle(data-target="#navbar-collapse" data-toggle="collapse")
%button.navbar-toggle{ 'data-target': "#navbar-collapse", 'data-toggle': "collapse" }
%span.sr-only= t('.toggle_navigation')
%span.icon-bar
%span.icon-bar
%span.icon-bar
%a.navbar-brand.hidden-xs(href=root_path)
= image_tag("growstuff-brand.png", :size => "200x50", :alt => ENV['GROWSTUFF_SITE_NAME'])
%a.navbar-brand.visible-xs(href=root_path)
= image_tag("growstuff-apple-touch-icon-precomposed.png", :size => "50x50", :class=>"img-responsive", :alt => ENV['GROWSTUFF_SITE_NAME'])
%a.navbar-brand.hidden-xs{ href: root_path }
= image_tag("growstuff-brand.png", size: "200x50", alt: ENV['GROWSTUFF_SITE_NAME'])
%a.navbar-brand.visible-xs{ href: root_path }
= image_tag("growstuff-apple-touch-icon-precomposed.png",
size: "50x50",
class: "img-responsive",
alt: ENV['GROWSTUFF_SITE_NAME'])
.form.navbar-form.pull-left
= form_tag crops_search_path, :method => :get, :id => 'navbar-search' do
= label_tag :term, "Search crop database:", :class => 'sr-only'
= form_tag crops_search_path, method: :get, id: 'navbar-search' do
= label_tag :term, "Search crop database:", class: 'sr-only'
.input
.input-group
= text_field_tag 'term', nil, :class => 'search-query input-medium form-control', :placeholder => 'Search crops'
= text_field_tag 'term', nil, class: 'search-query input-medium form-control', placeholder: 'Search crops'
.input-group-btn
%button.btn.btn-default{:style => "height: 34px;"}
= submit_tag "Search", :class => 'btn sr-only'
%button.btn.btn-default{ style: "height: 34px;" }
= submit_tag "Search", class: 'btn sr-only'
%span.glyphicon.glyphicon-search
.navbar-collapse.collapse#navbar-collapse
%ul.nav.navbar-nav.navbar-right
%li.dropdown<
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => crops_path}
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: crops_path }
= t('.crops')
%b.caret
%ul.dropdown-menu
@@ -36,7 +39,7 @@
%li= link_to t('.plantings'), plantings_path
%li= link_to t('.harvests'), harvests_path
%li.dropdown<
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => members_path}
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: members_path }
= t('.community')
%b.caret
%ul.dropdown-menu
@@ -48,39 +51,40 @@
- if member_signed_in?
%li.dropdown<
%a.dropdown-toggle{'data-toggle' => 'dropdown', :href => root_path}
- if current_member.notifications.unread_count > 0
%a.dropdown-toggle{ 'data-toggle': 'dropdown', href: root_path }
- if current_member.notifications.unread_count.positive?
= t('.your_stuff', unread_count: current_member.notifications.unread_count)
- else
= t('.current_memberlogin_name', :current_memberlogin_name => (current_member.login_name))
= t('.current_memberlogin_name', current_memberlogin_name: current_member.login_name)
%b.caret
%ul.dropdown-menu
%li= link_to t('.profile'), member_path(current_member)
%li= link_to t('.gardens'), gardens_by_owner_path(:owner => current_member.slug)
%li= link_to t('.plantings'), plantings_by_owner_path(:owner => current_member.slug)
%li= link_to t('.harvest'), harvests_by_owner_path(:owner => current_member.slug)
%li= link_to t('.seeds'), seeds_by_owner_path(:owner => current_member.slug)
%li= link_to t('.posts'), posts_by_author_path(:author => current_member.slug)
%li= link_to t('.gardens'), gardens_by_owner_path(owner: current_member.slug)
%li= link_to t('.plantings'), plantings_by_owner_path(owner: current_member.slug)
%li= link_to t('.harvest'), harvests_by_owner_path(owner: current_member.slug)
%li= link_to t('.seeds'), seeds_by_owner_path(owner: current_member.slug)
%li= link_to t('.posts'), posts_by_author_path(author: current_member.slug)
%li= link_to t('.account'), orders_path
%li
- if current_member.notifications.unread_count > 0
= link_to(t('.inbox_unread', unread_count: current_member.notifications.unread_count), notifications_path)
- if current_member.notifications.unread_count.positive?
= link_to(t('.inbox_unread', unread_count: current_member.notifications.unread_count),
notifications_path)
- else
= link_to(t('.inbox'), notifications_path)
- if current_member.role?(:crop_wrangler) || current_member.role?(:admin)
%li{:class => 'divider', :role => 'presentation'}
%li.divider{ role: 'presentation' }
- if current_member.role?(:crop_wrangler)
%li= link_to t('.crop_wrangling'), wrangle_crops_path
- if current_member.role?(:admin)
%li= link_to t('.admin'), admin_path
%li= link_to t('.sign_out'), destroy_member_session_path, :method => :delete
%li= link_to t('.sign_out'), destroy_member_session_path, method: :delete
- else
%li= link_to t('.sign_in'), new_member_session_path, :id => 'navbar-signin'
%li= link_to t('.sign_up'), new_member_registration_path, :id => 'navbar-signup'
%li= link_to t('.sign_in'), new_member_session_path, id: 'navbar-signin'
%li= link_to t('.sign_up'), new_member_registration_path, id: 'navbar-signup'
- # anchor tag for accessibility link to skip the navigation menu
%a{:name => 'skipnav'}
-# anchor tag for accessibility link to skip the navigation menu
%a{ name: 'skipnav' }

View File

@@ -5,24 +5,33 @@
= yield(:opengraph)
- else
= tag("meta", property: "og:image", content: image_url('facebook-thumbnail.png'))
= tag("meta", property: "og:title", content: "#{content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']}")
= tag("meta", property: "og:title",
content: (content_for?(:title) ? yield(:title) + " - " : "") + ENV['GROWSTUFF_SITE_NAME'])
= tag("meta", property: "og:type", content: "website")
= tag("meta", property: "og:url", content: root_url)
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
- if (content_for?(:member_rss_login_name) && content_for(:member_rss_slug))
= auto_discovery_link_tag(:rss, { :controller => "/members", :action => 'show', :format => "rss", :id => yield(:member_rss_slug) }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] }- #{yield(:member_rss_login_name)}'s posts" })
= auto_discovery_link_tag(:rss, { :controller => "/posts", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recent posts from all members" })
= auto_discovery_link_tag(:rss, { :controller => "/crops", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recently added crops" })
= auto_discovery_link_tag(:rss, { :controller => "/plantings", :format => "rss" }, { :title => "#{ ENV['GROWSTUFF_SITE_NAME'] } - Recent plantings from all members" })
- if content_for?(:member_rss_login_name) && content_for(:member_rss_slug)
= auto_discovery_link_tag(:rss,
{ controller: "/members", action: 'show', format: "rss", id: yield(:member_rss_slug) },
title: "#{ENV['GROWSTUFF_SITE_NAME']}- #{yield(:member_rss_login_name)}'s posts")
= auto_discovery_link_tag(:rss,
{ controller: "/posts", format: "rss" },
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recent posts from all members")
= auto_discovery_link_tag(:rss,
{ controller: "/crops", format: "rss" },
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recently added crops")
= auto_discovery_link_tag(:rss,
{ controller: "/plantings", format: "rss" },
title: "#{ENV['GROWSTUFF_SITE_NAME']} - Recent plantings from all members")
%title
= content_for?(:title) ? yield(:title) + " - #{ ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']
= content_for?(:title) ? yield(:title) + " - #{ENV['GROWSTUFF_SITE_NAME']} " : ENV['GROWSTUFF_SITE_NAME']
= csrf_meta_tags
/ Le HTML5 shim, for IE6-8 support of HTML elements
/[if lt IE 9]
= javascript_include_tag "http://html5shim.googlecode.com/svn/trunk/html5.js"
= stylesheet_link_tag "application", :media => "all"
= stylesheet_link_tag "application", media: "all"
%link(href="/growstuff-apple-touch-icon-precomposed.png" rel="apple-touch-icon-precomposed")
%link{ href: "/growstuff-apple-touch-icon-precomposed.png", rel: "apple-touch-icon-precomposed" }
= favicon_link_tag 'favicon.ico'

View File

@@ -1,10 +1,10 @@
!!! 5
%html(lang="en" prefix="og: http://ogp.me/ns#")
= render :partial => "layouts/meta"
%html{ lang: "en", prefix: "og: http://ogp.me/ns#" }
= render partial: "layouts/meta"
%body
= render :partial => "layouts/header"
= render partial: "layouts/header"
#maincontainer.container
.container#maincontainer
.row
.col-md-12
- if content_for?(:title)
@@ -17,11 +17,11 @@
%p
.btn-group
= yield(:buttonbar)
= render :partial => "shared/flash_messages", flash: flash
= render partial: "shared/flash_messages", flash: flash
= yield
%footer
= render :partial => "layouts/footer"
= render partial: "layouts/footer"
/
Javascripts
\==================================================

View File

@@ -3,17 +3,17 @@
- if twitter_auth
%p
= image_tag "twitter_32.png", :size => "32x32", alt: 'Twitter logo'
= image_tag "twitter_32.png", size: "32x32", alt: 'Twitter logo'
= link_to twitter_auth.name, "http://twitter.com/#{twitter_auth.name}"
- if flickr_auth
%p
= image_tag "flickr_32.png", :size => "32x32", alt: 'Flickr logo'
= image_tag "flickr_32.png", size: "32x32", alt: 'Flickr logo'
= link_to flickr_auth.name, "http://flickr.com/photos/#{flickr_auth.uid}"
- if facebook_auth
%p
= image_tag "facebook_32.png", :size => "32x32", alt: 'Facebook logo'
= image_tag "facebook_32.png", size: "32x32", alt: 'Facebook logo'
= link_to facebook_auth.name, "http://facebook.com/profile/#{facebook_auth.uid}"
- if member.show_email

View File

@@ -10,11 +10,11 @@
%li.navbar-right
= link_to new_garden_path, class: 'btn' do
Add New Garden
.tab-content{style: "padding-top: 1em"}
.tab-content{ style: "padding-top: 1em" }
- first_garden = true
- gardens.each do |g|
%div{ class: ['tab-pane', first_garden ? 'active' : ''], id: "garden#{g.id}"}
%div{ class: ['tab-pane', first_garden ? 'active' : ''], id: "garden#{g.id}" }
- first_garden = false
.container
@@ -30,26 +30,26 @@
= link_to 'tell us more.', edit_garden_path(g)
- if g.photos.size > 0 or (can? :edit, g and can? :create, Photo)
- if !g.photos.empty? || (can?(:edit, g) && can?(:create, Photo))
.row
%h3 Photos
%p= localize_plural(g.photos, Photo)
.row
%ul.thumbnails
- g.photos.each do |p|
- g.photos.includes(:owner).each do |p|
.col-md-2.six-across
= render partial: 'photos/thumbnail', locals: { photo: p }
.row
- if can? :create, Photo and can? :edit, g
- if can?(:create, Photo) && can?(:edit, g)
%p
= link_to "Add photo", new_photo_path(type: "garden", id: g.id), class: 'btn btn-primary'
%h3 What's planted here?
.row
- if g.featured_plantings.size > 0
- unless g.featured_plantings.empty?
- g.featured_plantings.each.with_index do |planting|
.col-xs-12.col-lg-6
= render partial: "plantings/thumbnail", locals: {:planting => planting}
= render partial: "plantings/thumbnail", locals: { planting: planting }
%p
= link_to "More about this garden...", url_for(g)

View File

@@ -2,34 +2,34 @@
%ul.list-inline
%li
- unless member.plantings.empty?
- if !member.plantings.empty?
= link_to localize_plural(member.plantings, Planting), plantings_by_owner_path(owner: member)
- else
0 plantings
%li
- unless member.harvests.empty?
- if !member.harvests.empty?
= link_to localize_plural(member.harvests, Harvest), harvests_by_owner_path(owner: member)
- else
0 harvests
%li
- unless member.seeds.empty?
- if !member.seeds.empty?
= link_to localize_plural(member.seeds, Seed), seeds_by_owner_path(owner: member)
- else
0 seeds
%li
- unless member.posts.empty?
- if !member.posts.empty?
= link_to localize_plural(member.posts, Post), posts_by_author_path(author: member)
- else
0 posts
%li
- unless member.followed.empty?
- if !member.followed.empty?
= link_to localize_plural(member.followed, Follow), member_follows_path(member)
- else
0 following
%li
- unless member.followers.empty?
- if !member.followers.empty?
= link_to pluralize(member.followers.size, "follower"), member_followers_path(member)
- else
0 followers

View File

@@ -13,7 +13,7 @@
%small
%br/
Recently planted:
!= member.plantings.first(3).map{|p| link_to p.crop_name, p }.join(", ")
!= member.plantings.first(3).map { |p| link_to p.crop_name, p }.join(", ")
%p
%small
Joined
@@ -21,4 +21,7 @@
ago.
%p
%small
= [localize_plural(member.gardens, Garden), localize_plural(member.plantings, Planting), localize_plural(member.seeds, Seed)].join(", ")
= [localize_plural(member.gardens, Garden),
localize_plural(member.plantings, Planting),
localize_plural(member.seeds, Seed)].join(", ")

View File

@@ -2,7 +2,7 @@
%p Sign up for a Growstuff account to track your veggie garden and connect with other local growers.
= form_for(current_member, as: 'member', url: finish_signup_path(current_member), html: { role: 'form'}) do |f|
= form_for(current_member, as: 'member', url: finish_signup_path(current_member), html: { role: 'form' }) do |f|
- if @show_errors && current_member.errors.any?
.alert.alert-danger
- current_member.errors.full_messages.each do |msg|
@@ -31,10 +31,10 @@
.form-group
.col-md-offset-2.col-md-8.checkbox
%label
= f.check_box :newsletter, :checked => true
= f.check_box :newsletter, checked: true
Subscribe to the #{ENV['GROWSTUFF_SITE_NAME']} newsletter
.help-inline
= render partial: 'devise/registrations/newsletter_blurb'
.actions
= f.submit 'Continue', class: 'btn btn-primary'
= f.submit 'Continue', class: 'btn btn-primary'

View File

@@ -1,9 +1,12 @@
= content_for :title, t(".title", site_name: "#{ENV['GROWSTUFF_SITE_NAME']}")
= content_for :title, t(".title", site_name: ENV['GROWSTUFF_SITE_NAME'])
= form_tag(members_path, method: :get, class: 'form-inline', role: 'form') do
.form-group
= label_tag :sort, "Sort by:", class: 'sr-only'
= select_tag "sort", options_for_select({"Sort alphabetically" => 'alpha', "Sort by recently joined" => "recently_joined"}, @sort || 'alpha'), class: 'form-control'
= select_tag "sort",
options_for_select({ "Sort alphabetically": 'alpha', "Sort by recently joined": "recently_joined" },
@sort || 'alpha'),
class: 'form-control'
= submit_tag "Show", class: 'btn btn-primary'
.pagination

View File

@@ -6,7 +6,7 @@
= form_tag(nearby_members_path, method: :get, class: 'form-inline') do
= label_tag :distance, "Find members within", class: 'control-label'
= text_field_tag :distance, @distance, class: 'input-mini'
= select_tag :units, options_for_select({"miles" => :mi, "km" => :km}, @units), class: 'input-small'
= select_tag :units, options_for_select({ "miles": :mi, "km": :km }, @units), class: 'input-small'
= label_tag :location, "of", class: 'control-label'
= text_field_tag :location, @location
= submit_tag "Search", class: 'btn btn-primary'

View File

@@ -12,14 +12,14 @@
= link_to 'Edit profile', edit_member_registration_path, class: 'btn btn-default'
- if @member == current_member && !@member.paid?
= link_to "Upgrade account", shop_path, class: 'btn btn-default'
- if can? :create, Notification and current_member != @member
= link_to 'Send message', new_notification_path(:recipient_id => @member.id), class: 'btn btn-default'
- if can?(:create, Notification) && current_member != @member
= link_to 'Send message', new_notification_path(recipient_id: @member.id), class: 'btn btn-default'
- if current_member and current_member != @member # must be logged in, can't follow yourself
- if current_member && current_member != @member # must be logged in, can't follow yourself
- follow = current_member.get_follow(@member)
- if !follow and can? :create, Follow # not already following
= link_to 'Follow', follows_path(:followed_id => @member.id), method: :post, class: 'btn btn-default'
- if follow and can? :destroy, follow # already following
- if !follow && can?(:create, Follow) # not already following
= link_to 'Follow', follows_path(followed_id: @member.id), method: :post, class: 'btn btn-default'
- if follow && can?(:destroy, follow) # already following
= link_to 'Unfollow', follow_path(follow), method: :delete, class: 'btn btn-default'
- content_for :member_rss_login_name, @member.login_name
@@ -35,4 +35,7 @@
= render partial: "avatar", locals: { member: @member }
= render partial: "account", locals: { member: @member }
= render partial: "stats", locals: { member: @member }
= render partial: "contact", locals: { member: @member, :twitter_auth => @twitter_auth, :flickr_auth => @flickr_auth, :facebook_auth => @facebook_auth }
= render partial: "contact", locals: { member: @member,
twitter_auth: @twitter_auth,
flickr_auth: @flickr_auth,
facebook_auth: @facebook_auth }

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
%rss{version: 2.0}
%rss{ version: 2.0 }
%channel
%title #{@member.login_name}'s recent posts (#{ENV['GROWSTUFF_SITE_NAME']})
%link= member_url(@member)
- @posts.each do |post|
%item
%title #{post.subject} by #{post.author.login_name}
%pubDate= post.created_at.to_s(:rfc822)
%pubdate= post.created_at.to_s(:rfc822)
%link= post_url(post)
%guid= post_url(post)
%description

View File

@@ -10,4 +10,4 @@
.well
:growstuff_markdown
#{ strip_tags(notification.body) }
#{ strip_tags(notification.body) }

View File

@@ -18,10 +18,6 @@
= link_to "approve or reject this request", edit_crop_url(@request)
\.
%p
Or, discuss this and other crop wrangling issues in our
= link_to "crop wrangling forum", "http://talk.growstuff.org/c/crop-wrangling"
%p
Thanks for your help!

View File

@@ -0,0 +1,4 @@
- if can? :edit, photo
= link_to photo_associations_path(photo_id: photo.id, type: type, id: thing.id),
method: 'delete', class: 'btn btn-default btn-xs' do
%span.glyphicon.glyphicon-remove{ title: "Remove link" }

View File

@@ -0,0 +1,21 @@
%h4 This photo depicts:
%ul
- @photo.plantings.each do |planting|
%li
= link_to t('photos.show.planting', planting: planting.to_s, owner: planting.owner.to_s), planting_path(planting)
= render partial: "photo_association_delete", locals: { photo: @photo, type: 'planting', thing: planting }
- @photo.harvests.each do |harvest|
%li
= link_to t('photos.show.harvest', crop: harvest.crop.name, owner: harvest.owner.to_s), harvest_path(harvest)
= render partial: "photo_association_delete", locals: { photo: @photo, type: 'harvest', thing: harvest }
- @photo.gardens.each do |garden|
%li
= link_to t('photos.show.garden', garden: garden.to_s, owner: garden.owner.to_s), garden_path(garden)
= render partial: "photo_association_delete", locals: { photo: @photo, type: 'garden', thing: garden }
- @photo.seeds.each do |seed|
%li
= link_to t('photos.show.seed', seed: seed.to_s, owner: seed.owner.to_s), seed_path(seed)
= render partial: "photo_association_delete", locals: { photo: @photo, type: 'seed', thing: seed }

View File

@@ -1,2 +1,5 @@
- content_for :title, "Edit Photo"
= form_for(@photo) do |f|
= f.label :title
= f.text_field :title, placeholder: "title"
= f.submit

View File

@@ -36,5 +36,5 @@
- else
.alert
You must
= link_to "connect your account to Flickr", '/auth/flickr'
= link_to "connect your account to Flickr", '/members/auth/flickr'
to add photos.

Some files were not shown because too many files have changed in this diff Show More