Compare commits

..

156 Commits

Author SHA1 Message Date
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
145 changed files with 1111 additions and 1319 deletions

3
.gitignore vendored
View File

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

View File

@@ -32,7 +32,7 @@ Metrics/MethodLength:
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
# Set to 30 once all methods are fixed.
# Max: 30
Max: 104
Max: 34
# Remove the following once the code style matches
# Offense count: 59

View File

@@ -55,7 +55,7 @@ Lint/Void:
# Offense count: 55
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Exclude:
Exclude:
- '**/*'
# Offense count: 2
@@ -65,19 +65,6 @@ Performance/StringReplacement:
- '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:
@@ -90,13 +77,6 @@ Rails/OutputSafety:
- '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
@@ -148,11 +128,9 @@ 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'
@@ -204,12 +182,6 @@ 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:
@@ -225,7 +197,6 @@ 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'
@@ -269,31 +240,6 @@ 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:
@@ -307,54 +253,6 @@ Style/MultilineIfThen:
- '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:
@@ -377,7 +275,6 @@ Style/NegatedIf:
# Offense count: 2
Style/NestedTernaryOperator:
Exclude:
- 'app/controllers/harvests_controller.rb'
- 'app/controllers/plantings_controller.rb'
# Offense count: 1
@@ -425,15 +322,6 @@ 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.
@@ -506,44 +394,12 @@ 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:

View File

@@ -4,12 +4,16 @@ 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
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch
- 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
before_install:
@@ -24,15 +28,20 @@ before_install:
fi
- phantomjs --version
before_script:
- bundle exec rake db:create db:migrate db:test:prepare
- bundle exec rake assets:precompile
- >
if [ "$STATIC_CHECKS" != 'true' ]; then
bundle exec rake db:create db:migrate db:test:prepare
bundle exec rake assets:precompile
fi
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/
- >
if [ "$STATIC_CHECKS" = 'true' ]; then
bundle exec script/check_static
else
bundle exec rake db:migrate --trace
bundle exec rspec --tag $RSPEC_TAG spec/
bundle exec rake jasmine:ci
fi
services:
- elasticsearch
before_deploy:

View File

@@ -7,7 +7,27 @@ 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` to run all tests and static checks
- `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.
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

@@ -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
@@ -80,6 +80,7 @@ gem 'd3-rails'
# See https://github.com/elastic/elasticsearch-ruby#compatibility
gem "elasticsearch-api", "~> 2.0.0"
gem "elasticsearch-model"
gem "hashie", ">= 3.5.3"
gem "elasticsearch-rails"
gem 'rake', '>= 10.0.0'

View File

@@ -30,7 +30,7 @@ GEM
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
activemerchant (1.61.0)
activemerchant (1.63.0)
activesupport (>= 3.2.14, < 5.1)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
@@ -71,11 +71,11 @@ 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)
byebug (9.0.6)
cancancan (1.15.0)
capybara (2.10.1)
cancancan (1.16.0)
capybara (2.12.0)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -88,7 +88,7 @@ GEM
capybara-screenshot (1.0.14)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
childprocess (0.6.1)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.1.0)
cliver (0.3.2)
@@ -148,17 +148,17 @@ 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.1)
elasticsearch-api (= 2.0.1)
elasticsearch-transport (= 2.0.1)
elasticsearch-api (2.0.1)
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.1)
faraday
multi_json
erubis (2.7.0)
@@ -175,12 +175,12 @@ GEM
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)
@@ -189,7 +189,7 @@ GEM
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)
@@ -222,7 +222,7 @@ GEM
rake (>= 10, < 13)
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashie (3.4.6)
hashie (3.5.3)
heroku-api (0.4.2)
excon (~> 0.45)
multi_json (~> 1.8)
@@ -234,8 +234,8 @@ GEM
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.0)
i18n-tasks (0.9.12)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -265,7 +265,7 @@ GEM
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,7 +295,7 @@ GEM
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.17.1.326)
newrelic_rpm (3.18.1.330)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
notiffany (0.1.1)
@@ -332,13 +332,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)
phantomjs (2.1.1.0)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.11.0)
poltergeist (1.13.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
@@ -391,9 +391,9 @@ GEM
raindrops (0.17.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)
@@ -432,7 +432,7 @@ GEM
ruby_dep (1.5.0)
ruby_parser (3.8.4)
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 +440,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.0.8)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
sexp_processor (4.7.0)
shellany (0.0.1)
sidekiq (4.1.4)
sidekiq (4.2.9)
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)
@@ -478,8 +474,8 @@ GEM
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.13.0)
tilt (2.0.6)
tins (1.13.2)
trollop (1.16.2)
tzinfo (1.2.2)
thread_safe (~> 0.1)
@@ -487,17 +483,17 @@ GEM
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode-display_width (1.1.3)
unicorn (5.1.0)
unicorn (5.2.0)
kgio (~> 2.6)
raindrops (~> 0.7)
warden (1.2.6)
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)
@@ -550,6 +546,7 @@ DEPENDENCIES
haml-i18n-extractor
haml-rails
haml_lint
hashie (>= 3.5.3)
heroku-api
i18n-tasks
jasmine
@@ -558,7 +555,7 @@ DEPENDENCIES
js-routes
kaminari
leaflet-markercluster-rails
leaflet-rails
leaflet-rails (~> 0.7.7)
letter_opener
memcachier
newrelic_rpm

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

@@ -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,85 +11,52 @@ 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
@@ -95,7 +64,6 @@ class GardensController < ApplicationController
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.paginate(page: params[:page])
end
end

View File

@@ -1,48 +1,34 @@
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
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 +40,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 +67,29 @@ 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
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

@@ -45,10 +45,11 @@ class MembersController < ApplicationController
:latitude, :longitude
])
}
format.rss { render(
layout: false,
locals: { member: @member }
)}
format.rss {
render(
layout: false,
locals: { member: @member }
)}
end
end

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

@@ -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

@@ -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

@@ -12,7 +12,7 @@ module CropsHelper
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

@@ -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

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

@@ -28,7 +28,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 +65,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"

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

@@ -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

@@ -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

@@ -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,6 +1,6 @@
.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|
@@ -14,7 +14,7 @@
.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.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,7 +30,7 @@
= 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)
@@ -40,16 +40,16 @@
.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

@@ -15,3 +15,4 @@
= link_to 'Plant something', new_planting_path, class: 'btn btn-primary'
- else
= render partial: 'shared/signin_signup', locals: { to: "track what you've planted" }

View File

@@ -1,2 +1,3 @@
.progress
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}" }

View File

@@ -45,7 +45,6 @@
planting, method: :delete,
data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs'
.row
.col-xs-12.col-md-4
%dl

View File

@@ -27,7 +27,6 @@
= link_to @planting.garden, @planting.garden
- unless @planting.owner.location.blank?
(#{@planting.owner.location})
%dt Quantity:
%dd
= display_planting_quantity(@planting)

View File

@@ -40,10 +40,13 @@
= pluralize(post.likes.count, "like") unless post.likes.empty?
- if member_signed_in?
- if !post.members.include? current_member
= link_to 'Like', likes_path(Like.new, post_id: post.id, format: :json),
method: :post, remote: true, class: 'post-like'
- if can?(:new, Like)
= link_to 'Like', likes_path(post_id: post.id, format: :json),
method: :post, remote: true, class: 'post-like'
- else
- like = post.likes.find_by(member: current_member)
- if like
= link_to 'Unlike', like_path(like, format: :json),
- if like && can?(:destroy, like)
= link_to 'Unlike', like_path(id: like.id, format: :json),
method: :delete, remote: true, class: 'post-like'

View File

@@ -1,17 +1,19 @@
= form_for @product do |f|
- if @product.errors.any?
#error_explanation
%h2= "#{pluralize(@product.errors.size, "error")} prohibited this product from being saved:"
%h2
= pluralize(@product.errors.size, "error")
prohibited this product from being saved:
%ul
- @product.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :name
= f.text_field :name, :class => 'form-control'
= f.text_field :name, class: 'form-control'
.field
= f.label :description
= f.text_area :description, :class => 'form-control'
= f.text_area :description, class: 'form-control'
.field
= f.label :min_price, "Minimum price (in cents)"
= f.text_field :min_price
@@ -21,7 +23,7 @@
.field
= f.label :account_type
= collection_select(:product, :account_type_id, AccountType.all, :id,
:name, :selected => @product.account_type_id )
:name, selected: @product.account_type_id)
.field
= f.label :paid_months
= f.text_field :paid_months

View File

@@ -22,7 +22,7 @@
%td= product.paid_months
%td= link_to 'Show', product
%td= link_to 'Edit', edit_product_path(product)
%td= link_to 'Destroy', product, :method => :delete, :data => { :confirm => 'Are you sure?' }
%td= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' }
%br

View File

@@ -1,7 +1,9 @@
= form_for @scientific_name, :html => {:class => 'form-horizontal', :role => "form"} do |f|
= form_for @scientific_name, html: { class: 'form-horizontal', role: "form" } do |f|
- if @scientific_name.errors.any?
#error_explanation
%h2= "#{pluralize(@scientific_name.errors.size, "error")} prohibited this scientific_name from being saved:"
%h2
= pluralize(@scientific_name.errors.size, "error")
prohibited this scientific_name from being saved:
%ul
- @scientific_name.errors.full_messages.each do |msg|
%li= msg
@@ -9,17 +11,19 @@
%p
%span.help-block
For detailed crop wrangling guidelines, please consult the
=link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
= link_to "crop wrangling guide", "http://wiki.growstuff.org/index.php/Crop_wrangling"
on the Growstuff wiki.
.form-group
= f.label :crop_id, :class => 'control-label col-md-2'
= f.label :crop_id, class: 'control-label col-md-2'
.col-md-8
= collection_select(:scientific_name, :crop_id, Crop.all, :id, :name, { :selected => @scientific_name.crop_id || @crop.id }, :class => 'form-control')
= collection_select(:scientific_name, :crop_id, Crop.all, :id,
:name, { selected: @scientific_name.crop_id || @crop.id },
class: 'form-control')
.form-group
= f.label :name, :class => 'control-label col-md-2'
= f.label :name, class: 'control-label col-md-2'
.col-md-8
= f.text_field :name, :class => 'form-control'
= f.text_field :name, 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'

View File

@@ -1,7 +1,7 @@
- content_for :title, "Listing scientific names"
- if can? :create, ScientificName
%p= link_to 'New Scientific name', new_scientific_name_path, :class => 'btn btn-primary'
%p= link_to 'New Scientific name', new_scientific_name_path, class: 'btn btn-primary'
%table
%tr
@@ -17,7 +17,8 @@
%td= link_to 'Show', scientific_name
%td
- if can? :edit, scientific_name
= link_to 'Edit', edit_scientific_name_path(scientific_name), :class => 'btn btn-default btn-xs'
= link_to 'Edit', edit_scientific_name_path(scientific_name), class: 'btn btn-default btn-xs'
%td
- if can? :destroy, scientific_name
= link_to 'Delete', scientific_name, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-default btn-xs'
= link_to 'Delete', scientific_name, method: :delete, data: { confirm: 'Are you sure?' },
class: 'btn btn-default btn-xs'

View File

@@ -9,7 +9,7 @@
%p#notice= notice
= render :partial => 'crops/approval_status_message', :locals => { :crop => @scientific_name.crop }
= render partial: 'crops/approval_status_message', locals: { crop: @scientific_name.crop }
%p
%b Scientific name:
@@ -20,6 +20,6 @@
- if can? :edit, @scientific_name
= link_to 'Edit', edit_scientific_name_path(@scientific_name), :class => 'btn btn-default btn-xs'
= link_to 'Edit', edit_scientific_name_path(@scientific_name), class: 'btn btn-default btn-xs'
\|
= link_to 'Back', scientific_names_path

View File

@@ -9,7 +9,8 @@
.row
.col-md-4
= link_to image_tag((seed.crop.default_photo ? seed.crop.default_photo.thumbnail_url : 'placeholder_150.png'),
alt: seed.crop.name, class: 'img'), seed.crop
alt: seed.crop.name, class: 'img'),
seed.crop
.col-md-8
%dl.dl-horizontal
%dt Crop :

View File

@@ -9,5 +9,5 @@
%strong Paid until:
= current_member.account.paid_until_string
- if !current_member.paid?
= link_to "Upgrade and support #{ENV['GROWSTUFF_SITE_NAME']}", shop_path, :class => 'btn btn-primary'
- unless current_member.paid?
= link_to "Upgrade and support #{ENV['GROWSTUFF_SITE_NAME']}", shop_path, class: 'btn btn-primary'

View File

@@ -1,2 +1,2 @@
%span.help-block.optional
= I18n.t 'optional', :scope => 'forms'
= I18n.t 'optional', scope: 'forms'

View File

@@ -1,5 +1,5 @@
You can use
=link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax/'
= link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax/'
to format your text.
%br/
For instance, *italic*, **bold**, or a link [like this](http://to.some.site.com/).

View File

@@ -1,6 +1,6 @@
=link_to 'Sign in', new_member_session_path
= link_to 'Sign in', new_member_session_path
or
=link_to 'sign up', new_member_registration_path
= link_to 'sign up', new_member_registration_path
to
= succeed "." do
= to

View File

@@ -6,9 +6,9 @@ Growstuff::Application.configure do
# preloads Rails for running tests, you may have to set it to true.
config.eager_load = false
# Do not compile assets on-demand. On-demand compilation slows down the test
# suite and causes random test failures.
config.assets.compile = false
# Allow lazy compilation of assets. Required for running Jasmine tests via
# `rake spec:javascript`.
config.assets.compile = true
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
@@ -66,7 +66,7 @@ Geocoder::Lookup::Test.add_stub(
"Amundsen-Scott Base, Antarctica", [
{
'latitude' => -90.0,
'longitude' => 0.0,
'longitude' => 0.0
}
]
)
@@ -89,7 +89,7 @@ Geocoder::Lookup::Test.add_stub(
"Greenwich, UK", [
{
'latitude' => 51.483061,
'longitude' => -0.004151,
'longitude' => -0.004151
}
]
)
@@ -98,7 +98,7 @@ Geocoder::Lookup::Test.add_stub(
"Edinburgh", [
{
'latitude' => 55.953252,
'longitude' => -3.188267,
'longitude' => -3.188267
}
]
)

View File

@@ -1,6 +1,6 @@
ActionDispatch::Callbacks.after do
# Reload the factories
return unless (Rails.env.development? || Rails.env.test?)
return unless Rails.env.development? || Rails.env.test?
unless FactoryGirl.factories.blank? # first init will load factories, this should only run on subsequent reloads
FactoryGirl.factories.clear

View File

@@ -1,6 +1,6 @@
class RenameNotificationFields < ActiveRecord::Migration
def change
change_table :notifications do |t|
change_table :notifications do |t| # rubocop:disable Rails/ReversibleMigration
t.rename :to_id, :recipient_id
t.rename :from_id, :sender_id
end

View File

@@ -17,7 +17,7 @@ ActiveRecord::Schema.define(version: 20170104035248) do
enable_extension "plpgsql"
create_table "account_types", force: :cascade do |t|
t.string "name", null: false
t.string "name", limit: 255, null: false
t.boolean "is_paid"
t.boolean "is_permanent_paid"
t.datetime "created_at"
@@ -33,31 +33,31 @@ ActiveRecord::Schema.define(version: 20170104035248) do
end
create_table "alternate_names", force: :cascade do |t|
t.string "name", null: false
t.integer "crop_id", null: false
t.integer "creator_id", null: false
t.string "name", limit: 255, null: false
t.integer "crop_id", null: false
t.integer "creator_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "authentications", force: :cascade do |t|
t.integer "member_id", null: false
t.string "provider", null: false
t.string "uid"
t.string "token"
t.string "secret"
t.integer "member_id", null: false
t.string "provider", limit: 255, null: false
t.string "uid", limit: 255
t.string "token", limit: 255
t.string "secret", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
t.string "name", limit: 255
end
add_index "authentications", ["member_id"], name: "index_authentications_on_member_id", using: :btree
create_table "comfy_cms_blocks", force: :cascade do |t|
t.string "identifier", null: false
t.string "identifier", limit: 255, null: false
t.text "content"
t.integer "blockable_id"
t.string "blockable_type"
t.string "blockable_type", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
@@ -66,17 +66,17 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "comfy_cms_blocks", ["identifier"], name: "index_comfy_cms_blocks_on_identifier", using: :btree
create_table "comfy_cms_categories", force: :cascade do |t|
t.integer "site_id", null: false
t.string "label", null: false
t.string "categorized_type", null: false
t.integer "site_id", null: false
t.string "label", limit: 255, null: false
t.string "categorized_type", limit: 255, null: false
end
add_index "comfy_cms_categories", ["site_id", "categorized_type", "label"], name: "index_cms_categories_on_site_id_and_cat_type_and_label", unique: true, using: :btree
create_table "comfy_cms_categorizations", force: :cascade do |t|
t.integer "category_id", null: false
t.string "categorized_type", null: false
t.integer "categorized_id", null: false
t.integer "category_id", null: false
t.string "categorized_type", limit: 255, null: false
t.integer "categorized_id", null: false
end
add_index "comfy_cms_categorizations", ["category_id", "categorized_type", "categorized_id"], name: "index_cms_categorizations_on_cat_id_and_catd_type_and_catd_id", unique: true, using: :btree
@@ -84,9 +84,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
create_table "comfy_cms_files", force: :cascade do |t|
t.integer "site_id", null: false
t.integer "block_id"
t.string "label", null: false
t.string "file_file_name", null: false
t.string "file_content_type", null: false
t.string "label", limit: 255, null: false
t.string "file_file_name", limit: 255, null: false
t.string "file_content_type", limit: 255, null: false
t.integer "file_file_size", null: false
t.string "description", limit: 2048
t.integer "position", default: 0, null: false
@@ -100,16 +100,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "comfy_cms_files", ["site_id", "position"], name: "index_comfy_cms_files_on_site_id_and_position", using: :btree
create_table "comfy_cms_layouts", force: :cascade do |t|
t.integer "site_id", null: false
t.integer "site_id", null: false
t.integer "parent_id"
t.string "app_layout"
t.string "label", null: false
t.string "identifier", null: false
t.string "app_layout", limit: 255
t.string "label", limit: 255, null: false
t.string "identifier", limit: 255, null: false
t.text "content"
t.text "css"
t.text "js"
t.integer "position", default: 0, null: false
t.boolean "is_shared", default: false, null: false
t.integer "position", default: 0, null: false
t.boolean "is_shared", default: false, null: false
t.datetime "created_at"
t.datetime "updated_at"
end
@@ -118,18 +118,18 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "comfy_cms_layouts", ["site_id", "identifier"], name: "index_comfy_cms_layouts_on_site_id_and_identifier", unique: true, using: :btree
create_table "comfy_cms_pages", force: :cascade do |t|
t.integer "site_id", null: false
t.integer "site_id", null: false
t.integer "layout_id"
t.integer "parent_id"
t.integer "target_page_id"
t.string "label", null: false
t.string "slug"
t.string "full_path", null: false
t.string "label", limit: 255, null: false
t.string "slug", limit: 255
t.string "full_path", limit: 255, null: false
t.text "content_cache"
t.integer "position", default: 0, null: false
t.integer "children_count", default: 0, null: false
t.boolean "is_published", default: true, null: false
t.boolean "is_shared", default: false, null: false
t.integer "position", default: 0, null: false
t.integer "children_count", default: 0, null: false
t.boolean "is_published", default: true, null: false
t.boolean "is_shared", default: false, null: false
t.datetime "created_at"
t.datetime "updated_at"
end
@@ -138,8 +138,8 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "comfy_cms_pages", ["site_id", "full_path"], name: "index_comfy_cms_pages_on_site_id_and_full_path", using: :btree
create_table "comfy_cms_revisions", force: :cascade do |t|
t.string "record_type", null: false
t.integer "record_id", null: false
t.string "record_type", limit: 255, null: false
t.integer "record_id", null: false
t.text "data"
t.datetime "created_at"
end
@@ -147,24 +147,24 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "comfy_cms_revisions", ["record_type", "record_id", "created_at"], name: "index_cms_revisions_on_rtype_and_rid_and_created_at", using: :btree
create_table "comfy_cms_sites", force: :cascade do |t|
t.string "label", null: false
t.string "identifier", null: false
t.string "hostname", null: false
t.string "path"
t.string "locale", default: "en", null: false
t.boolean "is_mirrored", default: false, null: false
t.string "label", limit: 255, null: false
t.string "identifier", limit: 255, null: false
t.string "hostname", limit: 255, null: false
t.string "path", limit: 255
t.string "locale", limit: 255, default: "en", null: false
t.boolean "is_mirrored", default: false, null: false
end
add_index "comfy_cms_sites", ["hostname"], name: "index_comfy_cms_sites_on_hostname", using: :btree
add_index "comfy_cms_sites", ["is_mirrored"], name: "index_comfy_cms_sites_on_is_mirrored", using: :btree
create_table "comfy_cms_snippets", force: :cascade do |t|
t.integer "site_id", null: false
t.string "label", null: false
t.string "identifier", null: false
t.integer "site_id", null: false
t.string "label", limit: 255, null: false
t.string "identifier", limit: 255, null: false
t.text "content"
t.integer "position", default: 0, null: false
t.boolean "is_shared", default: false, null: false
t.integer "position", default: 0, null: false
t.boolean "is_shared", default: false, null: false
t.datetime "created_at"
t.datetime "updated_at"
end
@@ -181,16 +181,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
end
create_table "crops", force: :cascade do |t|
t.string "name", null: false
t.string "en_wikipedia_url"
t.string "name", limit: 255, null: false
t.string "en_wikipedia_url", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
t.integer "parent_id"
t.integer "plantings_count", default: 0
t.integer "plantings_count", default: 0
t.integer "creator_id"
t.integer "requester_id"
t.string "approval_status", default: "approved"
t.string "approval_status", limit: 255, default: "approved"
t.text "reason_for_rejection"
t.text "request_notes"
t.text "rejection_notes"
@@ -216,29 +216,29 @@ ActiveRecord::Schema.define(version: 20170104035248) do
end
create_table "forums", force: :cascade do |t|
t.string "name", null: false
t.text "description", null: false
t.integer "owner_id", null: false
t.string "name", limit: 255, null: false
t.text "description", null: false
t.integer "owner_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
end
add_index "forums", ["slug"], name: "index_forums_on_slug", unique: true, using: :btree
create_table "gardens", force: :cascade do |t|
t.string "name", null: false
t.string "name", limit: 255, null: false
t.integer "owner_id"
t.string "slug", null: false
t.string "slug", limit: 255, null: false
t.datetime "created_at"
t.datetime "updated_at"
t.text "description"
t.boolean "active", default: true
t.string "location"
t.boolean "active", default: true
t.string "location", limit: 255
t.float "latitude"
t.float "longitude"
t.decimal "area"
t.string "area_unit"
t.string "area_unit", limit: 255
end
add_index "gardens", ["owner_id"], name: "index_gardens_on_owner_id", using: :btree
@@ -252,17 +252,17 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "gardens_photos", ["garden_id", "photo_id"], name: "index_gardens_photos_on_garden_id_and_photo_id", using: :btree
create_table "harvests", force: :cascade do |t|
t.integer "crop_id", null: false
t.integer "owner_id", null: false
t.integer "crop_id", null: false
t.integer "owner_id", null: false
t.date "harvested_at"
t.decimal "quantity"
t.string "unit"
t.string "unit", limit: 255
t.text "description"
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
t.decimal "weight_quantity"
t.string "weight_unit"
t.string "weight_unit", limit: 255
t.integer "plant_part_id"
t.float "si_weight"
t.integer "planting_id"
@@ -291,38 +291,38 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "likes", ["member_id"], name: "index_likes_on_member_id", using: :btree
create_table "members", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.string "email", limit: 255, default: "", null: false
t.string "encrypted_password", limit: 255, default: "", null: false
t.string "reset_password_token", limit: 255
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0
t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "confirmation_token"
t.string "current_sign_in_ip", limit: 255
t.string "last_sign_in_ip", limit: 255
t.string "confirmation_token", limit: 255
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.string "unconfirmed_email"
t.integer "failed_attempts", default: 0
t.string "unlock_token"
t.string "unconfirmed_email", limit: 255
t.integer "failed_attempts", default: 0
t.string "unlock_token", limit: 255
t.datetime "locked_at"
t.datetime "created_at"
t.datetime "updated_at"
t.string "login_name"
t.string "slug"
t.string "login_name", limit: 255
t.string "slug", limit: 255
t.boolean "tos_agreement"
t.boolean "show_email"
t.string "location"
t.string "location", limit: 255
t.float "latitude"
t.float "longitude"
t.boolean "send_notification_email", default: true
t.boolean "send_notification_email", default: true
t.text "bio"
t.integer "plantings_count"
t.boolean "newsletter"
t.boolean "send_planting_reminder", default: true
t.string "preferred_avatar_uri"
t.boolean "send_planting_reminder", default: true
t.string "preferred_avatar_uri", limit: 255
end
add_index "members", ["confirmation_token"], name: "index_members_on_confirmation_token", unique: true, using: :btree
@@ -338,10 +338,10 @@ ActiveRecord::Schema.define(version: 20170104035248) do
create_table "notifications", force: :cascade do |t|
t.integer "sender_id"
t.integer "recipient_id", null: false
t.string "subject"
t.integer "recipient_id", null: false
t.string "subject", limit: 255
t.text "body"
t.boolean "read", default: false
t.boolean "read", default: false
t.integer "post_id"
t.datetime "created_at"
t.datetime "updated_at"
@@ -361,9 +361,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
t.datetime "updated_at"
t.datetime "completed_at"
t.integer "member_id"
t.string "paypal_express_token"
t.string "paypal_express_payer_id"
t.string "referral_code"
t.string "paypal_express_token", limit: 255
t.string "paypal_express_payer_id", limit: 255
t.string "referral_code", limit: 255
end
create_table "orders_products", id: false, force: :cascade do |t|
@@ -372,16 +372,16 @@ ActiveRecord::Schema.define(version: 20170104035248) do
end
create_table "photos", force: :cascade do |t|
t.integer "owner_id", null: false
t.string "thumbnail_url", null: false
t.string "fullsize_url", null: false
t.integer "owner_id", null: false
t.string "thumbnail_url", limit: 255, null: false
t.string "fullsize_url", limit: 255, null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "title", null: false
t.string "license_name", null: false
t.string "license_url"
t.string "link_url", null: false
t.string "flickr_photo_id"
t.string "title", limit: 255, null: false
t.string "license_name", limit: 255, null: false
t.string "license_url", limit: 255
t.string "link_url", limit: 255, null: false
t.string "flickr_photo_id", limit: 255
end
create_table "photos_plantings", id: false, force: :cascade do |t|
@@ -397,25 +397,25 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "photos_seeds", ["seed_id", "photo_id"], name: "index_photos_seeds_on_seed_id_and_photo_id", using: :btree
create_table "plant_parts", force: :cascade do |t|
t.string "name"
t.string "name", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
end
create_table "plantings", force: :cascade do |t|
t.integer "garden_id", null: false
t.integer "crop_id", null: false
t.integer "garden_id", null: false
t.integer "crop_id", null: false
t.date "planted_at"
t.integer "quantity"
t.text "description"
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "sunniness"
t.string "planted_from"
t.string "slug", limit: 255
t.string "sunniness", limit: 255
t.string "planted_from", limit: 255
t.integer "owner_id"
t.boolean "finished", default: false
t.boolean "finished", default: false
t.date "finished_at"
t.integer "days_before_maturity"
end
@@ -423,12 +423,12 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "plantings", ["slug"], name: "index_plantings_on_slug", unique: true, using: :btree
create_table "posts", force: :cascade do |t|
t.integer "author_id", null: false
t.string "subject", null: false
t.text "body", null: false
t.integer "author_id", null: false
t.string "subject", limit: 255, null: false
t.text "body", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
t.integer "forum_id"
end
@@ -436,9 +436,9 @@ ActiveRecord::Schema.define(version: 20170104035248) do
add_index "posts", ["slug"], name: "index_posts_on_slug", unique: true, using: :btree
create_table "products", force: :cascade do |t|
t.string "name", null: false
t.text "description", null: false
t.integer "min_price", null: false
t.string "name", limit: 255, null: false
t.text "description", null: false
t.integer "min_price", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.integer "account_type_id"
@@ -447,38 +447,38 @@ ActiveRecord::Schema.define(version: 20170104035248) do
end
create_table "roles", force: :cascade do |t|
t.string "name", null: false
t.string "name", limit: 255, null: false
t.text "description"
t.datetime "created_at"
t.datetime "updated_at"
t.string "slug"
t.string "slug", limit: 255
end
add_index "roles", ["slug"], name: "index_roles_on_slug", unique: true, using: :btree
create_table "scientific_names", force: :cascade do |t|
t.string "name", null: false
t.integer "crop_id", null: false
t.string "name", limit: 255, null: false
t.integer "crop_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.integer "creator_id"
end
create_table "seeds", force: :cascade do |t|
t.integer "owner_id", null: false
t.integer "crop_id", null: false
t.integer "owner_id", null: false
t.integer "crop_id", null: false
t.text "description"
t.integer "quantity"
t.date "plant_before"
t.datetime "created_at"
t.datetime "updated_at"
t.string "tradable_to", default: "nowhere"
t.string "slug"
t.string "tradable_to", limit: 255, default: "nowhere"
t.string "slug", limit: 255
t.integer "days_until_maturity_min"
t.integer "days_until_maturity_max"
t.text "organic", default: "unknown"
t.text "gmo", default: "unknown"
t.text "heirloom", default: "unknown"
t.text "organic", default: "unknown"
t.text "gmo", default: "unknown"
t.text "heirloom", default: "unknown"
end
add_index "seeds", ["slug"], name: "index_seeds_on_slug", unique: true, using: :btree

View File

@@ -98,7 +98,7 @@ def load_test_users # rubocop:disable Metrics/AbcSize
Planting.create(
owner_id: @user.id,
garden_id: @user.gardens.first.id,
planted_at: Date.today,
planted_at: Time.zone.today,
crop_id: Crop.find(i % Crop.all.size + 1).id,
sunniness: select_random_item(Planting::SUNNINESS_VALUES),
planted_from: select_random_item(Planting::PLANTED_FROM_VALUES)
@@ -172,7 +172,7 @@ def load_products
name: "Seed account",
description: "Paid account, in perpetuity",
min_price: 15000,
account_type_id: @seed_account.id,
account_type_id: @seed_account.id
)
end

View File

@@ -43,7 +43,7 @@ class Growstuff::OauthSignupAction
.create_with(
name: name,
token: auth['credentials']['token'],
secret: auth['credentials']['secret'],
secret: auth['credentials']['secret']
)
.find_or_create_by(
provider: auth['provider'],

View File

@@ -51,7 +51,7 @@ namespace :growstuff do
send_on_day = 3 # wednesday
every_n_weeks = 2 # send fortnightly
if Date.today.cwday == send_on_day and Date.today.cweek % every_n_weeks == 0
if Time.zone.today.cwday == send_on_day and Time.zone.today.cweek % every_n_weeks == 0
Member.confirmed.find_each do |m|
Notifier.planting_reminder(m).deliver_now!
end
@@ -135,7 +135,7 @@ namespace :growstuff do
"a paid account, in perpetuity. This account "\
"type never expires.",
min_price: 15000,
account_type_id: @seed_account.id,
account_type_id: @seed_account.id
)
puts "Giving each member an account record..."
@@ -303,7 +303,7 @@ namespace :growstuff do
alternate_names.split(/,\s*/).each do |an|
AlternateName.where(
name: an,
crop_id: crop.id,
crop_id: crop.id
).first_or_create do |x|
x.creator = cropbot
end

View File

@@ -2,8 +2,25 @@ require 'rake'
begin
require 'rspec/core/rake_task'
task(:spec).clear
RSpec::Core::RakeTask.new(spec: ['db:create', 'db:test:prepare']) do |t|
RSpec::Core::RakeTask.new(spec: ['db:create',
'db:test:prepare',
'assets:precompile']) do |t|
t.verbose = false
end
rescue LoadError
end
desc "Run static code-quality checks"
task :static do
system('script/check_static')
end
namespace :spec do
desc "Run only unit tests"
task unit: ['jasmine:ci'] do
suites = %w(controllers helpers lib mailers models requests routing views)
system('rspec', *suites.collect { |s| "spec/#{s}" })
end
end
task default: [:static, :spec, 'jasmine:ci']

18
script/check_conflicts Executable file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/env ruby
require 'open3'
# We don't want to include the literal conflict marker here, or we'll match the
# script itself!
conflict_marker = '<' * 5
# Search for checked-in files containing conflict markers
# -l List only matching files
# -I Ignore binary files
_, stdout, _, wait_thr = Open3.popen3("git", "grep", "-Il", conflict_marker)
exit_code = wait_thr.value.exitstatus
if exit_code.zero?
puts "The following files appear to contain merge conflicts:"
puts stdout.gets(nil)
end

View File

@@ -4,6 +4,6 @@ require 'set'
changed_file_list = `git diff --name-only --diff-filter=ACMRTUXB origin/dev...`
files = Set.new changed_file_list.split
if (files.include? "Gemfile") && !(files.include? "Gemfile.lock") then
abort "Looks like you committed changes to Gemfile but not Gemfile.lock"
if (files.include? "Gemfile") && !(files.include? "Gemfile.lock")
abort "Looks like you committed changes to Gemfile but not Gemfile.lock\n\n"
end

13
script/check_static Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/env ruby
checks = [
'script/check_gemfile',
'script/check_contributors_md',
'script/check_conflicts',
'rubocop --display-cop-names --rails',
"haml-lint app/views"
]
return_values = checks.collect { |t| system(t) }
failures = return_values.count(&:!)
abort "#{failures} static check(s) failed" unless failures.zero?

View File

@@ -21,7 +21,7 @@ describe CommentsController do
def valid_attributes
@post = FactoryGirl.create(:post)
{ post_id: @post.id, author_id: @member.id, body: "some text" }
{ post_id: @post.id, body: "some text" }
end
describe "GET RSS feed" do
@@ -34,51 +34,83 @@ describe CommentsController do
end
describe "GET new" do
it "picks up post from params" do
post = FactoryGirl.create(:post)
get :new, post_id: post.id
assigns(:post).should eq(post)
end
let(:post) { FactoryGirl.create(:post) }
it "assigns the old comments as @comments" do
post = FactoryGirl.create(:post)
old_comment = FactoryGirl.create(:comment, post: post)
get :new, post_id: post.id
assigns(:comments).should eq [old_comment]
describe "with valid params" do
before { get :new, post_id: post.id }
it "picks up post from params" do
assigns(:post).should eq(post)
end
let(:old_comment) { FactoryGirl.create(:comment, post: post) }
it "assigns the old comments as @comments" do
assigns(:comments).should eq [old_comment]
end
end
it "dies if no post specified" do
get :new
response.should redirect_to(root_url)
expect(response).not_to be_success
end
end
describe "GET edit" do
it "assigns previous comments as @comments" do
post = FactoryGirl.create(:post)
old_comment = FactoryGirl.create(:comment, post: post)
comment = FactoryGirl.create(:comment, post: post, author: @member)
get :edit, id: comment.to_param
assigns(:comments).should eq([comment, old_comment])
let(:post) { FactoryGirl.create(:post) }
before { get :edit, id: comment.to_param }
describe "my comment" do
let!(:comment) { FactoryGirl.create :comment, author: @member, post: post }
let!(:old_comment) { FactoryGirl.create(:comment, post: post, created_at: Time.zone.yesterday) }
it "assigns previous comments as @comments" do
assigns(:comments).should eq([comment, old_comment])
end
end
describe "not my comment" do
let(:comment) { FactoryGirl.create :comment, post: post }
it { expect(response).not_to be_success }
end
end
describe "PUT update" do
describe "with valid params" do
before { put :update, id: comment.to_param, comment: valid_attributes }
describe "my comment" do
let(:comment) { FactoryGirl.create :comment, author: @member }
it "redirects to the comment's post" do
comment = Comment.create! valid_attributes
put :update, id: comment.to_param, comment: valid_attributes
response.should redirect_to(comment.post)
expect(response).to redirect_to(comment.post)
end
end
describe "not my comment" do
let(:comment) { FactoryGirl.create :comment }
it { expect(response).not_to be_success }
end
describe "attempting to change post_id" do
let(:post) { FactoryGirl.create :post, subject: 'our post' }
let(:other_post) { FactoryGirl.create :post, subject: 'the other post' }
let(:valid_attributes) { { post_id: other_post.id, body: "kōrero" } }
let(:comment) { FactoryGirl.create :comment, author: @member, post: post }
it "does not change post_id" do
comment.reload
expect(comment.post_id).to eq(post.id)
end
end
end
describe "DELETE destroy" do
it "redirects to the post the comment was on" do
comment = Comment.create! valid_attributes
post = comment.post
delete :destroy, id: comment.to_param
response.should redirect_to(post)
before { delete :destroy, id: comment.to_param }
describe "my comment" do
let(:comment) { FactoryGirl.create :comment, author: @member }
it "redirects to the post the comment was on" do
expect(response).to redirect_to(comment.post)
end
end
describe "not my comment" do
let(:comment) { FactoryGirl.create :comment }
it { expect(response).not_to be_success }
end
end
end

View File

@@ -87,9 +87,9 @@ describe HarvestsController do
describe "POST create" do
describe "with valid params" do
it "creates a new Harvest" do
expect {
expect do
post :create, harvest: valid_attributes
}.to change(Harvest, :count).by(1)
end.to change(Harvest, :count).by(1)
end
it "assigns a newly created harvest as @harvest" do
@@ -120,11 +120,11 @@ describe HarvestsController do
it "re-renders the 'new' template" do
# Trigger the behavior that occurs when invalid params are submitted
Harvest.any_instance.stub(:save).and_return(false)
post :create, harvest: { "crop_id" => "invalid value" }
response.should render_template("new")
end
end
describe "not my planting" do
let(:not_my_planting) { FactoryGirl.create(:planting) }
let(:harvest) { FactoryGirl.create(:harvest) }
@@ -172,18 +172,17 @@ describe HarvestsController do
it "re-renders the 'edit' template" do
harvest = Harvest.create! valid_attributes
# Trigger the behavior that occurs when invalid params are submitted
Harvest.any_instance.stub(:save).and_return(false)
put :update, id: harvest.to_param, harvest: { "crop_id" => "invalid value" }
response.should render_template("edit")
end
end
describe "not my planting" do
let(:not_my_planting) { FactoryGirl.create(:planting) }
let(:harvest) { FactoryGirl.create(:harvest) }
it "does not save planting_id" do
allow(Harvest).to receive(:new).and_return(harvest)
put :update, id: harvest.to_param, harvest: valid_attributes.merge(planting_id: not_my_planting.id)
put :update, id: harvest.to_param,
harvest: valid_attributes.merge(planting_id: not_my_planting.id)
expect(harvest.planting_id).to eq(nil)
end
end
@@ -192,9 +191,9 @@ describe HarvestsController do
describe "DELETE destroy" do
it "destroys the requested harvest" do
harvest = Harvest.create! valid_attributes
expect {
expect do
delete :destroy, id: harvest.to_param
}.to change(Harvest, :count).by(-1)
end.to change(Harvest, :count).by(-1)
end
it "redirects to the harvests list" do

View File

@@ -0,0 +1,42 @@
require 'rails_helper'
describe LikesController do
let(:like) { FactoryGirl.create :like, member: member }
let(:member) { FactoryGirl.create(:member) }
let(:blogpost) { FactoryGirl.create(:post) }
let(:mypost) { FactoryGirl.create(:post, author: member) }
before { sign_in member }
describe "POST create" do
it { expect(response.content_type).to eq "application/json" }
before { post :create, post_id: blogpost.id, format: :json }
it { expect(Like.last.likeable_id).to eq(blogpost.id) }
it { expect(Like.last.likeable_type).to eq('Post') }
it { JSON.parse(response.body)["description"] == "1 like" }
describe "Liking someone else's post" do
it { expect(response.code).to eq('201') }
end
describe "Liking your own post" do
let(:blogpost) { FactoryGirl.create(:post, author: member) }
end
end
describe "DELETE destroy" do
before { delete :destroy, id: like.id, format: :json }
it { expect(response.content_type).to eq "application/json" }
describe "un-liking something i liked before" do
it { expect(response.code).to eq('200') }
it { JSON.parse(response.body)["description"] == "0 likes" }
end
describe "Deleting someone else's like" do
let(:like) { FactoryGirl.create :like }
it { expect(response.code).to eq('403') }
it { JSON.parse(response.body)["error"] == "Unable to like" }
end
end
end

View File

@@ -23,8 +23,7 @@ describe OrderItemsController do
@order_item = FactoryGirl.create(:order_item,
order: @order,
product: @product,
price: @product.min_price
)
price: @product.min_price)
end
describe "POST create" do

View File

@@ -3,7 +3,7 @@ FactoryGirl.define do
garden
owner
crop
planted_at Date.today
planted_at Time.zone.today
quantity 33
description "This is a *really* good plant."

View File

@@ -28,7 +28,7 @@ feature "crop wranglers", js: true do
click_link wrangler.login_name
click_link 'Crop Wrangling'
within '#recently-added-crops' do
expect(page).to have_content "#{crops.first.creator.login_name}"
expect(page).to have_content crops.first.creator.login_name.to_s
end
end

View File

@@ -43,7 +43,7 @@ feature "follows", :js do
scenario "has a followed member listed in the following page" do
click_link 'Follow'
visit member_follows_path(member)
expect(page).to have_content "#{other_member.login_name}"
expect(page).to have_content other_member.login_name.to_s
end
scenario "does not die when passed an authenticity_token" do
@@ -62,22 +62,22 @@ feature "follows", :js do
scenario "has member in following list" do
click_link 'Follow'
visit member_follows_path(member)
expect(page).to have_content "#{other_member.login_name}"
expect(page).to have_content other_member.login_name.to_s
end
scenario "appears in in followed member's followers list" do
click_link 'Follow'
visit member_followers_path(other_member)
expect(page).to have_content "#{member.login_name}"
expect(page).to have_content member.login_name.to_s
end
scenario "removes members from following and followers lists after unfollow" do
click_link 'Follow'
click_link 'Unfollow'
visit member_follows_path(member)
expect(page).not_to have_content "#{other_member.login_name}"
expect(page).not_to have_content other_member.login_name.to_s
visit member_followers_path(other_member)
expect(page).to have_content "#{member.login_name}"
expect(page).to have_content member.login_name.to_s
end
end
end

View File

@@ -1,10 +1,11 @@
require 'rails_helper'
require 'custom_matchers'
feature "Harvesting a crop", :js do
feature "Harvesting a crop", :js, :elasticsearch do
let(:member) { create :member }
let!(:maize) { create :maize }
let!(:plant_part) { create :plant_part }
let(:planting) { create :planting, crop: maize, owner: member }
background do
login_as member
@@ -74,20 +75,63 @@ feature "Harvesting a crop", :js do
expect(page).to have_content "maize"
end
scenario "Harvesting from planting page" do
planting = create :planting, crop: maize, owner: member, garden: member.gardens.first
visit planting_path(planting)
click_link "Harvest"
select plant_part.name, from: 'harvest[plant_part_id]'
click_button "Save"
expect(page).to have_content "Harvest was successfully created"
expect(page).to have_content planting.garden.name
expect(page).to have_content "maize"
end
context "Editing a harvest" do
let(:existing_harvest) { create :harvest, crop: maize, owner: member }
let!(:other_plant_part) { create :plant_part, name: 'chocolate' }
background do
visit harvest_path(existing_harvest)
click_link "Edit"
end
scenario "Saving wihout edits" do
scenario "Saving without edits" do
# Check that the autosuggest helper properly fills inputs with
# existing resource's data
click_button "Save"
expect(page).to have_content "Harvest was successfully updated"
expect(page).to have_content "maize"
end
scenario "change plant part" do
select other_plant_part.name, from: 'harvest[plant_part_id]'
click_button "Save"
expect(page).to have_content "Harvest was successfully updated"
expect(page).to have_content other_plant_part.name
end
end
context "Viewing a harvest" do
let(:existing_harvest) do
create :harvest, crop: maize, owner: member,
harvested_at: Time.zone.today
end
let!(:existing_planting) do
create :planting, crop: maize, owner: member,
planted_at: Time.zone.yesterday
end
background do
visit harvest_path(existing_harvest)
end
scenario "linking to a planting" do
expect(page).to have_content planting.to_s
choose("harvest_planting_id_#{existing_planting.id}")
click_button "save"
expect(page).to have_link(href: planting_path(existing_planting))
end
end
end

View File

@@ -1,7 +1,7 @@
require "rails_helper"
require 'custom_matchers'
feature "Planting a crop", :js do
feature "Planting a crop", :js, :elasticsearch do
let(:member) { create :member }
let!(:maize) { create :maize }
let(:garden) { create :garden, owner: member }
@@ -58,7 +58,7 @@ feature "Planting a crop", :js do
visit new_planting_path
@a_past_date = 15.days.ago.strftime("%Y-%m-%d")
@right_now = Date.today.strftime("%Y-%m-%d")
@right_now = Time.zone.today.strftime("%Y-%m-%d")
@a_future_date = 1.year.from_now.strftime("%Y-%m-%d")
end

View File

@@ -1,7 +1,7 @@
require 'rails_helper'
require 'custom_matchers'
feature "Seeds", :js do
feature "Seeds", :js, :elasticsearch do
let(:member) { create :member }
let!(:maize) { create :maize }

View File

@@ -1,13 +1,13 @@
shared_examples "append date" do
let(:this_month) { Date.today.strftime("%B") }
let(:this_year) { Date.today.strftime("%Y") }
let(:this_month) { Time.zone.today.strftime("%B") }
let(:this_year) { Time.zone.today.strftime("%Y") }
background { visit path }
scenario "Selecting a date with datepicker" do
click_link link_text
within "div.datepicker" do
expect(page).to have_content "#{this_month}"
expect(page).to have_content this_month.to_s
find(".datepicker-days td.day", text: "21").click
end
expect(page).to have_content "Finished: #{this_month} 21, #{this_year}"

View File

@@ -125,7 +125,7 @@ describe ApplicationHelper do
expect(build_alert_classes(:info)).to include 'alert-info'
end
it 'works when blank' do
expect(build_alert_classes()).to include 'alert-info'
expect(build_alert_classes).to include 'alert-info'
end
it 'includes base classes' do
expect(build_alert_classes(:info)).to include 'alert alert-dismissable'

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