Compare commits

...
889 Commits
Author SHA1 Message Date
pozorvlak 929229379e Merge pull request #1455 from Growstuff/dev
Release 34
2017-11-17 16:55:01 +00:00
pozorvlak ac0e52f15d Merge pull request #1412 from Br3nda/api
Basic read only api  - members, gardens, plantings, crops, photos, harvests, seeds
2017-11-17 16:44:41 +00:00
Shiny c7f427fe8a Merge branch 'dev' into api 2017-11-18 00:48:03 +13:00
Shiny 50fd9ae9b0 Merge branch 'master' into dev 2017-11-18 00:44:44 +13:00
Brenda Wallace efe39da878 Removed un-used method, to reduce class size 2017-11-18 00:43:17 +13:00
Brenda Wallace 1cd3c64590 Reducing class line count 2017-11-18 00:43:17 +13:00
Brenda Wallace b591529892 Reinstated test of first harvest prediction display 2017-11-18 00:43:17 +13:00
Brenda Wallace cef236d8f8 Reducing crop class size 2017-11-18 00:43:17 +13:00
Brenda Wallace 5ad0068142 Run existing crop specs with annual crop 2017-11-18 00:43:17 +13:00
Brenda Wallace b8a5ff9acf Don't show lifespan of perennials 2017-11-18 00:43:17 +13:00
deppbot 90653aa57f Bundle Update on 2017-11-15 2017-11-18 00:43:17 +13:00
Shiny 80a4739f34 Underscore prefix on our last unused args (#1442) 2017-11-18 00:43:17 +13:00
Brenda Wallace a6cc530fe5 Updating specs to use same owner for garden and planting 2017-11-18 00:43:17 +13:00
Brenda Wallace 97f19a0038 If a harvest has a planting, it must have the same owner 2017-11-18 00:43:17 +13:00
Brenda Wallace 140611d868 Get planting factory's owner from its garden 2017-11-18 00:43:17 +13:00
Brenda Wallace 3fa5ffc544 Planting's owner must be the same as its garden's owner 2017-11-18 00:43:17 +13:00
deppbot eeafb4caa5 Bundle Update on 2017-11-12 2017-11-18 00:43:17 +13:00
Brenda Wallace c747d46ab5 Request spec for seeds api 2017-11-17 23:22:10 +13:00
Brenda Wallace 3009ed2d83 Merge branch 'api' of github.com:Br3nda/growstuff into api 2017-11-17 23:16:16 +13:00
Shiny f68a15c04e Merge branch 'dev' into api 2017-11-17 22:02:12 +13:00
Brenda Wallace 06295fb9e9 Merge branch 'api' of github.com:Br3nda/growstuff into api 2017-11-17 22:02:06 +13:00
Brenda Wallace c4a1806a87 Request spec for photos api 2017-11-17 22:01:37 +13:00
Brenda Wallace fa5e151af0 Request spec for photos api 2017-11-17 22:00:32 +13:00
Brenda Wallace 13e8d1f5a5 Merge remote-tracking branch 'upstream/dev' into api 2017-11-17 21:51:39 +13:00
Brenda Wallace c1836cc78e Removed un-used method, to reduce class size 2017-11-17 21:50:59 +13:00
Brenda Wallace 28fdb6e1ed Reducing class line count 2017-11-17 21:50:59 +13:00
Brenda Wallace 67dec795a0 Reinstated test of first harvest prediction display 2017-11-17 21:50:59 +13:00
Brenda Wallace 86ea8eab39 Reducing crop class size 2017-11-17 21:50:59 +13:00
Brenda Wallace 8884056ff3 Run existing crop specs with annual crop 2017-11-17 21:50:59 +13:00
Brenda Wallace d01a5d7976 Don't show lifespan of perennials 2017-11-17 21:50:59 +13:00
pozorvlak 66c08650ba Merge pull request #1445 from Br3nda/feature/planting-garden-owner-match
planting owner needs to match garden owner
2017-11-15 17:49:00 +00:00
Shiny 521873b656 Merge branch 'dev' into feature/planting-garden-owner-match 2017-11-15 09:27:41 +13:00
deppbot 2060d9ab9e Bundle Update on 2017-11-15 2017-11-15 09:26:47 +13:00
Shiny 1795b27152 Merge branch 'dev' into feature/planting-garden-owner-match 2017-11-13 23:09:04 +13:00
Shiny 93193c9fba Merge branch 'dev' into api 2017-11-13 23:00:33 +13:00
Shiny df7a9448b0 Underscore prefix on our last unused args (#1442) 2017-11-13 09:54:55 +00:00
Brenda Wallace 1b4d77e017 Requests spec for member api 2017-11-13 20:03:39 +13:00
Brenda Wallace 08e7c7dd29 Request specs for harvests api 2017-11-13 19:19:18 +13:00
Brenda Wallace 5fec826c41 Add more attributes to crops 2017-11-13 19:19:18 +13:00
Brenda Wallace c29234c40c Request specs for crops api 2017-11-13 19:19:18 +13:00
Brenda Wallace 2f0cb5c815 DRY the api specs 2017-11-13 19:19:18 +13:00
Brenda Wallace b6cbfe25d2 Factory girl becomes factory bot 2017-11-13 19:19:18 +13:00
Brenda Wallace d8f5876518 Added predictions to planting api, and added specs 2017-11-13 19:19:18 +13:00
Brenda Wallace ae2cbf0bec requests spec for modifying immutable gardens on api 2017-11-13 19:19:18 +13:00
Brenda Wallace c9d5c42814 Plantings have many harvests 2017-11-13 19:19:18 +13:00
Brenda Wallace b60f47f502 Add more relationships to members on the api 2017-11-13 19:19:18 +13:00
Brenda Wallace d86e0af5ad Request for for getting api gardens#index 2017-11-13 19:19:18 +13:00
Brenda Wallace fc0058d677 all our api controllers inheriting from base 2017-11-13 19:19:18 +13:00
Brenda Wallace 41110f96d1 Put immutable on every resource 2017-11-13 19:19:18 +13:00
Brenda Wallace 33822abf93 crops have harvests 2017-11-13 19:19:18 +13:00
Brenda Wallace 5877da95a6 Added a base resource, a little more DRY 2017-11-13 19:19:18 +13:00
Brenda Wallace 88a119deac Add a default paginator for api responses 2017-11-13 19:19:18 +13:00
Brenda Wallace d07fd1a277 Added seeds and harvests to api, and tidied up resources 2017-11-13 19:19:18 +13:00
Brenda Wallace c96695258b Basic read only api 2017-11-13 19:19:18 +13:00
Brenda Wallace 2fbba52bc8 Updating specs to use same owner for garden and planting 2017-11-13 19:18:14 +13:00
Brenda Wallace a2ae429f6b If a harvest has a planting, it must have the same owner 2017-11-13 19:18:14 +13:00
Brenda Wallace 7ca76e69cf Get planting factory's owner from its garden 2017-11-13 19:18:14 +13:00
Brenda Wallace c6824b1262 Planting's owner must be the same as its garden's owner 2017-11-13 19:18:14 +13:00
Shiny 2a74c057f3 Merge branch 'master' into dev 2017-11-12 09:30:45 +13:00
deppbot 85cc9e77c6 Bundle Update on 2017-11-12 2017-11-12 09:29:21 +13:00
pozorvlak a0d6d154f0 Merge pull request #1439 from Growstuff/dev
Release 32
2017-11-10 16:25:42 +00:00
pozorvlak 7e9707e3b0 Merge pull request #1437 from Br3nda/feature/harvest-predictions
Feature/harvest predictions
2017-11-10 11:59:00 +00:00
Brenda Wallace 4fe0dba28e Merge remote-tracking branch 'upstream/dev' into feature/harvest-predictions 2017-11-09 18:30:18 +13:00
Shiny 328037b8c0 Merge branch 'master' into dev 2017-11-09 18:19:57 +13:00
Brenda Wallace e4ab5114f7 Remove duplicate setting of medians in migration 2017-11-09 17:51:18 +13:00
Brenda Wallace a5d43af899 Drop the plantings.days_before_maturity column
it's not used anywhere
2017-11-09 17:43:00 +13:00
Brenda Wallace 2d384c9851 Merge remote-tracking branch 'upstream/dev' into feature/harvest-predictions 2017-11-09 17:36:50 +13:00
Brenda Wallace 205247b136 Shorter condition in haml view (progress) 2017-11-09 17:36:37 +13:00
Brenda Wallace 963a182981 simplified logic in planting's first/last harvest fetcher 2017-11-09 17:36:33 +13:00
Daniel O'Connor 1090db6d21 Merge pull request #1438 from Growstuff/bundle-update-2017-11-08-201231
Bundle Update on 2017-11-08
2017-11-09 09:27:31 +11:00
deppbot f187b31653 Bundle Update on 2017-11-08 2017-11-08 20:12:32 +08:00
Brenda Wallace 809dd81378 "Changed last_harvest" to "days_to_last_harvest" 2017-11-08 17:17:58 +13:00
Brenda Wallace 62beec23a1 "Changed first_harvest" to "days_to_first_harvest" 2017-11-08 17:17:15 +13:00
Brenda Wallace a60a5ce591 Added a space, to please hound 2017-11-07 09:46:19 +13:00
Brenda Wallace 7206f99510 Updated spec to match new crop detail page text 2017-11-07 08:39:45 +13:00
Brenda Wallace bf6475da57 annual? perennial!=true 2017-11-06 23:15:08 +13:00
Brenda Wallace c5971cd46b A little bit of eager loading 2017-11-06 23:13:36 +13:00
Brenda Wallace 2f47eeb7b3 Bug fix. Can only predict if we have harvested_at and planted_at 2017-11-06 23:12:28 +13:00
Brenda Wallace 928749aaad Changed a "Pictures" header to "Photos" to be consistent 2017-11-06 23:11:39 +13:00
Brenda Wallace 1d64d4d1d2 Clearer message that predctions are for days after planting 2017-11-06 23:10:55 +13:00
Brenda Wallace 1e86cf7662 Update planting medians after updating record
So changes to the planted_at are re-calculated
2017-11-06 23:07:44 +13:00
Brenda Wallace 941dab7c4a Crop.annual? method 2017-11-06 23:00:16 +13:00
Brenda Wallace 2696d12771 Removed duplicate display of last harvest 2017-11-06 22:59:04 +13:00
Brenda Wallace 6bf87c243c Feature spec for crop predictions on crop#show 2017-11-06 22:38:48 +13:00
Brenda Wallace ec63d8086f Moved crop predictions to own haml file 2017-11-06 22:36:47 +13:00
Brenda Wallace 470aacd1c9 Fixed %w for an array of words 2017-11-06 09:11:27 +13:00
Brenda Wallace 9997c365d8 Update robocop todo - to reflect progress 2017-11-05 20:44:41 +13:00
Brenda Wallace eaa65fda9e update median_last_harvest too, with specs 2017-11-05 20:28:51 +13:00
Brenda Wallace e844eade94 Changed model validators message to please Hound 2017-11-05 20:09:21 +13:00
Brenda Wallace 35e7b6a5b4 Removed an ignore from rubocop 2017-11-05 19:55:00 +13:00
Brenda Wallace 6c33c335d8 Default ordering for harvests are gone, so order it in spec 2017-11-05 19:26:50 +13:00
Brenda Wallace 26537943e3 Removed pending spec 2017-11-05 18:00:49 +13:00
Brenda Wallace 136c082003 Smaller photos on crop page. Fits in the predictions data 2017-11-05 17:47:19 +13:00
Brenda Wallace b3fd8e32d0 Fixed ordering of Harvests - don't order in scope. 2017-11-05 17:42:59 +13:00
Brenda Wallace 9b1b22afa8 Bugfix and specs for first and last harvest 2017-11-05 17:33:58 +13:00
Brenda Wallace 996706ee78 Tests for planting lifespan predictions when there's no crop data 2017-11-05 17:29:42 +13:00
Brenda Wallace 9d11bcc039 Can't calculate first harvest if there are no harvests 2017-11-05 16:20:51 +13:00
Brenda Wallace b1684b0156 Set prediction data for existing planting and crops 2017-11-05 14:16:00 +13:00
Brenda Wallace ec00baef0d Updated feature spec to look for new annual/perennial text 2017-11-05 14:07:33 +13:00
Brenda Wallace eb585611fe Fixed spec to call update_lifespan_medians 2017-11-05 14:05:54 +13:00
Brenda Wallace 9280049a84 Merge remote-tracking branch 'upstream/dev' into feature/harvest-predictions 2017-11-05 13:45:08 +13:00
Brenda Wallace 53d7fd1479 Displaying predicted first harvest on plantings and crops 2017-11-05 13:43:00 +13:00
Brenda Wallace 4cc0f77bd0 Predicting first harvest - updating medians 2017-11-05 13:42:30 +13:00
Brenda Wallace 5e5773aa59 feature spec for displaying annual/perennial on crops#show 2017-11-05 12:52:02 +13:00
deppbot 2422939b4f Bundle Update on 2017-11-04 2017-11-04 20:10:52 +13:00
Brenda Wallace d5a1a683f1 Rubocop fix 2017-11-04 15:44:56 +13:00
Brenda Wallace f5bb47e4ca DRY plantings controller a bit more - update crop means in one place 2017-11-04 15:36:51 +13:00
Brenda Wallace 8359218294 Update crop medians after deletion of planting (not before) 2017-11-04 11:53:40 +13:00
Brenda Wallace 285e6edc61 crop -> sci_names needs dependent:destroy so we don't get orphans 2017-11-04 11:51:19 +13:00
Brenda Wallace f2fac9db1b Time.zone.local 2017-11-04 11:39:53 +13:00
Brenda Wallace cabc4fd030 %i-literals should be delimited by ( and ) 2017-11-04 10:29:31 +13:00
Brenda Wallace 20fe9e4cc5 Merge remote-tracking branch 'upstream/dev' into feature/harvest-predictions 2017-11-04 10:09:53 +13:00
pozorvlak fac24c5e99 Merge pull request #1423 from Growstuff/dev
Release 31
2017-11-03 08:32:35 +00:00
Logan Gingerich fa600bea9e changed spec to reflect factorybot change 2017-11-03 14:53:20 +13:00
Logan Gingerich 99e7fb1f7d Name added to contributors and spec added 2017-11-03 14:53:20 +13:00
Logan Gingerich 81e22d6fb2 fixes #1419 - Allows brackets in garden names 2017-11-03 14:53:20 +13:00
Logan Gingerich 10a8df47a9 Factorygirl to factorybot - fixes #1413 (#1425)
* FactoryGirl Changed to FactoryBot

file fix

changes based on comments received

Bundle Update on 2017-10-29

style update to align hash literal

added package-lock

* indentation fixes with rubocop

* name added to contributors
2017-11-01 15:03:31 +00:00
pozorvlak b0a4df629c Merge pull request #1429 from Br3nda/delimiters
Stop hound and codeclimate fighing over delimiter styles
2017-11-01 10:00:44 +00:00
Brenda Wallace 0b8357a261 Merge branch 'delimiters' into feature/harvest-predictions 2017-11-01 15:14:06 +13:00
Brenda Wallace 7104781d1b Rubocop array fix ups 2017-11-01 15:13:32 +13:00
Brenda Wallace 267f27b3f8 rubocop fix up 2017-11-01 14:48:42 +13:00
Brenda Wallace 31a37bf6dc No progress bar for perennials 2017-11-01 14:27:03 +13:00
Brenda Wallace d1951b8b65 Edit and show perennial plants 2017-11-01 14:22:39 +13:00
Brenda Wallace cd99769311 Wrapped a long line 2017-11-01 14:02:56 +13:00
Brenda Wallace 71cb3f8c5f Rubocop fixes 2017-11-01 13:57:49 +13:00
Brenda Wallace d540342acb removed the days_before_maturity specs because function no longer exists 2017-11-01 13:57:49 +13:00
Brenda Wallace f66b0768e2 Changed how db schema is loaded in travis 2017-11-01 13:57:49 +13:00
Brenda Wallace 251f44b0c7 Updated tests of progress bar 2017-11-01 13:57:49 +13:00
Brenda Wallace adf07ce5ef Planting feature specs passing 2017-11-01 13:57:49 +13:00
Brenda Wallace 54b204c636 fixed typo 2017-11-01 13:57:49 +13:00
Brenda Wallace ff446c2139 Updated spec, new message when not enough data to predict progress 2017-11-01 13:57:49 +13:00
Brenda Wallace 62d84d7af4 planting progress is 100% if finished 2017-11-01 13:57:49 +13:00
Brenda Wallace 92fa09a1d3 Mark harvest predictions as pending 2017-11-01 13:57:49 +13:00
Brenda Wallace b09c4aa7a1 Update display, to show predicted finish date 2017-11-01 13:57:49 +13:00
Brenda Wallace 692ab59285 Display expected finished date 2017-11-01 13:57:49 +13:00
Brenda Wallace 302bdba150 fixes search 2017-11-01 13:57:49 +13:00
Brenda Wallace aa3057056f rubocop fix up 2017-11-01 13:57:49 +13:00
Brenda Wallace 9ef40532ad removed old percentage grow specs 2017-11-01 13:57:49 +13:00
Brenda Wallace 70ba8c8421 Updating planting model specs, for predictions 2017-11-01 13:57:49 +13:00
Brenda Wallace 3b81affbe5 include child records when reading plantings from db 2017-11-01 13:57:49 +13:00
Brenda Wallace 9703d4e983 Remove harvest preductions for now 2017-11-01 13:57:49 +13:00
Brenda Wallace 22e1718ce6 Rubocop fix ups 2017-11-01 13:57:49 +13:00
Brenda Wallace b90b4e42fb Updated progress bar to use new predictions 2017-11-01 13:57:49 +13:00
Brenda Wallace 202f557e32 Delete the old predictions code 2017-11-01 13:57:49 +13:00
Brenda Wallace 8364c8c688 updated schema 2017-11-01 13:57:49 +13:00
Brenda Wallace 3a286cd240 Show median lifespan of a crop 2017-11-01 13:57:49 +13:00
Brenda Wallace 41dbf6fb1b Moved crop search out of crop model file 2017-11-01 13:57:49 +13:00
Brenda Wallace 47ecbe3f94 Call the predictions update on planting modifications from controller 2017-11-01 13:57:49 +13:00
Brenda Wallace 0f066ab302 Cleaning up models as adding predictions 2017-11-01 13:57:49 +13:00
Brenda Wallace 8e94ddb4bf Moved planting predictions to crop 2017-11-01 13:57:49 +13:00
Brenda Wallace a9cedc6a8a Add active median gem 2017-11-01 13:57:49 +13:00
Brenda Wallace 7d6c49d8c3 Set harvest preductions on plantings 2017-11-01 13:57:49 +13:00
Brenda Wallace 0d8ca89b14 harvested_at and harvest_predicted_at added to plantings 2017-11-01 13:57:49 +13:00
Brenda Wallace 82a37d69bc Ensure harvests are same crop, and after the planting was planted 2017-11-01 13:57:49 +13:00
Shiny 4533d35fe7 Merge branch 'dev' into delimiters 2017-11-01 13:27:26 +13:00
deppbot 4b445907d5 Bundle Update on 2017-11-01 2017-11-01 13:27:10 +13:00
Brenda Wallace fce6395d21 Stop hound and codeclimate fighing over delimiter styles 2017-11-01 13:21:42 +13:00
deppbot 2946dca5fc Bundle Update on 2017-10-29 2017-10-30 20:20:50 +13:00
Shiny 9eb6d84e5a Merge branch 'master' into dev 2017-10-28 10:43:34 +13:00
Brenda Wallace 96b4742e78 Dev is almost always on port 3000 2017-10-28 10:38:51 +13:00
pozorvlak 68c14a695e Merge pull request #1416 from Br3nda/feature/more-crop-photos
All crop photos
2017-10-27 12:57:43 +01:00
Brenda Wallace e42ec4f8ae Test crop photo display when not signed in 2017-10-27 23:43:23 +13:00
Brenda Wallace f7b75157e7 Feature spec for harvest photos 2017-10-27 23:34:37 +13:00
Brenda Wallace 7e27b6deef Merge branch 'feature/more-crop-photos' of github.com:Br3nda/growstuff into feature/more-crop-photos 2017-10-27 23:33:01 +13:00
Shiny cd69ea1487 Merge branch 'dev' into feature/more-crop-photos 2017-10-27 23:32:46 +13:00
Brenda Wallace 4cdcbdac19 Merge remote-tracking branch 'origin/feature/more-crop-photos' into feature/more-crop-photos 2017-10-26 20:32:55 +13:00
Brenda Wallace f3d03c00b2 Merge remote-tracking branch 'upstream/dev' into feature/more-crop-photos 2017-10-26 20:31:23 +13:00
deppbot d9aa9df7fe Bundle Update on 2017-10-26 2017-10-26 10:42:31 +13:00
pozorvlak 494dd1d658 Merge pull request #1411 from Growstuff/dev
Release 30
2017-10-25 08:16:42 +01:00
Shiny af60489459 Merge branch 'dev' into feature/more-crop-photos 2017-10-24 10:32:57 +13:00
Brenda Wallace a3a88c48de Randomise the crops on the homepage 2017-10-23 22:09:34 +01:00
Brenda Wallace f3e88f5aae Include harvest photos on crop page 2017-10-24 09:34:10 +13:00
Brenda Wallace 1e81dac699 All crop photos; crops-> photos route 2017-10-24 09:34:03 +13:00
Brenda Wallace 705240014a Link harvest thumbnails to harvests
to be consistent with the rest of the site
2017-10-23 11:07:27 +01:00
Brenda Wallace 78aa049502 Fixed comment model spec 2017-10-23 10:44:37 +01:00
Brenda Wallace 97c7277a73 fixed up ambigous regex and use of expect in specs 2017-10-23 10:44:37 +01:00
Brenda Wallace 0e0af44d9f post show specs, use expect syntax, and more tests for js injection 2017-10-23 10:44:37 +01:00
Brenda Wallace 45af8d5f4f Converting to expect syntax 2017-10-23 10:44:37 +01:00
deppbot a1ee822690 Bundle Update on 2017-10-22 2017-10-23 14:55:15 +13:00
Brenda Wallace b6e61eba7a Merge branch 'master' into dev-conflict-fix 2017-10-22 11:30:43 +13:00
Brenda Wallace b356d86931 Allow inline style on the progress bar width 2017-10-21 22:48:37 +01:00
Brenda Wallace 34f91c2189 Wrap garden overview buttons to right of photo on small screens 2017-10-21 22:48:37 +01:00
Brenda Wallace faf3f60e78 small screen gardens overview 2017-10-21 22:48:37 +01:00
Brenda Wallace e3113fd53d Re-work gardens#index to show planting progress 2017-10-21 22:48:37 +01:00
Brenda Wallace 68768c4d6a Fixed redirection after planting is deleted 2017-10-21 22:48:37 +01:00
pozorvlak da7fec5e0b Merge pull request #1405 from Br3nda/fix-1379
Display messages even when member is deleted
2017-10-20 16:10:51 +01:00
Brenda Wallace 191c8e4e9d Display messages even when member is deleted 2017-10-20 23:44:51 +13:00
deppbot edc763cd8c Bundle Update on 2017-10-19 2017-10-20 23:23:02 +13:00
Brenda Wallace fdfb116d92 Ignore one Style/ClassAndModuleChildren 2017-10-19 08:22:40 +13:00
Brenda Wallace 888e0669a0 Added hound config 2017-10-19 08:22:40 +13:00
Brenda Wallace d55e2b5466 Update heroku maintenance script
maintenance is just an attribute now
2017-10-19 08:22:40 +13:00
Brenda Wallace c28ae4fe83 Use ! to indicate the method changes class variables 2017-10-19 08:22:40 +13:00
Brenda Wallace 4b4669459e Fixed duplicated code in growstuff member link markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace 77902ad300 Moved member look up to a method (less duplicate code) 2017-10-19 08:22:40 +13:00
Brenda Wallace f314fcd919 Fixed members link in growstuff markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace 8171c12a5b Fixed links to crops in growstuff markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace 08b6b46bfa Removed some rubocop todos 2017-10-19 08:22:40 +13:00
Brenda Wallace bf189092ea More simplification of growstuff markup 2017-10-19 08:22:40 +13:00
Brenda Wallace a539a47044 Reduced complexity of growstuff_markdown 2017-10-19 08:22:40 +13:00
Brenda Wallace e29ac8827a Another code style fixup 2017-10-19 08:22:40 +13:00
Brenda Wallace c5cee72ae5 Migrate to new heroku platform api - maintenance mode trigger 2017-10-19 08:22:40 +13:00
deppbot 5396550a8a Bundle Update on 2017-10-16 2017-10-19 08:22:40 +13:00
deppbot 76d2fb37b4 Bundle Update on 2017-09-28 2017-10-19 08:22:40 +13:00
deppbot a42676ef0a Bundle Update on 2017-09-25 2017-10-19 08:22:40 +13:00
Brenda Wallace 3f3fc6a4ca Only install elastic search in travis on the matix that tests elasticsearch 2017-10-19 08:22:40 +13:00
Brenda Wallace c710a8b1ef Outputs which version of elasticsearch we are running on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace 6ada0c4f84 Install elastic search 2.4.0 when running on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace 2e5a2455d6 Sleep before tests
as suggested here https://docs.travis-ci.com/user/database-setup/#ElasticSearch
2017-10-19 08:22:40 +13:00
Brenda Wallace d89d4cea39 Further gem updates 2017-10-19 08:22:40 +13:00
Brenda Wallace 01a82ac993 Use floats, so the percentage calc works 2017-10-19 08:22:40 +13:00
Brenda Wallace 68660b3c65 update from erubi to erubis gem broke stuff - rolling back 2017-10-19 08:22:40 +13:00
Brenda Wallace 67b4f3558e Set required executable to jshint linting 2017-10-19 08:22:40 +13:00
Brenda Wallace 63b973833f Don't need to create database if just running linters 2017-10-19 08:22:40 +13:00
Brenda Wallace 4b19f73eb8 Remove git guilt 2017-10-19 08:22:40 +13:00
Brenda Wallace 9b4d6044ef Specify the executable in the npm installed linters 2017-10-19 08:22:40 +13:00
Brenda Wallace 9c70ffe051 Specify the executable in the npm installed linters 2017-10-19 08:22:40 +13:00
Brenda Wallace e7a1d2345d Bundle update and change to platform-api instead of heroku 2017-10-19 08:22:40 +13:00
Brenda Wallace c7585f1931 Use string.start_with? instead of a regexp 2017-10-19 08:22:40 +13:00
Brenda Wallace 63b76d175d Changed regex to matches? to appease rubocop 2017-10-19 08:22:40 +13:00
Brenda Wallace 1d5d2cc704 Added xmlrpc gem to solve rake errors on travis 2017-10-19 08:22:40 +13:00
Brenda Wallace 9477b4f9c7 Bump ruby version to 2.4.1 2017-10-19 08:22:40 +13:00
deppbot a42a61abdd Bundle Update on 2017-08-03 2017-10-19 08:22:40 +13:00
pozorvlak 62eaa07862 Merge pull request #1401 from Br3nda/fix/codestyle
Another code style fixup
2017-10-18 10:52:38 +01:00
pozorvlak f26420c380 Merge branch 'dev' into fix/codestyle 2017-10-18 10:41:03 +01:00
pozorvlak 6de13b7327 Merge pull request #1402 from Br3nda/fix/heroku-deploys
Update heroku maintenance script - maintenance is just an attribute now
2017-10-18 10:34:33 +01:00
Brenda Wallace 310f631f40 Ignore one Style/ClassAndModuleChildren 2017-10-18 20:45:27 +13:00
Brenda Wallace bec59aba43 Merge remote-tracking branch 'origin/fix/codestyle' into fix/codestyle 2017-10-18 19:27:36 +13:00
Brenda Wallace c86902967d Merge remote-tracking branch 'upstream/dev' into fix/codestyle 2017-10-18 19:27:08 +13:00
Brenda Wallace 361e3df692 Added hound config 2017-10-18 19:26:36 +13:00
Shiny ce18bef892 Merge branch 'dev' into fix/codestyle 2017-10-18 14:01:57 +13:00
Shiny ac2b0d04ea Merge branch 'dev' into fix/heroku-deploys 2017-10-18 13:40:52 +13:00
Brenda Wallace 9d0b48b84c Update heroku maintenance script
maintenance is just an attribute now
2017-10-18 13:37:54 +13:00
Brenda Wallace d8f41b5ca0 Use ! to indicate the method changes class variables 2017-10-18 12:20:28 +13:00
Brenda Wallace b5fbfaf515 Fixed duplicated code in growstuff member link markdown 2017-10-18 12:13:05 +13:00
Brenda Wallace ce9a71cdad Moved member look up to a method (less duplicate code) 2017-10-18 12:10:59 +13:00
Brenda Wallace 42a10bcd80 Fixed members link in growstuff markdown 2017-10-18 12:10:04 +13:00
Brenda Wallace 33656a4104 Fixed links to crops in growstuff markdown 2017-10-18 12:05:22 +13:00
pozorvlak ca200c1f30 Merge pull request #1400 from Br3nda/fix/heroku-deploys
Migrate to new heroku platform api - maintenance mode trigger
2017-10-17 14:52:16 +01:00
Brenda Wallace ccd352d699 Removed some rubocop todos 2017-10-17 22:33:22 +13:00
Brenda Wallace bd396dabfe More simplification of growstuff markup 2017-10-17 22:29:02 +13:00
Brenda Wallace 1279dd63bc Reduced complexity of growstuff_markdown 2017-10-17 22:20:17 +13:00
Brenda Wallace 8d681dd90a Another code style fixup 2017-10-17 17:29:48 +13:00
Brenda Wallace dfd0e1dbf5 Migrate to new heroku platform api - maintenance mode trigger 2017-10-17 16:23:12 +13:00
deppbot 0d555542c2 Bundle Update on 2017-10-16 2017-10-16 18:46:50 +13:00
deppbot 99a69cd492 Bundle Update on 2017-09-28 2017-10-16 14:52:16 +13:00
deppbot e8e9aa23b2 Bundle Update on 2017-09-25 2017-09-25 09:34:12 +13:00
pozorvlak 2fafc6f3e4 Merge pull request #1391 from Br3nda/feature/bundle-update-and-heroku-api-change
Bundle update and change to platform-api instead of heroku
2017-09-24 14:59:44 +01:00
Brenda Wallace 6b1714eb05 Only install elastic search in travis on the matix that tests elasticsearch 2017-09-24 18:50:23 +13:00
Brenda Wallace 8e5c52e85e Outputs which version of elasticsearch we are running on travis 2017-09-24 18:40:50 +13:00
Brenda Wallace c749f4a813 Install elastic search 2.4.0 when running on travis 2017-09-24 18:35:39 +13:00
Brenda Wallace 5ed5f9ec7e Sleep before tests
as suggested here https://docs.travis-ci.com/user/database-setup/#ElasticSearch
2017-09-24 15:17:39 +13:00
Brenda Wallace f4658df208 Further gem updates 2017-09-24 14:28:51 +13:00
Brenda Wallace e21b95a353 Use floats, so the percentage calc works 2017-09-13 22:21:15 +12:00
Brenda Wallace 19205cb6a8 update from erubi to erubis gem broke stuff - rolling back 2017-09-13 22:08:21 +12:00
Brenda Wallace 17521cde17 Set required executable to jshint linting 2017-09-13 22:01:33 +12:00
Brenda Wallace 5f7d48c633 Don't need to create database if just running linters 2017-09-05 14:30:03 +12:00
Brenda Wallace 94bb3bf6bb Remove git guilt 2017-09-05 14:22:52 +12:00
Brenda Wallace c9aacd0110 Specify the executable in the npm installed linters 2017-09-05 14:20:28 +12:00
Brenda Wallace ca5f14bb37 Specify the executable in the npm installed linters 2017-09-05 14:19:24 +12:00
Brenda Wallace 43da004ccb Bundle update and change to platform-api instead of heroku 2017-09-05 13:58:56 +12:00
Cesy 2704fcf515 Merge pull request #1387 from Br3nda/ruby-2-4-1
Bump ruby version to 2.4.1
2017-09-04 11:21:40 +01:00
Shiny 1af19335d7 Merge branch 'dev' into ruby-2-4-1 2017-09-01 13:00:46 +12:00
Shiny 4d33c32866 Merge branch 'master' into dev 2017-09-01 12:20:15 +12:00
Brenda Wallace 01333bf965 Use string.start_with? instead of a regexp 2017-09-01 12:11:57 +12:00
Brenda Wallace a145abff56 Changed regex to matches? to appease rubocop 2017-08-31 21:27:22 +12:00
Brenda Wallace 9732553d3b Added xmlrpc gem to solve rake errors on travis 2017-08-31 21:04:55 +12:00
Brenda Wallace 9142613b6b Bump ruby version to 2.4.1 2017-08-22 13:49:43 +12:00
Cesy 7132c95b61 Merge pull request #1382 from Growstuff/bundle-update-2017-08-03-163455
Bundle Update on 2017-08-03
2017-08-21 09:40:49 +01:00
Shiny 38b2d8de0f Merge branch 'dev' into master 2017-08-20 17:25:01 +12:00
Shiny 8f76ccf836 Merge branch 'dev' into bundle-update-2017-08-03-163455 2017-08-20 17:21:38 +12:00
ancyentMariner 491982f8f3 added security contact info to readme
udpated to actual email address

added name to contributors
2017-08-20 17:21:14 +12:00
deppbot 58e6411bbe Bundle Update on 2017-08-03 2017-08-03 16:34:56 +08:00
Daniel O'Connor ac7e116eae Merge pull request #1375 from Growstuff/bundle-update-2017-07-25-161454
Bundle Update on 2017-07-25
2017-08-03 14:17:43 +09:30
deppbot 1526257a0d Bundle Update on 2017-07-25 2017-07-25 16:14:55 +08:00
deppbot 7234848c5f Bundle Update on 2017-07-22 2017-07-24 06:57:44 +12:00
deppbot 6e453707b9 Bundle Update on 2017-07-18 2017-07-20 21:24:40 +12:00
Daniel O'Connor dac2d1d4c2 Merge pull request #1367 from Growstuff/bundle-update-2017-06-28-101508
Bundle Update on 2017-06-28
2017-07-17 23:31:09 +09:30
deppbot 6c4c1ff8ba Bundle Update on 2017-06-25 2017-06-30 07:06:28 +12:00
deppbot 93d1bfd05d Bundle Update on 2017-06-22 2017-06-30 07:06:28 +12:00
deppbot 6167e291d2 Bundle Update on 2017-06-18 2017-06-30 07:06:28 +12:00
Cesy Avon deb1e27176 Making rubocop happy 2017-06-30 07:06:28 +12:00
Cesy Avon 82bb6c2f3b Putting jquery-ui-rails back so things work 2017-06-30 07:06:28 +12:00
Cesy Avon 24d9d714b2 Bundle update 2017-06-30 07:06:28 +12:00
Cesy Avon d9ad55db7c Removing any locks on versions that don't have comments explaining why 2017-06-30 07:06:28 +12:00
deppbot 4dad76e635 Bundle Update on 2017-06-15 2017-06-30 07:06:28 +12:00
deppbot 252791b47d Bundle Update on 2017-06-12 2017-06-30 07:06:28 +12:00
deppbot aa849c2e1f Bundle Update on 2017-06-28 2017-06-28 10:15:09 +08:00
Shiny b03a59cb93 Merge branch 'master' into dev 2017-06-25 12:09:34 +12:00
deppbot e761ecc356 Bundle Update on 2017-06-25 2017-06-25 12:08:30 +12:00
deppbot 69b887ba79 Bundle Update on 2017-06-22 2017-06-22 08:09:01 +12:00
deppbot e4c2f777ac Bundle Update on 2017-06-18 2017-06-19 23:06:24 +12:00
Daniel O'Connor f0cb635b42 Merge pull request #1362 from cesy/bundleupdate2
Upgrade and unpin some gems
2017-06-16 07:52:55 +09:30
Cesy Avon 4116e201b5 Making rubocop happy 2017-06-15 15:28:50 +00:00
Cesy Avon 5788c0c5ce Putting jquery-ui-rails back so things work 2017-06-15 15:28:50 +00:00
Cesy Avon 6f6e0a58a3 Bundle update 2017-06-15 15:28:50 +00:00
Cesy Avon 15b49672ee Removing any locks on versions that don't have comments explaining why 2017-06-15 15:28:14 +00:00
Daniel O'Connor 9e2c7d0748 Merge pull request #1361 from Growstuff/bundle-update-2017-06-15-181612
Bundle Update on 2017-06-15
2017-06-15 20:04:07 +09:30
deppbot 5ff0e2c565 Bundle Update on 2017-06-15 2017-06-15 18:16:13 +08:00
Cesy d40665fb08 Merge pull request #1360 from Growstuff/bundle-update-2017-06-12-143439
Bundle Update on 2017-06-12
2017-06-12 09:03:45 +01:00
Cesy 3b6a42b8f2 Merge pull request #1343 from Growstuff/dev
Release 26
2017-06-12 09:01:10 +01:00
deppbot cf3772af43 Bundle Update on 2017-06-12 2017-06-12 14:34:40 +08:00
Cesy 2f30343303 Merge pull request #1341 from Br3nda/issue-1044-account-deletion
Issue 1044 account deletion
2017-06-11 19:01:00 +01:00
Brenda Wallace 8de7e7a00b remove pending admin deletion specs. covered by model spec 2017-06-09 23:35:04 +12:00
Brenda Wallace 46efcf3e61 Spec for Forum owners and Crop creators deleting their accounts 2017-06-09 23:25:40 +12:00
Brenda Wallace 7968f3e407 Marked some un-written specs as pending 2017-06-09 23:00:38 +12:00
Brenda Wallace 639232bc87 Removal from newsletter spec is in model spec 2017-06-09 22:55:11 +12:00
Brenda Wallace e0bc1c936a Spec for comments by deleted members 2017-06-09 22:54:36 +12:00
Brenda Wallace 910a9673dc Unsubscribes newsletter before member destroying 2017-06-09 22:39:07 +12:00
Brenda Wallace 582dd2c9fd Checks the deleted members are not found 2017-06-09 21:28:47 +12:00
Brenda Wallace 1a743d7592 Filled in spec for link to delete member's account 2017-06-09 21:17:12 +12:00
Shiny 174040aa1b Merge branch 'dev' into issue-1044-account-deletion 2017-06-09 21:04:41 +12:00
deppbot 4471ac64e4 Bundle Update on 2017-06-09 2017-06-09 21:03:03 +12:00
Daniel O'Connor a8bb6c9f58 Merge pull request #1357 from cesy/bundleupdate0
Bundle update 2017-06-08
2017-06-09 09:55:12 +09:30
Daniel O'Connor 7d7053f558 Merge branch 'dev' into bundleupdate0 2017-06-09 09:54:24 +09:30
Daniel O'Connor 6f59896d96 Merge pull request #1358 from cesy/bundleupdate
Rails 4.2.7->4.2.8
2017-06-09 09:53:45 +09:30
Cesy Avon e8cf19cc9d Bundle update 2017-06-08 2017-06-08 16:20:11 +00:00
Cesy Avon 5a3d15d101 Bundle update 2017-06-08 16:19:00 +00:00
Cesy Avon 142be72fc3 Upgrading Rails 2017-06-08 16:07:30 +00:00
Brenda Wallace c6331fc449 Spec checks deleted member doesn't appear in interesting queries 2017-06-04 19:31:27 +12:00
Brenda Wallace e8455cd943 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-06-04 19:27:37 +12:00
Brenda Wallace 080e728905 Spec checks you can't log in after deleting your account 2017-06-04 19:21:58 +12:00
Shiny db532fcc8f Merge branch 'dev' into issue-1044-account-deletion 2017-06-04 13:00:30 +12:00
deppbot e78d899528 Bundle Update on 2017-06-03 2017-06-04 12:55:47 +12:00
Brenda Wallace 1f916b8314 Post says Member Deleted when they are 2017-06-02 22:51:48 +12:00
Brenda Wallace 1cdcaac41e comment says "Member Deleted" when they are 2017-06-02 22:50:48 +12:00
Brenda Wallace bbc3ca749f Removed author_exists scope. It is part of default 2017-06-02 22:43:25 +12:00
Brenda Wallace 20b980a162 Helpful comment explains why we use act_as_paranoid 2017-06-02 22:42:03 +12:00
Brenda Wallace 37897ad595 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-06-02 22:40:56 +12:00
Brenda Wallace 72f805e135 Doesn't need check the :deleted field in registraions 2017-06-02 22:40:39 +12:00
Shiny 1bb4f601a1 Merge branch 'dev' into issue-1044-account-deletion 2017-06-02 22:35:07 +12:00
Brenda Wallace fb012c073e leaves a record of orders and payments intact when members deleted 2017-06-02 22:34:19 +12:00
Brenda Wallace 3dfd9eedca Updating member deletion specs 2017-06-02 21:49:28 +12:00
Brenda Wallace 75d2c0ea3c destroy member if password correct 2017-06-02 20:49:30 +12:00
Brenda Wallace 08996c4157 removed members#destroy. this should be on the registrations controller 2017-06-02 20:48:43 +12:00
Brenda Wallace c48e24845e Remove owner_exists scope 2017-06-02 20:28:32 +12:00
Cesy Avon 61f93df6ff Feature specs for member deletion 2017-06-02 19:48:59 +12:00
deppbot 34e5e0850d Bundle Update on 2017-05-31 2017-05-31 18:27:23 +12:00
Shiny 7621da7041 Merge branch 'dev' into issue-1044-account-deletion 2017-05-30 20:39:44 +12:00
Brenda Wallace 8bcc5104e5 Delegate planting predictions 2017-05-29 22:45:14 +12:00
Brenda Wallace 4bbeca9f3e only look up other plantings finishing, if we have a crop 2017-05-29 22:45:14 +12:00
Brenda Wallace 54748ac20d Removed current_date variable from planting_predictions 2017-05-29 22:45:14 +12:00
Brenda Wallace 3c8b80574a Small DRY of planting models -> predict added 2017-05-29 22:45:14 +12:00
Brenda Wallace 288ad782d2 Planted? = true when planted today 2017-05-29 22:45:14 +12:00
Brenda Wallace 5d97a7edac Move setting of days_before_maturity back to plant model 2017-05-29 22:45:14 +12:00
Brenda Wallace ff1c835cda Moving the planting predictions to own service 2017-05-29 22:45:14 +12:00
Daniel O'Connor 479f61b224 Merge pull request #1352 from Br3nda/admin-typo
Fixed admin typo
2017-05-29 19:18:59 +09:30
Brenda Wallace ac94b8b6d3 Fixed admin typo 2017-05-29 17:52:08 +12:00
Shiny fedc7a7fb6 Merge branch 'dev' into issue-1044-account-deletion 2017-05-29 16:17:59 +12:00
Brenda Wallace 9f9df07390 DRY photos controller more 2017-05-29 16:17:43 +12:00
Brenda Wallace e5a705aeae Responders on the roles controller 2017-05-29 16:17:43 +12:00
Brenda Wallace fb0f74c4d8 Changed location we direct to after garden destroy 2017-05-29 16:17:43 +12:00
Brenda Wallace 963aafd5ab Added missing respond_with to crops controller
This tells rails what to use in json responses
2017-05-29 16:17:43 +12:00
Brenda Wallace efe2f49e7f More DRY Harvests controller 2017-05-29 16:17:43 +12:00
Brenda Wallace a7178b6da7 changed spec to expect responder gem flash 2017-05-29 16:17:43 +12:00
Brenda Wallace 2da3cd6673 Fixed location to redirect to afver comment add/update 2017-05-29 16:17:43 +12:00
Brenda Wallace 5d50f9aec2 DRY the admin controller 2017-05-29 16:17:43 +12:00
Brenda Wallace cfb43ba07c DRY the homes controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 3811417d70 More DRY comments controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 9b3c77a0e6 More DRY comments controller 2017-05-29 16:17:43 +12:00
Brenda Wallace b5636af3be Add responders to alternate names controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 3e93fb5e2e Add responders on products controller 2017-05-29 16:17:43 +12:00
Brenda Wallace c22c92e9f4 Validates min price on product
the database has this constraint already. Adding so the ruby models
match.
2017-05-29 16:17:43 +12:00
Brenda Wallace 97a763660a DRY the products controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 8a25ecc635 DRY the roles controller 2017-05-29 16:17:43 +12:00
Brenda Wallace ee52c14b95 Put rubocop word array settings back 2017-05-29 16:17:43 +12:00
Brenda Wallace 3178e44843 DRY some of the places_controller 2017-05-29 16:17:43 +12:00
Brenda Wallace f510dfd8d9 Removed fixed issues from rubocop_todo 2017-05-29 16:17:43 +12:00
Brenda Wallace 7ad13d3eff Don't restrict crop search to approved 2017-05-29 16:17:43 +12:00
Brenda Wallace e0c7e8c15b Removed route comments and extras on plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 5e91effb12 More DRY the plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 9560da90ab Add Scientific names to the menu 2017-05-29 16:17:43 +12:00
Brenda Wallace 9e1ed8e9eb add flash responders to plants parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 15592d01d0 Small dry of plant_parts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 15d93e6c33 Move includes(:photos) before pagination 2017-05-29 16:17:43 +12:00
Brenda Wallace 484e20ba83 Don't attempt to create blank altnames or scinames 2017-05-29 16:17:43 +12:00
Brenda Wallace d341e977c3 Fix up check of pending crops in view 2017-05-29 16:17:43 +12:00
Brenda Wallace e7d7ee396e Further DRY of saving crops 2017-05-29 16:17:43 +12:00
Brenda Wallace adf585852a Revert "Wikipedia url is always required"
This reverts commit ba5ad00f5c.
2017-05-29 16:17:43 +12:00
Brenda Wallace de5b56235e Small style change to reduce size of crops#show 2017-05-29 16:17:43 +12:00
Brenda Wallace 318ef46ae8 crops pending approval, fetched in one method (DRY) 2017-05-29 16:17:43 +12:00
Brenda Wallace b982793fbf Wikipedia url is always required
The form says it's required, so it should be required.
2017-05-29 16:17:43 +12:00
Brenda Wallace 6fef56ebb7 DRY the crops controller 2017-05-29 16:17:43 +12:00
Brenda Wallace fa586c15aa Dry the scientific names controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 51be3db970 Use a guard clasue in shop controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 5d654175a9 A bunch of single line methods 2017-05-29 16:17:43 +12:00
Brenda Wallace e9003ad32a Small dry of crops controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 38c3320731 Rubocop fix up in accounts controller 2017-05-29 16:17:43 +12:00
Brenda Wallace e6b556851a More DRYing of members controller 2017-05-29 16:17:43 +12:00
Brenda Wallace a30285ef49 DRY some of the members controller 2017-05-29 16:17:43 +12:00
Brenda Wallace 4f67f17551 DRY the shop controller 2017-05-29 16:17:43 +12:00
Shiny 8f66009d0d Merge branch 'dev' into issue-1044-account-deletion 2017-05-29 15:56:17 +12:00
Daniel O'Connor cdd12fd4dd Merge pull request #1348 from Br3nda/inactive-plantings
Inactive plantings show as tiny thumbnails
2017-05-29 10:52:37 +09:30
Daniel O'Connor 3ff0018a12 Merge branch 'dev' into inactive-plantings 2017-05-29 09:46:03 +09:30
Daniel O'Connor 0b0f479752 Merge pull request #1346 from Br3nda/bugfix-brokenurl-crop-rss
Fixed url in crop rss feed
2017-05-29 09:44:04 +09:30
Shiny b7148b99dc Merge branch 'dev' into issue-1044-account-deletion 2017-05-28 20:54:02 +12:00
Brenda Wallace 8076e58a97 Owner must exist so we can see photos 2017-05-28 19:32:34 +12:00
Shiny 251d390c23 Merge branch 'dev' into bugfix-brokenurl-crop-rss 2017-05-28 18:52:03 +12:00
Brenda Wallace f380f222a9 Move edit link to top of card 2017-05-28 18:51:01 +12:00
Brenda Wallace eacdab45ba Removed planting.with_dates 2017-05-28 18:44:26 +12:00
Brenda Wallace dcb949e7b3 Fixed bug - error when planting has no finished_at 2017-05-28 18:10:53 +12:00
Brenda Wallace ebf1468652 Fix up small haml nexting bug 2017-05-28 18:07:19 +12:00
Brenda Wallace 4726b57c47 Inactive plantings show as tiny thumbnails 2017-05-28 17:13:04 +12:00
deppbot f422336aff Bundle Update on 2017-05-28 2017-05-28 14:23:17 +12:00
Brenda Wallace 2c622af49c Fixed url in crop rss feed 2017-05-27 14:30:24 +12:00
Brenda Wallace 0b684eb05e Checks owner exists, in default_scopes of many models 2017-05-26 23:00:06 +12:00
Brenda Wallace 9c4a45bc29 Merge remote-tracking branch 'origin/issue-1044-account-deletion' into issue-1044-account-deletion 2017-05-26 21:25:00 +12:00
Brenda Wallace 00f7551c0a Merge remote-tracking branch 'upstream/dev' into issue-1044-account-deletion 2017-05-26 21:24:41 +12:00
Shiny ee7b915313 Merge branch 'dev' into issue-1044-account-deletion 2017-05-26 21:24:29 +12:00
Daniel O'Connor af0871cd0a Merge pull request #1344 from Growstuff/bundle-update-2017-05-25-051814
Bundle Update on 2017-05-25
2017-05-25 11:49:55 +09:30
deppbot 60d074a0de Bundle Update on 2017-05-25 2017-05-25 05:18:15 +08:00
Shiny c2ba2719de Merge branch 'master' into dev 2017-05-24 13:26:06 +12:00
Shiny afb0b9e387 Merge branch 'dev' into issue-1044-account-deletion 2017-05-24 13:25:21 +12:00
pozorvlak e4e4d9600e Merge pull request #1340 from Br3nda/fix-1334
Display seeds for trade, on homepage, as thumbnails.
2017-05-24 00:35:28 +01:00
Brenda Wallace a6964a8f4e Update specs to join before checking member is destroyed. 2017-05-21 21:59:28 +12:00
Brenda Wallace b538330785 Form to delete your own account 2017-05-21 21:51:44 +12:00
Brenda Wallace aee90268a5 Fixed old migration - to work under act_as_paranoid 2017-05-21 21:50:52 +12:00
Brenda Wallace cabf849774 Deleting of users 2017-05-21 21:29:09 +12:00
Brenda Wallace 7251f3308b Merge branch 'fix-1334' into issue-1044-account-deletion 2017-05-21 11:46:30 +12:00
Brenda Wallace 121d3d99fe Tests for retrieving data of deleted members 2017-05-21 11:36:07 +12:00
Brenda Wallace c4938e00e4 Member acts as paranoid 2017-05-21 11:33:12 +12:00
Brenda Wallace 4a926415db Call destroy, to mark a member as deleted 2017-05-21 11:32:54 +12:00
Brenda Wallace 7d4c9011aa Member.deleted_at column added 2017-05-21 11:31:53 +12:00
Brenda Wallace b5b2582335 default scope says members deleted :false 2017-05-21 11:17:42 +12:00
Brenda Wallace 7d2a2b96a2 Only show gardens of members who are not deleted 2017-05-21 11:17:09 +12:00
Brenda Wallace e2fe04a44b Form and controller method to mark members as deleted 2017-05-20 22:01:20 +12:00
Brenda Wallace 18c02bf33b Add deleted column to members table 2017-05-20 22:00:15 +12:00
Brenda Wallace 6c0b1018bc Updated spec for homepage seeds 2017-05-20 17:16:03 +12:00
Brenda Wallace 15e2b4f595 Seeds on home page looking like thumbnails 2017-05-20 17:01:07 +12:00
Brenda Wallace 6e7bf11ec8 Seeds delegate name and default_photo to their crop 2017-05-20 17:00:49 +12:00
Brenda Wallace 5f9b0890fb Move seed.interesting to a scope 2017-05-20 16:58:49 +12:00
Brenda Wallace 4841c52bcd order crop.plant_parts by plant_parts.name 2017-05-20 15:46:37 +12:00
Brenda Wallace 7baabca827 Unique is un-necesary when declaring relationship to plant_parts 2017-05-20 15:46:37 +12:00
Brenda Wallace 9a19007b85 More railsy order by in models 2017-05-20 15:46:37 +12:00
Brenda Wallace 677f850e21 Removed extra blank line 2017-05-20 15:46:37 +12:00
Brenda Wallace d771bc3688 More railsy syntax in default scopes 2017-05-20 15:46:37 +12:00
Brenda Wallace 1dfc58c120 Remove default scope from harvest.
Causes an ORDER clause to be added in queries even when not selecting
from that table. E.g. if we 're looking for PlantParts that have a
Harvest
2017-05-20 15:46:37 +12:00
Brenda Wallace 6f58f266a6 Moving has_photos scope to PhotoCapable
-
2017-05-20 15:46:37 +12:00
deppbot e38395b6ba Bundle Update on 2017-05-19 2017-05-20 07:07:27 +12:00
Daniel O'Connor 944d477dbc Merge pull request #1338 from Growstuff/bundle-update-2017-05-16-135240
Bundle Update on 2017-05-16
2017-05-16 16:45:08 +09:30
deppbot cbf7ac0126 Bundle Update on 2017-05-16 2017-05-16 13:52:41 +08:00
Cesy 1ad171f37b Merge pull request #1335 from Growstuff/dev
Release 25
2017-05-15 20:43:16 +01:00
deppbot 06896dacd5 Bundle Update on 2017-05-13 2017-05-14 18:20:44 +12:00
Shiny ff90d6430d Merge branch 'master' into dev 2017-05-13 11:35:26 +12:00
Brenda Wallace 4dbdbc4285 Pull haml gem back to version 4 2017-05-13 11:31:32 +12:00
deppbot 0f1c8e0658 Bundle Update on 2017-05-03 2017-05-13 11:31:32 +12:00
Daniel O'Connor c9ec116c9b Merge pull request #1333 from Br3nda/garden-photos-fixup
Fix up of photo display on garden#show
2017-05-11 17:25:51 +09:30
Brenda Wallace e61c3f619b Revert "Only show first 5 photos on gardens#show"
This reverts commit 93b25a5c32.
2017-05-07 16:10:14 +12:00
Brenda Wallace 93b25a5c32 Only show first 5 photos on gardens#show 2017-05-07 14:41:14 +12:00
Brenda Wallace f7ca32d888 Moved garden photos to right/bottom 2017-05-06 13:30:57 +12:00
Brenda Wallace d57c46066a updated view spec to find glypicon 2017-05-06 13:27:23 +12:00
Brenda Wallace 1e6cb2cfe4 don't eager load harvests 2017-05-06 12:15:03 +12:00
Brenda Wallace 67ae80056a Removed unnecesary div wrap 2017-05-06 12:08:23 +12:00
Brenda Wallace 13fa3c69e8 fixes places
card -> thumbnail
2017-05-06 12:06:28 +12:00
Brenda Wallace caad557b2a Updating specs to click glypicons 2017-05-06 12:03:57 +12:00
Brenda Wallace 0f030d2c27 Planting thumbnail links to planting
fixes #1308
2017-05-06 11:48:17 +12:00
Brenda Wallace 66d548c9c1 Added some glypicons to gardenshow 2017-05-06 11:47:24 +12:00
Brenda Wallace c168bb4a2b More fix up to alignment and thumbnail row counts gardens#show 2017-05-06 11:39:02 +12:00
Brenda Wallace 811db2961a Quick fix up of photo display on garden#show 2017-05-05 23:38:19 +12:00
Brenda Wallace 42cea2ebde Fixed spec for days_before_maturity 2017-04-28 20:48:25 +12:00
Brenda Wallace ccc5eb3c9a Make calc_and_set_days_before_maturity public 2017-04-28 20:48:25 +12:00
Brenda Wallace 0e71a4fcb3 Removed un-needed rubocop ignores 2017-04-28 20:48:25 +12:00
Brenda Wallace 4ea681984f Call calc_and_set_days_before_maturity from controller 2017-04-28 20:48:25 +12:00
Brenda Wallace dadc5b96c6 Reduced duplicate code further, with responders gem
This makes locale-friendly flash notices
2017-04-28 20:48:25 +12:00
Brenda Wallace 787fca138b Added helpful comment about days_until_maturity 2017-04-28 20:48:25 +12:00
Brenda Wallace b820615081 Moved planting maturity to planting model. simplified controller 2017-04-28 20:48:25 +12:00
Cesy 812a6f5ec2 Merge pull request #1328 from Growstuff/dev
release 24
2017-04-28 07:31:21 +01:00
Shiny f1b42ec699 Merge branch 'master' into dev 2017-04-25 13:14:40 +12:00
Brenda Wallace 26c17ea19c Plantings Thumbnails, fit to box 2017-04-25 10:58:17 +12:00
Brenda Wallace acc75f80bf include harvests when retrieving data for plantings#index 2017-04-25 10:58:17 +12:00
Daniel O'Connor a79a65363f Merge pull request #1326 from Br3nda/plantings-validators
Plantings validators
2017-04-24 17:47:41 +09:30
Shiny dfeb4804e7 Merge branch 'dev' into plantings-validators 2017-04-23 19:35:37 +12:00
deppbot 9d20fafd06 Bundle Update on 2017-04-23 2017-04-23 19:35:23 +12:00
Shiny e9a5ef0058 Merge branch 'dev' into plantings-validators 2017-04-22 20:50:29 +12:00
Brenda Wallace d2378376e4 Plantings validators
Adding garden presence true.
Checks crop presence before crop approved
2017-04-22 20:48:48 +12:00
Daniel O'Connor 4b1b5d8a18 Merge pull request #1323 from Growstuff/bundle-update-2017-04-20-122131
Bundle Update on 2017-04-20
2017-04-20 15:27:04 +09:30
deppbot a0770e80e7 Bundle Update on 2017-04-20 2017-04-20 12:21:32 +08:00
Brenda Wallace f08e740ac6 Removed owner_matches?
it's not used anymore
2017-04-19 08:22:03 +00:00
Brenda Wallace 5f23bcfad6 Photo#show for signed in and not signed in, and other members 2017-04-19 08:22:03 +00:00
Brenda Wallace 3cd7b86c99 Photos#show links to items 2017-04-19 08:22:03 +00:00
Brenda Wallace bd53d4a271 updating view spec - link to delete photo has changed 2017-04-19 08:22:03 +00:00
Brenda Wallace 16d88730ec controller specs for PhotoAssociations 2017-04-19 08:22:03 +00:00
Brenda Wallace 5ad88eb6bd Responsive image on photos#show 2017-04-19 08:22:03 +00:00
Brenda Wallace b617eb3140 Deleting photo's association with another item 2017-04-19 08:22:03 +00:00
Brenda Wallace acc4d3ad84 Only delete own associations 2017-04-19 08:22:03 +00:00
Brenda Wallace beb3f7e2b8 Don't overwrite edited photo titles 2017-04-19 08:22:03 +00:00
Brenda Wallace ab46a8dd96 UI for removing photos from plantings 2017-04-19 08:22:03 +00:00
Brenda Wallace b6b578d7e6 Layout change on photos 2017-04-19 08:22:03 +00:00
Brenda Wallace 4d07cf80fa Editing title of photos 2017-04-19 08:22:03 +00:00
Brenda Wallace 93f6b65d8d bugfix: Only show harvests if we have some 2017-04-19 08:22:03 +00:00
Brenda Wallace b40a6723e1 gardens#show Include crop, owner, harvesss and garden in query 2017-04-19 08:22:03 +00:00
Brenda Wallace 2058d28b37 Include owner in query, because we need it later 2017-04-19 08:22:03 +00:00
Brenda Wallace 682c6d6f5e Reduced query count by .includes() on plantings 2017-04-19 08:22:03 +00:00
Brenda Wallace 2be55acc92 Route for flickr auth callback -- Fixes #1106 2017-04-19 08:22:03 +00:00
Brenda Wallace a9a040182c Rubocop compliance for members controller 2017-04-19 08:22:03 +00:00
Shiny f39fe94173 Merge branch 'master' into dev 2017-04-18 18:27:43 +00:00
Brenda Wallace 976bdbbd96 Removed owner_matches?
it's not used anymore
2017-04-18 07:09:47 +00:00
Brenda Wallace cff1d8bfb9 Photo#show for signed in and not signed in, and other members 2017-04-18 07:09:47 +00:00
Brenda Wallace bbdc54cb69 Photos#show links to items 2017-04-18 07:09:47 +00:00
Brenda Wallace 36f1f7b71a updating view spec - link to delete photo has changed 2017-04-18 07:09:47 +00:00
Brenda Wallace e1731793dd controller specs for PhotoAssociations 2017-04-18 07:09:47 +00:00
Brenda Wallace 8ea3b27612 Responsive image on photos#show 2017-04-18 07:09:47 +00:00
Brenda Wallace 9469a69078 Deleting photo's association with another item 2017-04-18 07:09:47 +00:00
Brenda Wallace cc46fe3336 Only delete own associations 2017-04-18 07:09:47 +00:00
Brenda Wallace 52b4064a2d Don't overwrite edited photo titles 2017-04-18 07:09:47 +00:00
Brenda Wallace d367b9ef21 UI for removing photos from plantings 2017-04-18 07:09:47 +00:00
Brenda Wallace 4711e4669f Layout change on photos 2017-04-18 07:09:47 +00:00
Brenda Wallace 3e55024f98 Editing title of photos 2017-04-18 07:09:47 +00:00
Daniel O'Connor ccf56bf944 Merge pull request #1321 from Br3nda/harvests-display
bugfix: Only show harvests if we have some
2017-04-18 12:24:01 +09:30
Shiny 42e51a9cf6 Merge branch 'dev' into harvests-display 2017-04-17 10:00:20 +00:00
Brenda Wallace 667e0cc0e3 bugfix: Only show harvests if we have some 2017-04-17 21:59:31 +12:00
Brenda Wallace 339830b3bb gardens#show Include crop, owner, harvesss and garden in query 2017-04-17 08:59:34 +00:00
Brenda Wallace 7770164672 Include owner in query, because we need it later 2017-04-17 08:59:34 +00:00
Brenda Wallace f333607572 Reduced query count by .includes() on plantings 2017-04-17 08:59:34 +00:00
Brenda Wallace 87d3764eeb Route for flickr auth callback -- Fixes #1106 2017-04-17 08:28:52 +00:00
Cesy faf487b719 Merge pull request #1314 from Br3nda/members-controller
Rubocop compliance for members controller
2017-04-17 09:13:26 +01:00
Shiny 53eb171dfc Merge pull request #1317 from Growstuff/dev
release 22
2017-04-17 05:00:59 +00:00
Shiny 3dbf0df19e Merge branch 'dev' into members-controller 2017-04-17 03:49:54 +00:00
deppbot b0b6931678 Bundle Update on 2017-04-17 2017-04-17 03:45:39 +00:00
Shiny cd272a6443 Merge branch 'dev' into members-controller 2017-04-16 09:44:32 +00:00
Daniel O'Connor d515dba7f2 Merge pull request #1316 from Br3nda/garden-thumbnail
Garden thumbnail display cleanup
2017-04-16 15:50:52 +09:30
Shiny 4958330c9e Merge branch 'master' into dev 2017-04-16 02:42:38 +00:00
Brenda Wallace 17236a4a8a Garden thumbnail display cleanup 2017-04-16 13:48:22 +12:00
Brenda Wallace 936a8778ed Rubocop compliance for members controller 2017-04-16 12:03:48 +12:00
Daniel O'Connor 3ccab3f857 Merge pull request #1309 from Br3nda/fix_1305
Fix 1305
2017-04-15 17:11:02 +09:30
Daniel O'Connor 0201e873eb Merge branch 'dev' into fix_1305 2017-04-15 17:03:15 +09:30
Daniel O'Connor 20289e6566 Merge pull request #1310 from Br3nda/counter-caches
Adding counter caches
2017-04-15 17:01:20 +09:30
Shiny 85ded414ec Merge branch 'dev' into fix_1305 2017-04-15 06:50:16 +00:00
Shiny 299c95c5f5 Merge branch 'dev' into counter-caches 2017-04-14 07:40:19 +00:00
Taylor Griffin 8f51090098 make mentionbot settings file 2017-04-14 07:40:01 +00:00
deppbot 5551eeba24 Bundle Update on 2017-04-14 2017-04-14 07:10:10 +00:00
Shiny 7a5a68f511 Merge branch 'dev' into counter-caches 2017-04-14 01:44:44 +00:00
Shiny 6d4ec9ad34 Merge branch 'dev' into fix_1305 2017-04-14 01:44:35 +00:00
Brenda Wallace fffef75813 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 01:43:42 +00:00
Brenda Wallace 0e2d7b4393 Allow instance variables in partials for now 2017-04-14 01:43:42 +00:00
Brenda Wallace f08068c289 Upgrade haml_lint 2017-04-14 01:43:42 +00:00
deppbot ff653934ad Bundle Update on 2017-04-08 2017-04-14 01:43:42 +00:00
Brenda Wallace c4bed2cf4d Merge branch 'haml-lint-fix' into counter-caches 2017-04-14 11:42:02 +12:00
Brenda Wallace 47c0f74f81 Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 11:40:52 +12:00
Brenda Wallace 171e34914b Allow instance variables in partials for now 2017-04-14 11:40:46 +12:00
Brenda Wallace 8010a8b56c Upgrade haml_lint 2017-04-14 11:40:40 +12:00
Brenda Wallace ac165ce0cd Adding counter caches 2017-04-14 11:32:31 +12:00
Brenda Wallace 4925fde28f Ignore ConsecutiveComments and IdNames in haml for now 2017-04-14 09:43:16 +12:00
Brenda Wallace 6580cf38b0 Allow instance variables in partials for now 2017-04-13 23:02:16 +12:00
Brenda Wallace fdf10202ba Upgrade haml_lint 2017-04-13 22:56:07 +12:00
Brenda Wallace 85a368999b we love rubocop 2017-04-13 14:30:51 +12:00
Daniel O'Connor 6ba4b4560e Fix #1305 by adding aggregation
Expand test coverage
member_id is owner_id on plantings
Argue with ActionView::Template::Error about what we can group on

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

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

No files matched your search

+2 -2
View File
@@ -20,8 +20,8 @@ engines:
- ruby
- javascript
exclude_fingerprints:
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
- 16dbcb58d6caa7ccfe241417831ecfa6
- 7d7dca4f27f50e3084f203280073cc74
fixme:
enabled: true
exclude_fingerprints: # rubocop_todo filename
+3 -1
View File
@@ -14,4 +14,6 @@ Pathogen:
custom_plan.rb
zeus.json
.bundle
.idea/**
.idea/**
public/**
node_modules
+6 -1
View File
@@ -1,4 +1,9 @@
linters:
LineLength:
max: 120
InstanceVariables:
enabled: false
IdNames:
enabled: false
ConsecutiveComments:
enabled: false
+10
View File
@@ -0,0 +1,10 @@
---
fail_on_violations: true
ruby:
config_file: .rubocop.yml
haml:
config_file: .haml-lint.yml
scss:
config_file: .scss-lint.yml
eslint:
config_file: .eslintrc
+3
View File
@@ -0,0 +1,3 @@
{
"userBlacklist": ["tygriffin","oshiho3"]
}
+100
View File
@@ -0,0 +1,100 @@
---
# Use this file to configure the Overcommit hooks you wish to use. This will
# extend the default configuration defined in:
# https://github.com/brigade/overcommit/blob/master/config/default.yml
#
# At the topmost level of this YAML file is a key representing type of hook
# being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
# customize each hook, such as whether to only run it on certain files (via
# `include`), whether to only display output if it fails (via `quiet`), etc.
#
# For a complete list of hooks, see:
# https://github.com/brigade/overcommit/tree/master/lib/overcommit/hook
#
# For a complete list of options that you can use to customize hooks, see:
# https://github.com/brigade/overcommit#configuration
#
# Uncomment the following lines to make the configuration take effect.
PreCommit:
ALL:
quiet: false
problem_on_unmodified_line: warn
RuboCop:
enabled: true
command: ['bundle', 'exec', 'rubocop', '-D', '--rails']
TrailingWhitespace:
enabled: true
exclude:
- '**/db/structure.sql' # Ignore trailing whitespace in generated files
CoffeeLint:
enabled: true
on_fail: warn
command: ['npm', 'run', 'coffeelint']
required_executable: 'npm'
HardTabs:
enabled: true
AuthorEmail:
enabled: false
AuthorName:
enabled: false
CssLint:
enabled: true
exclude:
- '**/bootstrap.min.css'
command: ['npm', 'run', 'csslint']
required_executable: 'npm'
HamlLint:
enabled: true
command: ['bundle', 'exec', 'haml-lint', 'app/views']
JsonSyntax:
enabled: true
BundleOutdated:
enabled: true
on_warn: warn
BundleAudit:
enabled: true
on_warn: warn
JsHint:
enabled: true
exclude:
- 'app/assets/**'
- 'spec/javascripts/support/vendor/**'
- '**/bootstrap*'
command: ['npm', 'run', 'jshint']
required_executable: 'npm'
ScssLint:
enabled: true
RailsSchemaUpToDate:
enabled: true
MergeConflicts:
enabled: true
YamlLint:
enabled: true
PostCheckout:
ALL:
quiet: false
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
PostMerge:
BundleInstall:
enabled: true
RailsSchemaUpToDate:
enabled: true
# PrePush:
# ALL:
# on_warn: fail # Treat all warnings as failures
# quiet: false
# # Brakeman:
# # enabled: true
# RSpec:
# enabled: true
# command: ['bundle', 'exec', 'rspec', '--fail-fast']
#
# IndexTags:
# enabled: true # Generate a tags file with `ctags` each time HEAD changes
+27 -32
View File
@@ -19,6 +19,13 @@ Style/FileName:
Style/StringLiterals:
Enabled: false
# Stop hound and codeclimate fighting
Style/PercentLiteralDelimiters:
PreferredDelimiters:
default: ()
'%i': ()
'%w': ()
Style/MultilineMethodCallIndentation:
EnforcedStyle: indented
@@ -27,41 +34,11 @@ Style/MultilineMethodCallIndentation:
Style/AlignParameters:
EnforcedStyle: with_fixed_indentation
Metrics/MethodLength:
Description: 'Avoid methods longer than 30 lines of code.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
# Set to 30 once all methods are fixed.
# Max: 30
Max: 104
# Remove the following once the code style matches
# Offense count: 59
Metrics/AbcSize:
Max: 32
# Offense count: 5
# Configuration parameters: CountComments.
Metrics/BlockLength:
Max: 62
# Offense count: 6
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 269
# Offense count: 6
Metrics/CyclomaticComplexity:
Max: 11
Metrics/LineLength:
Max: 120
# Offense count: 8
Metrics/PerceivedComplexity:
Max: 9
# See https://github.com/bbatsov/rubocop/issues/3629
Rails/HttpPositionalArguments:
# turn these back on in Rails 5
Rails/HttpPositionalArguments: # See https://github.com/bbatsov/rubocop/issues/3629
Enabled: false
Style/Documentation:
@@ -76,3 +53,21 @@ Rails/Output:
Exclude:
- 'config/unicorn.rb'
- 'db/seeds.rb'
Metrics/BlockLength:
Exclude:
- 'spec/**/*'
- '**/*.rake'
- 'config/**/*.rb'
# Remove the following once the code style matches
Metrics/MethodLength:
Max: 34
Metrics/AbcSize:
Max: 31
Metrics/ClassLength:
Max: 179
Metrics/CyclomaticComplexity:
Max: 11
Metrics/PerceivedComplexity:
Max: 9
+3 -335
View File
@@ -1,40 +1,15 @@
# This configuration was generated by
# `rubocop --auto-gen-config --exclude-limit 500`
# on 2017-01-21 15:58:02 +1030 using RuboCop version 0.47.1.
# `rubocop --auto-gen-config --no-offense-counts`
# on 2017-11-05 20:41:45 +1300 using RuboCop version 0.47.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 22
Lint/AmbiguousRegexpLiteral:
Exclude:
- 'spec/controllers/admin/orders_controller_spec.rb'
- 'spec/controllers/orders_controller_spec.rb'
- 'spec/features/cms_spec.rb'
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
- 'spec/models/comment_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/views/members/show.rss.haml_spec.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
# Offense count: 1
Lint/HandleExceptions:
Exclude:
- 'lib/tasks/testing.rake'
# Offense count: 11
# Cop supports --auto-correct.
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
Lint/UnusedBlockArgument:
Exclude:
- 'app/controllers/crops_controller.rb'
- 'app/controllers/sessions_controller.rb'
- 'config/unicorn.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
Lint/UnusedMethodArgument:
@@ -45,67 +20,27 @@ Lint/UnusedMethodArgument:
- 'app/validators/approved_validator.rb'
- 'spec/views/plantings/show.html.haml_spec.rb'
# Offense count: 5
Lint/Void:
Exclude:
- 'spec/models/crop_spec.rb'
- 'spec/models/garden_spec.rb'
- 'spec/models/post_spec.rb'
# Offense count: 55
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Exclude:
- '**/*'
# Offense count: 2
# Cop supports --auto-correct.
Performance/StringReplacement:
Exclude:
- 'app/models/planting.rb'
- 'spec/rails_helper.rb'
# Offense count: 9
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: strict, flexible
Rails/Date:
Exclude:
- 'app/controllers/harvests_controller.rb'
- 'db/seeds.rb'
- 'lib/tasks/growstuff.rake'
- 'spec/controllers/plantings_controller_spec.rb'
- 'spec/factories/planting.rb'
- 'spec/features/plantings/planting_a_crop_spec.rb'
- 'spec/features/shared_examples/append_date.rb'
# Offense count: 4
Rails/FilePath:
Exclude:
- 'spec/rails_helper.rb'
# Offense count: 3
Rails/OutputSafety:
Exclude:
- 'app/helpers/application_helper.rb'
- 'app/helpers/auto_suggest_helper.rb'
- 'app/helpers/gardens_helper.rb'
# Offense count: 1
# Configuration parameters: Include.
# Include: db/migrate/*.rb
Rails/ReversibleMigration:
Exclude:
- 'db/migrate/20130215131921_rename_notification_fields.rb'
# Offense count: 4
# Configuration parameters: Blacklist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
Rails/SkipsModelValidations:
Exclude:
- 'app/controllers/plantings_controller.rb'
- 'db/seeds.rb'
# Offense count: 7
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: strict, flexible
Rails/TimeZone:
@@ -114,9 +49,7 @@ Rails/TimeZone:
- 'spec/factories/member.rb'
- 'spec/factories/post.rb'
- 'spec/models/post_spec.rb'
- 'spec/views/plantings/index.html.haml_spec.rb'
# Offense count: 7
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: always, conditionals
@@ -125,12 +58,10 @@ Style/AndOr:
- 'config/unicorn.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 1
Style/AsciiComments:
Exclude:
- 'config/initializers/comfortable_mexican_sofa.rb'
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: percent_q, bare_percent
@@ -139,7 +70,6 @@ Style/BarePercentLiterals:
- 'app/helpers/auto_suggest_helper.rb'
- 'spec/support/feature_helpers.rb'
# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
# SupportedStyles: line_count_based, semantic, braces_for_chaining
@@ -148,32 +78,21 @@ 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'
- 'spec/models/comment_spec.rb'
- 'spec/models/follow_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/models/post_spec.rb'
- 'spec/views/crops/edit.html.haml_spec.rb'
# Offense count: 8
# Cop supports --auto-correct.
Style/BlockEndNewline:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
# Offense count: 4
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: nested, compact
Style/ClassAndModuleChildren:
@@ -181,61 +100,19 @@ Style/ClassAndModuleChildren:
- 'app/controllers/admin/orders_controller.rb'
- 'lib/actions/oauth_signup_action.rb'
- 'lib/haml/filters/escaped_markdown.rb'
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/ClassMethods:
Exclude:
- 'app/models/planting.rb'
# Offense count: 2
# Cop supports --auto-correct.
Style/ColonMethodCall:
Exclude:
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: Keywords.
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
Style/CommentAnnotation:
Exclude:
- 'app/controllers/crops_controller.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/DefWithParentheses:
Exclude:
- 'spec/views/posts/_single.html.haml_spec.rb'
# Offense count: 10
# Cop supports --auto-correct.
Style/EachForSimpleLoop:
Exclude:
- 'spec/models/crop_spec.rb'
- 'spec/views/home/_crops.html.haml_spec.rb'
# Offense count: 11
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: compact, expanded
Style/EmptyMethod:
Exclude:
- 'app/controllers/account_types_controller.rb'
- 'app/controllers/accounts_controller.rb'
- 'app/controllers/alternate_names_controller.rb'
- 'app/controllers/gardens_controller.rb'
- 'app/controllers/photos_controller.rb'
- 'app/controllers/plant_parts_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'app/controllers/products_controller.rb'
- 'app/controllers/roles_controller.rb'
- 'app/controllers/scientific_names_controller.rb'
- 'app/controllers/seeds_controller.rb'
# Offense count: 5
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: format, sprintf, percent
Style/FormatString:
@@ -244,23 +121,18 @@ Style/FormatString:
- 'spec/helpers/application_helper_spec.rb'
- 'spec/views/shop/index_spec.rb'
# Offense count: 2
Style/IdenticalConditionalBranches:
Exclude:
- 'app/controllers/follows_controller.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Exclude:
- 'app/controllers/shop_controller.rb'
- 'app/helpers/crops_helper.rb'
- 'app/models/planting.rb'
- 'config/initializers/geocoder.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 7
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: line_count_dependent, lambda, literal
@@ -269,118 +141,25 @@ Style/Lambda:
- 'spec/controllers/member_controller_spec.rb'
- 'spec/models/photo_spec.rb'
# Offense count: 2
# Cop supports --auto-correct.
Style/MethodCallWithoutArgsParentheses:
Exclude:
- 'spec/helpers/application_helper_spec.rb'
- 'spec/views/plantings/new.html.haml_spec.rb'
# Offense count: 8
# Cop supports --auto-correct.
Style/MultilineBlockLayout:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/controllers/posts_controller.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/planting_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: symmetrical, new_line, same_line
Style/MultilineHashBraceLayout:
Exclude:
- 'app/models/planting.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/MultilineIfModifier:
Exclude:
- 'spec/rails_helper.rb'
# Offense count: 5
# Cop supports --auto-correct.
Style/MultilineIfThen:
Exclude:
- 'script/check_contributors_md'
- 'script/gemfile_check'
# Offense count: 95
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: symmetrical, new_line, same_line
Style/MultilineMethodCallBraceLayout:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/authentications_controller.rb'
- 'app/controllers/seeds_controller.rb'
- 'spec/controllers/order_items_controller_spec.rb'
- 'spec/helpers/gardens_helper_spec.rb'
- 'spec/helpers/harvests_helper_spec.rb'
- 'spec/helpers/plantings_helper_spec.rb'
- 'spec/helpers/seeds_helper_spec.rb'
- 'spec/models/ability_spec.rb'
- 'spec/models/crop_spec.rb'
- 'spec/models/harvest_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/order_spec.rb'
- 'spec/models/plant_part_spec.rb'
- 'spec/models/planting_spec.rb'
- 'spec/models/post_spec.rb'
- 'spec/views/account_types/edit.html.haml_spec.rb'
- 'spec/views/account_types/new.html.haml_spec.rb'
- 'spec/views/account_types/show.html.haml_spec.rb'
- 'spec/views/crops/_grown_for.html.haml_spec.rb'
- 'spec/views/crops/_planting_advice.html.haml_spec.rb'
- 'spec/views/forums/edit.html.haml_spec.rb'
- 'spec/views/harvests/index.html.haml_spec.rb'
- 'spec/views/orders/show.html.haml_spec.rb'
- 'spec/views/photos/edit.html.haml_spec.rb'
- 'spec/views/plant_parts/edit.html.haml_spec.rb'
- 'spec/views/plant_parts/new.html.haml_spec.rb'
- 'spec/views/plantings/_form.html.haml_spec.rb'
- 'spec/views/plantings/edit.html.haml_spec.rb'
- 'spec/views/plantings/index.html.haml_spec.rb'
- 'spec/views/plantings/new.html.haml_spec.rb'
- 'spec/views/plantings/show.html.haml_spec.rb'
- 'spec/views/posts/edit.html.haml_spec.rb'
- 'spec/views/products/edit.html.haml_spec.rb'
- 'spec/views/products/new.html.haml_spec.rb'
- 'spec/views/roles/edit.html.haml_spec.rb'
- 'spec/views/roles/index.html.haml_spec.rb'
- 'spec/views/roles/new.html.haml_spec.rb'
- 'spec/views/roles/show.html.haml_spec.rb'
- 'spec/views/scientific_names/edit.html.haml_spec.rb'
- 'spec/views/scientific_names/show.html.haml_spec.rb'
# Offense count: 2
Style/MultilineTernaryOperator:
Exclude:
- 'app/controllers/notifications_controller.rb'
- 'app/controllers/order_items_controller.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/MutableConstant:
Exclude:
- 'app/controllers/members_controller.rb'
- 'app/models/planting.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/NegatedIf:
Exclude:
- 'app/helpers/crops_helper.rb'
# Offense count: 2
Style/NestedTernaryOperator:
Exclude:
- 'app/controllers/harvests_controller.rb'
- 'app/controllers/plantings_controller.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
@@ -388,26 +167,11 @@ Style/Next:
Exclude:
- 'lib/tasks/growstuff.rake'
# Offense count: 2
# Cop supports --auto-correct.
Style/NilComparison:
Exclude:
- 'lib/tasks/growstuff.rake'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedOctalStyle, SupportedOctalStyles.
# SupportedOctalStyles: zero_with_o, zero_only
Style/NumericLiteralPrefix:
Exclude:
- 'spec/views/plantings/_form.html.haml_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/NumericLiterals:
MinDigits: 9
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles.
# SupportedStyles: predicate, comparison
@@ -417,53 +181,20 @@ Style/NumericPredicate:
- 'app/helpers/harvests_helper.rb'
- 'app/helpers/plantings_helper.rb'
- 'lib/tasks/growstuff.rake'
- 'script/check_contributors_md'
# Offense count: 3
# Cop supports --auto-correct.
Style/ParallelAssignment:
Exclude:
- 'app/mailers/notifier.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: AllowSafeAssignment.
Style/ParenthesesAroundCondition:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/orders_controller.rb'
- 'app/helpers/crops_helper.rb'
- 'config/factory_girl.rb'
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
Exclude:
- 'app/helpers/auto_suggest_helper.rb'
- 'script/check_contributors_md'
- 'spec/features/signin_spec.rb'
- 'spec/features/signout_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/PerlBackrefs:
Exclude:
- 'lib/haml/filters/growstuff_markdown.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/RedundantParentheses:
Exclude:
- 'app/helpers/plantings_helper.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/RedundantSelf:
Exclude:
- 'lib/geocodable.rb'
# Offense count: 6
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
@@ -474,86 +205,23 @@ Style/RegexpLiteral:
- 'spec/views/devise/registrations/edit_spec.rb'
- 'spec/views/members/index.html.haml_spec.rb'
- 'spec/views/posts/index.html.haml_spec.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/SelfAssignment:
Exclude:
- 'app/helpers/crops_helper.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles.
# SupportedStyles: use_perl_names, use_english_names
Style/SpecialGlobalVars:
EnforcedStyle: use_perl_names
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
# IgnoredMethods: respond_to, define_method
Style/SymbolProc:
Exclude:
- 'app/controllers/crops_controller.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowSafeAssignment.
# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex
Style/TernaryParentheses:
Exclude:
- 'app/helpers/plantings_helper.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInArguments:
Exclude:
- 'db/seeds.rb'
- 'lib/actions/oauth_signup_action.rb'
- 'lib/tasks/growstuff.rake'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInLiteral:
Exclude:
- 'config/environments/test.rb'
- 'spec/rails_helper.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/UnlessElse:
Exclude:
- 'app/controllers/omniauth_callbacks_controller.rb'
# Offense count: 12
# Cop supports --auto-correct.
Style/UnneededInterpolation:
Exclude:
- 'spec/features/crops/crop_wranglers_spec.rb'
- 'spec/features/following_spec.rb'
- 'spec/features/shared_examples/append_date.rb'
- 'spec/models/crop_spec.rb'
- 'spec/models/forum_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/plant_part_spec.rb'
- 'spec/views/layouts/_header_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/UnneededPercentQ:
Exclude:
- 'spec/support/feature_helpers.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, WordRegex.
# SupportedStyles: percent, brackets
Style/WordArray:
EnforcedStyle: percent
MinSize: 5
MinSize: 4
+1 -1
View File
@@ -1 +1 @@
2.3.3
2.4.1
+37 -24
View File
@@ -1,46 +1,59 @@
sudo: false
sudo: required
language: ruby
cache:
bundler: true
directories:
- travis_phantomjs
- tmp/cache/assets/test/sprockets
env:
matrix:
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='true'
- GROWSTUFF_SITE_NAME="Growstuff (travis)" RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' GROWSTUFF_ELASTICSEARCH='false'
- GROWSTUFF_ELASTICSEARCH='true' RSPEC_TAG=elasticsearch STATIC_CHECKS=false
- GROWSTUFF_ELASTICSEARCH='false' RSPEC_TAG=~elasticsearch STATIC_CHECKS=false
- STATIC_CHECKS=true
global:
secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
rvm:
- 2.3.3
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
before_install:
- ./script/install_phantomjs;
- export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
# Force Travis to use Elastic Search 2.4.0
- >
if [ $(phantomjs --version) != '2.1.1' ]; then
PHANTOM_URL=https://assets.membergetmember.co/software/phantomjs-2.1.1-linux-x86_64.tar.bz2;
rm -rf $PWD/travis_phantomjs;
mkdir -p $PWD/travis_phantomjs;
wget $PHANTOM_URL -O $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2;
tar -xvf $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs;
if [ "${GROWSTUFF_ELASTICSEARCH}" = "true" ]; then
sudo dpkg -r elasticsearch;
curl -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.4.0/elasticsearch-2.4.0.deb;
sudo dpkg -i --force-confnew elasticsearch-2.4.0.deb;
sudo service elasticsearch start;
sleep 10;
curl localhost:9200;
fi
- phantomjs --version
before_script:
- bundle exec rake db:create db:migrate db:test:prepare
- bundle exec rake assets:precompile
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/install_linters;
else
RAILS_ENV=test bundle exec rake db:create db:migrate;
bundle exec rake assets:precompile;
fi
- set +e
script:
- bundle exec rubocop --display-cop-names --rails
- bundle exec haml-lint app/views/account_types app/views/admin app/views/alternate_names app/views/account_types app/views/comments app/views/crops app/views/forums app/views/gardens app/views/harvests app/views/notifier app/views/orders app/views/photos
- script/gemfile_check
- bundle exec script/check_contributors_md
- bundle exec rake db:migrate --trace
- bundle exec rspec spec/
services:
- elasticsearch
- set -e
- >
if [ "${STATIC_CHECKS}" = "true" ]; then
./script/check_static.rb
else
bundle exec rake db:migrate --trace;
bundle exec rspec --tag $RSPEC_TAG spec/;
bundle exec rake jasmine:ci;
fi;
- set +e
before_deploy:
- bundle exec script/heroku_maintenance.rb on
deploy:
provider: heroku
api_key:
secure: WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg=
secure: "WrQxf0fEKkCdXrjcejurobOnNNz3he4dDwjBbToXbQTQNDObPp7NetJrLsfM8FiUFEeOuvhIHHiDQtMvY720zGGAGxDptvgFS+0QHCUqoTRZA/yFfUmHlG2jROXTzk5uVK0AE4k6Ion5kX8+mM0EnMT/7u+MTFiukrJctSiEXfg="
on:
repo: Growstuff/growstuff
app:
+29 -4
View File
@@ -7,7 +7,32 @@ When you create a pull request, please include the following:
* Make sure you have automated tests for your work, where possible.
* Add your name (and that of your pair partner, if any) to [CONTRIBUTORS.md](CONTRIBUTORS.md).
If you would like to discuss your work before submitting a pull request,
please join any of our [Discussion
forums](http://wiki.growstuff.org/index.php/Discussion_forums), where
our dev team will be happy to help you.
All pull requests should pass our automatic continuous integration and style
checks before being merged. You can run tests locally as follows:
- `rake spec` to run all Ruby tests
- `rake spec:models` to run Ruby model tests (or `rake spec:views` for view tests, etc)
- `rake static` to run all static checks (code style, unfixed Git conflicts, etc)
- `rake jasmine:ci` to run JavaScript unit tests in headless mode
- `rake jasmine` to start a server for running JavaScript unit tests in a
browser (eg for debugging). Point your browser at http://localhost:8888 to
run the tests.
- `rspec ./spec/path/to/my_spec.rb` to run all Ruby tests in the file `my_spec.rb`
- `rspec ./spec/path/to/my_spec.rb:45` to run the Ruby test starting on line 45 of
`my_spec.rb`. RSpec will output a list of command-lines in this form for all
failing tests so you can easily re-run particular ones.
- `rspec --only-failures` to re-run all Ruby tests that failed last time.
Growstuff runs several linters and checkers before a change is merged. These
run from overcommit. To automatically run the same linters yourself you can
install overcommit too.
- `./script/install_linters`
You can run `rake -T` to see a list of available Rake tasks. If you can't get
some tests to pass, please submit a pull request anyway - we'll be happy to
help you debug the failures.
If you would like to discuss an idea before submitting a pull request,
please open a [GitHub Issue](https://github.com/growstuff/growstuff/issues),
where our dev team will be happy to help you.
+10
View File
@@ -76,3 +76,13 @@ submit the change with your pull request.
- Brenda Wallace / [br3nda](https://github.com/br3nda)
- Jim Stallings / [jestallin](https://github.com/jestallin)
- Alyssa Ransbury / [alran](https://github.com/alran)
- Thomas Countz / [thomascountz](https://github.com/thomascountz)
- Megan Talbot / [meganft](https://github.com/meganft)
- Arun Kumar / [arun1595](https://github.com/arun1595)
- Harry Brodsky / [hbrodsk1](https://github.com/hbrodsk1)
- Jeff Kingswood / [ancyentmariner](https://github.com/ancyentmariner)
- Logan Gingerich / [logangingerich](https://github.com/logangingerich)
## Bots
- Security and Dependency Updates / [deppbot](https://github.com/deppbot)
+41 -27
View File
@@ -1,57 +1,63 @@
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '2.3.3'
ruby '2.4.1'
gem 'rails', '~> 4.2.7'
gem 'rails', '~> 4.2.8'
gem 'bundler', '>=1.1.5'
gem 'coffee-rails', '~> 4.1.0'
gem 'coffee-rails'
gem 'haml'
gem 'sass-rails', '~> 5.0.4'
gem 'sass-rails'
# API data
gem 'jsonapi-resources'
# CSS framework
gem 'bootstrap-sass', '~> 3.3.6'
gem 'bootstrap-sass'
gem 'font-awesome-sass'
gem 'uglifier', '~> 2.7.2' # JavaScript compressor
gem 'uglifier' # JavaScript compressor
# planting and harvest predictions
gem 'active_median'
gem 'flickraw'
gem 'jquery-rails'
gem 'jquery-ui-rails', '~> 5.0.2'
gem 'jquery-ui-rails', '~> 5.0.2' # needs careful upgrade with change of location
gem 'js-routes' # provides access to Rails routes in Javascript
gem 'cancancan', '~> 1.9' # for checking member privileges
gem 'cancancan' # for checking member privileges
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
gem 'comfortable_mexican_sofa', '~> 1.12.0' # content management system
gem 'comfortable_mexican_sofa' # content management system
gem 'bootstrap-kaminari-views' # bootstrap views for kaminari
gem 'kaminari' # pagination
gem 'active_utils'
gem 'activemerchant'
gem 'active_utils'
gem 'sidekiq'
# Markdown formatting for updates etc
gem 'bluecloth'
# Pagination
gem 'will_paginate', '~> 3.0'
gem 'will_paginate'
# user signup/login/etc
gem 'devise', '>= 4.0.0'
gem 'devise'
# nicely formatted URLs
gem 'friendly_id', '~> 5.0.4'
gem 'friendly_id'
# gravatars
gem 'gravatar-ultimate'
@@ -63,13 +69,13 @@ gem 'geocoder'
gem 'bootstrap-datepicker-rails'
# For connecting to other services (eg Twitter)
gem 'omniauth'
gem 'omniauth', '~> 1.3'
gem 'omniauth-facebook'
gem 'omniauth-flickr', '>= 0.0.15'
gem 'omniauth-twitter'
# For charting data
gem 'd3-rails'
gem 'd3-rails', '~> 3.5' # 4.* produces Error: <spyOn> : could not find an object to spy upon for linear() - see https://travis-ci.org/Growstuff/growstuff/jobs/204461482
# client for Elasticsearch. Elasticsearch is a flexible
# and powerful, distributed, real-time search and analytics engine.
@@ -81,11 +87,17 @@ gem 'd3-rails'
gem "elasticsearch-api", "~> 2.0.0"
gem "elasticsearch-model"
gem "elasticsearch-rails"
gem "hashie", ">= 3.5.3"
gem 'rake', '>= 10.0.0'
# # CMS
# gem 'comfortable_mexican_sofa', '~> 1.12.0'
# locale based flash notices for controllers
gem "responders"
# allows soft delete. Used for members.
gem 'acts_as_paranoid', '~> 0.5.0'
gem 'xmlrpc' # fixes rake error - can be removed if not needed later
group :production, :staging do
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
@@ -100,7 +112,7 @@ group :development do
# A debugger and irb alternative. Pry doesn't play nice
# with unicorn, so start a Webrick server when debugging
# with Pry
gem 'better_errors'
gem 'better_errors', '~> 2.2.0'
gem 'binding_of_caller'
gem 'guard'
gem 'guard-rspec'
@@ -111,31 +123,33 @@ end
group :development, :test do
gem "active_merchant-paypal-bogus-gateway"
gem 'bullet' # performance tuning by finding unnecesary queries
gem 'byebug' # debugging
gem 'capybara' # integration tests
gem 'capybara-email' # integration tests for email
gem 'capybara-screenshot' # for test debugging
gem 'coveralls', require: false # coverage analysis
gem 'database_cleaner', '~> 1.5.0'
gem 'factory_girl_rails' # for creating test data
gem 'database_cleaner'
gem 'factory_bot_rails' # for creating test data
gem 'haml-i18n-extractor'
gem 'haml_lint' # Checks haml files for goodness
gem 'haml-rails' # HTML templating language
gem 'haml_lint' # Checks haml files for goodness
gem 'i18n-tasks' # adds tests for finding missing and unused translations
gem 'jasmine' # javascript unit testing
gem 'poltergeist' # for headless JS testing
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework
gem 'rubocop', require: false
gem 'rainbow', '< 2.2.0' # See https://github.com/sickill/rainbow/issues/44
gem 'rspec-activemodel-mocks'
gem 'rspec-rails' # unit testing framework
gem 'rubocop', '<= 0.47.1', require: false # Pin to rubocop (0.47.1) as 0.48.0 is buggy
gem 'selenium-webdriver'
gem 'webrat' # provides HTML matchers for view tests
gem 'webrat' # provides HTML matchers for view tests
end
group :test do
gem 'codeclimate-test-reporter', require: false
gem 'timecop'
end
group :travis do
gem 'heroku-api'
gem 'platform-api'
end
+258 -215
View File
@@ -1,69 +1,76 @@
GEM
remote: https://rubygems.org/
specs:
actionmailer (4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
actionmailer (4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.7.1)
actionview (= 4.2.7.1)
activesupport (= 4.2.7.1)
actionpack (4.2.10)
actionview (= 4.2.10)
activesupport (= 4.2.10)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.7.1)
activesupport (= 4.2.7.1)
actionview (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
active_link_to (1.0.3)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_link_to (1.0.5)
actionpack
addressable
active_median (0.1.4)
activerecord
active_merchant-paypal-bogus-gateway (0.1.0)
activemerchant
active_utils (3.2.3)
activesupport (>= 3.2, < 5.1.0)
active_utils (3.3.9)
activesupport (>= 3.2, < 5.2.0)
i18n
activejob (4.2.7.1)
activesupport (= 4.2.7.1)
activejob (4.2.10)
activesupport (= 4.2.10)
globalid (>= 0.3.0)
activemerchant (1.61.0)
activesupport (>= 3.2.14, < 5.1)
activemerchant (1.75.0)
activesupport (>= 3.2.14, < 6.x)
builder (>= 2.1.2, < 4.0.0)
i18n (>= 0.6.9)
nokogiri (~> 1.4)
activemodel (4.2.7.1)
activesupport (= 4.2.7.1)
activemodel (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
activerecord (4.2.7.1)
activemodel (= 4.2.7.1)
activesupport (= 4.2.7.1)
activerecord (4.2.10)
activemodel (= 4.2.10)
activesupport (= 4.2.10)
arel (~> 6.0)
activesupport (4.2.7.1)
activesupport (4.2.10)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.5.0)
public_suffix (~> 2.0, >= 2.0.2)
acts_as_paranoid (0.5.0)
activerecord (>= 4.0, < 5.1)
activesupport (>= 4.0, < 5.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
arel (6.0.4)
ast (2.3.0)
autoprefixer-rails (6.6.1)
autoprefixer-rails (7.1.6)
execjs
bcrypt (3.1.11)
better_errors (2.1.1)
better_errors (2.2.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
binding_of_caller (0.7.3)
debug_inspector (>= 0.0.1)
bluecloth (2.2.0)
bonsai-elasticsearch-rails (0.0.4)
bootstrap-datepicker-rails (1.6.4.1)
bonsai-elasticsearch-rails (0.2.0)
elasticsearch-model (~> 0)
elasticsearch-rails (~> 0)
bootstrap-datepicker-rails (1.7.1.1)
railties (>= 3.0)
bootstrap-kaminari-views (0.0.5)
kaminari (>= 0.13)
@@ -71,13 +78,16 @@ GEM
bootstrap-sass (3.3.7)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.5.3)
bootstrap_form (2.7.0)
builder (3.2.3)
byebug (9.0.6)
cancancan (1.15.0)
capybara (2.10.1)
bullet (5.6.1)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.10.0)
byebug (9.1.0)
cancancan (2.1.1)
capybara (2.16.0)
addressable
mime-types (>= 1.16)
mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
@@ -85,23 +95,23 @@ GEM
capybara-email (2.5.0)
capybara (~> 2.4)
mail
capybara-screenshot (1.0.14)
capybara-screenshot (1.0.18)
capybara (>= 1.0, < 3)
launchy
childprocess (0.5.9)
childprocess (0.8.0)
ffi (~> 1.0, >= 1.0.11)
climate_control (0.1.0)
climate_control (0.2.0)
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
codeclimate-test-reporter (1.0.3)
simplecov
codeclimate-test-reporter (1.0.8)
simplecov (<= 0.13)
codemirror-rails (5.16.0)
railties (>= 3.0, < 6.0)
coderay (1.1.1)
coffee-rails (4.1.1)
coderay (1.1.2)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.1.x)
railties (>= 4.0.0)
coffee-script (2.4.1)
coffee-script-source
execjs
@@ -121,7 +131,7 @@ GEM
rails (>= 4.0.0, < 5.1)
rails-i18n (>= 4.0.0)
sass-rails (>= 4.0.3)
concurrent-ruby (1.0.4)
concurrent-ruby (1.0.5)
connection_pool (2.2.1)
coveralls (0.8.19)
json (>= 1.8, < 3)
@@ -129,17 +139,18 @@ GEM
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
tins (~> 1.6)
crass (1.0.3)
csv_shaper (1.3.0)
activesupport (>= 3.0.0)
d3-rails (3.4.13)
d3-rails (3.5.17)
railties (>= 3.1)
dalli (2.7.6)
database_cleaner (1.5.3)
debug_inspector (0.0.2)
devise (4.2.0)
database_cleaner (1.6.2)
debug_inspector (0.0.3)
devise (4.3.0)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.1)
railties (>= 4.1.0, < 5.2)
responders
warden (~> 1.2.3)
diff-lcs (1.3)
@@ -148,48 +159,48 @@ GEM
json
thread
thread_safe
elasticsearch (2.0.0)
elasticsearch-api (= 2.0.0)
elasticsearch-transport (= 2.0.0)
elasticsearch-api (2.0.0)
elasticsearch (2.0.2)
elasticsearch-api (= 2.0.2)
elasticsearch-transport (= 2.0.2)
elasticsearch-api (2.0.2)
multi_json
elasticsearch-model (0.1.9)
activesupport (> 3)
elasticsearch (> 0.4)
hashie
elasticsearch-rails (0.1.9)
elasticsearch-transport (2.0.0)
elasticsearch-transport (2.0.2)
faraday
multi_json
erubis (2.7.0)
excon (0.54.0)
excon (0.59.0)
execjs (2.7.0)
factory_girl (4.8.0)
factory_bot (4.8.2)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
factory_bot_rails (4.8.2)
factory_bot (~> 4.8.2)
railties (>= 3.0.0)
faraday (0.9.2)
faraday (0.12.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.17)
ffi (1.9.18)
figaro (1.1.1)
thor (~> 0.14)
flickraw (0.9.9)
font-awesome-sass (4.6.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
formatador (0.2.5)
friendly_id (5.0.5)
friendly_id (5.2.3)
activerecord (>= 4.0.0)
geocoder (1.4.1)
geocoder (1.4.4)
gibbon (1.2.1)
httparty
multi_json (>= 1.9.0)
globalid (0.3.7)
activesupport (>= 4.1.0)
globalid (0.4.1)
activesupport (>= 4.2.0)
gravatar-ultimate (2.0.0)
activesupport (>= 2.3.14)
rack
guard (2.14.0)
guard (2.14.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
lumberjack (~> 1.0)
@@ -203,7 +214,8 @@ GEM
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
haml (4.0.7)
haml (5.0.4)
temple (>= 0.8.0)
tilt
haml-i18n-extractor (0.5.9)
activesupport
@@ -211,31 +223,35 @@ GEM
highline
tilt
trollop (= 1.16.2)
haml-rails (0.9.0)
haml-rails (1.0.0)
actionpack (>= 4.0.1)
activesupport (>= 4.0.1)
haml (>= 4.0.6, < 5.0)
haml (>= 4.0.6, < 6.0)
html2haml (>= 1.0.1)
railties (>= 4.0.1)
haml_lint (0.20.0)
haml (~> 4.0)
haml_lint (0.25.1)
haml (>= 4.0, < 5.1)
rainbow
rake (>= 10, < 13)
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashie (3.4.6)
heroku-api (0.4.2)
excon (~> 0.45)
multi_json (~> 1.8)
hashie (3.5.6)
heroics (0.0.24)
erubis (~> 2.0)
excon
moneta
multi_json (>= 1.9.2)
highline (1.7.8)
html2haml (2.0.0)
html2haml (2.2.0)
erubis (~> 2.7.0)
haml (~> 4.0.0)
nokogiri (~> 1.6.0)
haml (>= 4.0, < 6)
nokogiri (>= 1.6.0)
ruby_parser (~> 3.5)
httparty (0.14.0)
httparty (0.15.6)
multi_xml (>= 0.5.2)
i18n (0.7.0)
i18n-tasks (0.9.9)
i18n (0.9.1)
concurrent-ruby (~> 1.0)
i18n-tasks (0.9.12)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -245,28 +261,41 @@ GEM
parser (>= 2.2.3.0)
term-ansicolor (>= 1.3.2)
terminal-table (>= 1.5.1)
jasmine (2.5.1)
jasmine-core (>= 2.5.1, < 3.0.0)
jasmine (2.8.0)
jasmine-core (>= 2.8.0, < 3.0.0)
phantomjs
rack (>= 1.2.1)
rake
jasmine-core (2.5.2)
jquery-rails (4.2.2)
jasmine-core (2.8.0)
jquery-rails (4.3.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
js-routes (1.3.0)
js-routes (1.4.1)
railties (>= 3.2)
sprockets-rails
json (1.8.6)
json (2.1.0)
jsonapi-resources (0.9.0)
activerecord (>= 4.1)
concurrent-ruby
railties (>= 4.1)
jwt (1.5.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.10.0)
kramdown (1.13.2)
kaminari (1.1.1)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.1.1)
kaminari-activerecord (= 1.1.1)
kaminari-core (= 1.1.1)
kaminari-actionview (1.1.1)
actionview
kaminari-core (= 1.1.1)
kaminari-activerecord (1.1.1)
activerecord
kaminari-core (= 1.1.1)
kaminari-core (1.1.1)
kgio (2.11.0)
kramdown (1.15.0)
launchy (2.4.3)
addressable (~> 2.3)
leaflet-markercluster-rails (0.7.0)
@@ -278,39 +307,42 @@ GEM
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
loofah (2.0.3)
loofah (2.1.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lumberjack (1.0.11)
mail (2.6.4)
mime-types (>= 1.16, < 4)
lumberjack (1.0.12)
mail (2.7.0)
mini_mime (>= 0.1.1)
memcachier (0.0.2)
method_source (0.8.2)
method_source (0.9.0)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.10.1)
mini_mime (1.0.0)
mini_portile2 (2.3.0)
minitest (5.10.3)
moneta (0.8.1)
multi_json (1.11.3)
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
newrelic_rpm (3.17.1.326)
nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
newrelic_rpm (4.6.0.338)
nokogiri (1.8.1)
mini_portile2 (~> 2.3.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth (0.5.1)
oauth2 (1.2.0)
faraday (>= 0.8, < 0.10)
oauth (0.5.3)
oauth2 (1.4.0)
faraday (>= 0.8, < 0.13)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.3.2)
hashie (>= 1.2, < 4)
rack (>= 1.0, < 3)
omniauth (1.7.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
omniauth-oauth2 (~> 1.2)
omniauth-flickr (0.0.19)
@@ -322,9 +354,9 @@ GEM
omniauth-oauth2 (1.4.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-twitter (1.4.0)
omniauth-oauth (~> 1.1)
rack
orm_adapter (0.5.0)
paperclip (5.1.0)
activemodel (>= 4.2.0)
@@ -332,39 +364,41 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
parser (2.3.3.1)
ast (~> 2.2)
pg (0.19.0)
parser (2.4.0.2)
ast (~> 2.3)
pg (0.21.0)
phantomjs (2.1.1.0)
platform-api (2.1.0)
heroics (~> 0.0.23)
moneta (~> 0.8.1)
plupload-rails (1.2.1)
rails (>= 3.1)
poltergeist (1.11.0)
poltergeist (1.16.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
powerpack (0.1.1)
pry (0.10.4)
pry (0.11.3)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
public_suffix (2.0.5)
method_source (~> 0.9.0)
public_suffix (3.0.1)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.5)
rack-protection (1.5.3)
rack (1.6.8)
rack-protection (2.0.0)
rack
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.7.1)
actionmailer (= 4.2.7.1)
actionpack (= 4.2.7.1)
actionview (= 4.2.7.1)
activejob (= 4.2.7.1)
activemodel (= 4.2.7.1)
activerecord (= 4.2.7.1)
activesupport (= 4.2.7.1)
rails (4.2.10)
actionmailer (= 4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
activemodel (= 4.2.10)
activerecord (= 4.2.10)
activesupport (= 4.2.10)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.7.1)
railties (= 4.2.10)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
@@ -382,165 +416,169 @@ GEM
rails_stdout_logging
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
railties (4.2.7.1)
actionpack (= 4.2.7.1)
activesupport (= 4.2.7.1)
railties (4.2.10)
actionpack (= 4.2.10)
activesupport (= 4.2.10)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.1.0)
raindrops (0.17.0)
rake (12.0.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
redis (3.3.2)
responders (2.3.0)
railties (>= 4.2.0, < 5.1)
rspec (3.5.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
raindrops (0.19.0)
rake (12.2.1)
rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
redis (4.0.1)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
rspec (3.7.0)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-activemodel-mocks (1.0.3)
activemodel (>= 3.0)
activesupport (>= 3.0)
rspec-mocks (>= 2.99, < 4.0)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
rspec-core (3.7.0)
rspec-support (~> 3.7.0)
rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-mocks (3.5.0)
rspec-support (~> 3.7.0)
rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-rails (3.5.2)
rspec-support (~> 3.7.0)
rspec-rails (3.7.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-support (~> 3.7.0)
rspec-support (3.7.0)
rubocop (0.47.1)
parser (>= 2.3.3.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
ruby-units (2.0.1)
ruby-progressbar (1.9.0)
ruby-units (2.2.0)
ruby_dep (1.5.0)
ruby_parser (3.8.4)
sexp_processor (~> 4.1)
rubyzip (1.2.0)
sass (3.4.23)
sass-rails (5.0.6)
ruby_parser (3.10.1)
sexp_processor (~> 4.9)
rubyzip (1.2.1)
sass (3.5.3)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
selenium-webdriver (3.0.5)
selenium-webdriver (3.7.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
sexp_processor (4.7.0)
sexp_processor (4.10.0)
shellany (0.0.1)
sidekiq (4.1.4)
sidekiq (5.0.5)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
redis (~> 3.2, >= 3.2.1)
sinatra (>= 1.4.7)
rack-protection (>= 1.5.0)
redis (>= 3.3.4, < 5)
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)
simplecov-html (0.10.2)
sparkpost_rails (1.4.0)
rails (>= 4.0, < 5.1)
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.0)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sysexits (1.2.0)
term-ansicolor (1.4.0)
temple (0.8.0)
term-ansicolor (1.6.0)
tins (~> 1.0)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.5)
tilt (2.0.5)
tins (1.13.0)
thread_safe (0.3.6)
tilt (2.0.8)
timecop (0.9.1)
tins (1.15.1)
trollop (1.16.2)
tzinfo (1.2.2)
tzinfo (1.2.4)
thread_safe (~> 0.1)
uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode-display_width (1.1.3)
unicorn (5.1.0)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
unicode-display_width (1.3.0)
unicorn (5.3.1)
kgio (~> 2.6)
raindrops (~> 0.7)
warden (1.2.6)
uniform_notifier (1.10.0)
warden (1.2.7)
rack (>= 1.0)
webrat (0.7.3)
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
websocket (1.2.3)
websocket-driver (0.6.4)
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
will_paginate (3.1.5)
xpath (2.0.0)
websocket-extensions (0.1.3)
will_paginate (3.1.6)
xmlrpc (0.3.0)
xpath (2.1.0)
nokogiri (~> 1.3)
PLATFORMS
ruby
DEPENDENCIES
active_median
active_merchant-paypal-bogus-gateway
active_utils
activemerchant
better_errors
acts_as_paranoid (~> 0.5.0)
better_errors (~> 2.2.0)
binding_of_caller
bluecloth
bonsai-elasticsearch-rails
bootstrap-datepicker-rails
bootstrap-kaminari-views
bootstrap-sass (~> 3.3.6)
bootstrap-sass
bullet
bundler (>= 1.1.5)
byebug
cancancan (~> 1.9)
cancancan
capybara
capybara-email
capybara-screenshot
codeclimate-test-reporter
coffee-rails (~> 4.1.0)
comfortable_mexican_sofa (~> 1.12.0)
coffee-rails
comfortable_mexican_sofa
coveralls
csv_shaper
d3-rails
d3-rails (~> 3.5)
dalli
database_cleaner (~> 1.5.0)
devise (>= 4.0.0)
database_cleaner
devise
elasticsearch-api (~> 2.0.0)
elasticsearch-model
elasticsearch-rails
factory_girl_rails
factory_bot_rails
figaro
flickraw
font-awesome-sass
friendly_id (~> 5.0.4)
friendly_id
geocoder
gibbon (~> 1.2.0)
gravatar-ultimate
@@ -550,45 +588,50 @@ DEPENDENCIES
haml-i18n-extractor
haml-rails
haml_lint
heroku-api
hashie (>= 3.5.3)
i18n-tasks
jasmine
jquery-rails
jquery-ui-rails (~> 5.0.2)
js-routes
jsonapi-resources
kaminari
leaflet-markercluster-rails
leaflet-rails
leaflet-rails (~> 0.7.7)
letter_opener
memcachier
newrelic_rpm
omniauth
omniauth (~> 1.3)
omniauth-facebook
omniauth-flickr (>= 0.0.15)
omniauth-twitter
pg
platform-api
poltergeist
pry
quiet_assets
rails (~> 4.2.7)
rails (~> 4.2.8)
rails_12factor
rainbow (< 2.2.0)
rake (>= 10.0.0)
responders
rspec-activemodel-mocks
rspec-rails
rubocop
rubocop (<= 0.47.1)
ruby-units
sass-rails (~> 5.0.4)
sass-rails
selenium-webdriver
sidekiq
sparkpost_rails
uglifier (~> 2.7.2)
timecop
uglifier
unicorn
webrat
will_paginate (~> 3.0)
will_paginate
xmlrpc
RUBY VERSION
ruby 2.3.3p222
ruby 2.4.1p111
BUNDLED WITH
1.13.7
1.15.4
+8 -8
View File
@@ -1,6 +1,6 @@
# Growstuff
[![Build Status](https://travis-ci.org/Growstuff/growstuff.png)](https://travis-ci.org/Growstuff/growstuff)
[![Build Status](https://travis-ci.org/Growstuff/growstuff.svg?branch=dev)](https://travis-ci.org/Growstuff/growstuff)
[![Coverage Status](https://coveralls.io/repos/Growstuff/growstuff/badge.png)](https://coveralls.io/r/Growstuff/growstuff)
[![Code Climate](https://codeclimate.com/github/Growstuff/growstuff/badges/gpa.svg)](https://codeclimate.com/github/Growstuff/growstuff)
@@ -19,7 +19,6 @@ encourage participation from people of all backgrounds and skill levels.
* [Issues](http://github.com/Growstuff/growstuff/issues) (features we're
working on, known bugs, etc)
* [Discussion forums](http://talk.growstuff.org/) (design ideas, planning releases)
* [IRC](https://webchat.freenode.net/) growstuff channel (general chat, brainstorming and troubleshooting) or [Gitter](https://gitter.im/Growstuff/growstuff)
* [Wiki](https://github.com/Growstuff/growstuff/wiki) (general documentation, etc. Help by migrating from the [old wiki](https://web.archive.org/web/*/wiki.growstuff.org))
@@ -30,8 +29,7 @@ frontend features. We welcome contributions -- see
[CONTRIBUTING](CONTRIBUTING.md) for details.
* To set up your development environment, see [Getting started](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide).
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers. [Find a pair programming partner.](http://talk.growstuff.org/t/find-a-pair-programming-partner/13)
* Drop in to our [discussion forums](http://talk.growstuff.org/), IRC or Gitter to chat to other developers, get help, etc.
* We encourage [pair programming](http://wiki.growstuff.org/index.php/Pairing), especially for newer developers.
* You may also be interested in our [API](https://github.com/Growstuff/growstuff/wiki/API).
## For designers, writers, researchers, data wranglers, and other contributors
@@ -41,23 +39,25 @@ your skills and interests.
You might like to check out:
* The [Get Involved](http://wiki.growstuff.org/index.php/Get_involved)
* The [New Contributor Guide](https://github.com/Growstuff/growstuff/wiki/New-contributor-guide)
page on our wiki, which has lots of detail for different areas
* [Growstuff Talk](http://talk.growstuff.org/) especially the [Idea category](http://talk.growstuff.org/c/idea)
Here on Github, you might find these useful:
* [Waffle](http://waffle.io/Growstuff/growstuff) has stories in "ready" that can be worked on.
* [needs: design](https://github.com/Growstuff/growstuff/labels/needs:%20design) - tasks requiring high-level design
* [needs: visual design](https://github.com/Growstuff/growstuff/labels/needs:%20visual design) - tasks requiring visual/graphical design
* [needs: documentation](https://github.com/Growstuff/growstuff/labels/needs:%20documentation)
* [needs: data](https://github.com/Growstuff/growstuff/labels/needs:%20data) - tasks requiring data entry, data design, data import, or similar
* [curated:beginner](https://github.com/Growstuff/growstuff/labels/curated:%20beginner) - tasks that are ideal for beginner programmers or people new to the project
Feel free to comment on any of the issues you find there, or open up a broader conversation on [Growstuff Talk](http://talk.growstuff.org).
Feel free to comment on any of the issues on [Github](https://github.com/Growstuff/growstuff/issues).
## Contact
For more information about this project, contact [info@growstuff.org](mailto:info@growstuff.org).
Security Issues: If you find an authorization bypass or data breach, please contact our maintainers directly at [maintainers@growstuff.org](mailto:maintainers@growstuff.org).
You can also contact us on [Twitter](http://twitter.com/growstufforg/) or
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494).
[Facebook](https://www.facebook.com/pages/Growstuff/1531133417099494) or [Github](https://github.com/Growstuff/growstuff/issues)..
@@ -31,10 +31,10 @@ This file draws the labels to the left of each bar.
var barLabelTopEdge = 17;
return i * barHeight * (barLabelSpread) + barLabelTopEdge;
})
.text(function(d){return d});
.text(function(d){return d;});
};
growstuff.BarLabelGroup = BarLabelGroup;
}())
}());
+1 -1
View File
@@ -26,7 +26,7 @@ to the display size of the svg
WidthScale.prototype.getMaxValue = function(){
return d3.max(this._data.bars.map(function(bar) { return bar.value; }));
}
};
growstuff.WidthScale = WidthScale;
+1 -1
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");
}
});
+4 -4
View File
@@ -21,10 +21,10 @@ $ ->
$('#remove-sci_name-row').click ->
if (sci_index > 2)
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
sci_index = sci_index - 1
tmp = 'sci_template[' + sci_index + ']'
element = document.getElementById(tmp)
element.remove()
alt_template = "<div id='alt_template[INDEX]' class='template col-md-12'><div class='col-md-2'><label>Alternate name INDEX:</label></div><div class='col-md-8'><input name='alt_name[INDEX]' class='form-control', id='alt_name[INDEX]')'></input><span class='help-block'>Alternate name of crop.</span></div><div class='col-md-2'></div></div>"
+17 -5
View File
@@ -108,8 +108,6 @@ p.stats
.planting
dl.planting-attributes
font-size: 85%
dt
text-align: left
dd
@@ -118,14 +116,13 @@ p.stats
@media (min-width: $screen-md-min)
.planting-thumbnail
dl.planting-attributes
font-size: 85%
width: 100%
dt
text-align: left
width: 80px
width: 120px
dd
padding-left: 80px
padding-left: 120px
margin-left: auto
.navbar .navbar-form
@@ -333,3 +330,18 @@ $state-success-bg: lighten($green, 50%)
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
ul.plantings
list-style-type: none
ul.thumbnail-buttons
list-style-type: none
text-align: right
.hover-wrapper .text
position: absolute
visibility: hidden
.hover-wrapper:hover .text
visibility: visible
+11 -30
View File
@@ -1,67 +1,48 @@
class AccountTypesController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /account_types
def index
@account_types = AccountType.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@account_types)
end
# GET /account_types/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account_types)
end
# GET /account_types/new
def new
@account_type = AccountType.new
respond_to do |format|
format.html # new.html.erb
end
respond_with(@account_type)
end
# GET /account_types/1/edit
def edit
respond_with(@account_type)
end
# POST /account_types
def create
@account_type = AccountType.new(account_type_params)
respond_to do |format|
if @account_type.save
format.html { redirect_to @account_type, notice: I18n.t('account_types.created') }
else
format.html { render action: "new" }
end
end
flash[:notice] = I18n.t('account_types.created') if @account_type.save
respond_with(@account_type)
end
# PUT /account_types/1
def update
respond_to do |format|
if @account_type.update(account_type_params)
format.html { redirect_to @account_type, notice: I18n.t('account_types.updated') }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account_types.updated') if @account_type.update(account_type_params)
respond_with(@account_type)
end
# DELETE /account_types/1
def destroy
@account_type.destroy
respond_to do |format|
format.html { redirect_to account_types_url, notice: I18n.t('account_types.deleted') }
end
flash[:notice] = I18n.t('account_types.deleted')
respond_with(@account_type)
end
private
+6 -16
View File
@@ -1,36 +1,26 @@
class AccountsController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
# GET /accounts
def index
@accounts = Account.all
respond_to do |format|
format.html # index.html.erb
end
respond_with(@accounts)
end
# GET /accounts/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with(@account)
end
# GET /accounts/1/edit
def edit
end
def edit; end
# PUT /accounts/1
def update
respond_to do |format|
if @account.update(params[:account])
format.html { redirect_to @account, notice: I18n.t('account.update') }
else
format.html { render action: "edit" }
end
end
flash[:notice] = I18n.t('account.update') if @account.update(params[:account])
respond_with(@account)
end
private
+2 -6
View File
@@ -1,16 +1,12 @@
class AdminController < ApplicationController
respond_to :html
def index
authorize! :manage, :all
respond_to do |format|
format.html # index.html.haml
end
end
def newsletter
authorize! :manage, :all
@members = Member.confirmed.wants_newsletter.all
respond_to do |format|
format.html # index.html.haml
end
respond_with @members
end
end
+13 -35
View File
@@ -1,16 +1,14 @@
class AlternateNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# 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 +16,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 +27,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 +49,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
@@ -0,0 +1,7 @@
module Api
module V1
class BaseController < JSONAPI::ResourceController
abstract
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class CropsController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class GardensController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class HarvestsController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class MembersController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class PhotosController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class PlantingsController < BaseController
end
end
end
@@ -0,0 +1,6 @@
module Api
module V1
class SeedsController < BaseController
end
end
end
+12 -10
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
@@ -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|
+14 -54
View File
@@ -1,93 +1,53 @@
class CommentsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
respond_to :rss, only: :index
responders :flash
# GET /comments
# GET /comments.json
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
# GET /comments/new.json
def new
@comment = Comment.new
@post = Post.find_by(id: params[:post_id])
if @post
@comments = @post.comments
respond_to do |format|
format.html # new.html.erb
format.json { render json: @comment }
end
respond_with(@comments)
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
# GET /comments/1/edit
def edit
@comments = @comment.post.comments
end
# 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
@comment.save
respond_with @comment, location: @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
end
@comment.update(body: comment_params['body'])
respond_with @comment, location: @comment.post
end
# DELETE /comments/1
# DELETE /comments/1.json
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
+84 -124
View File
@@ -4,40 +4,22 @@ class CropsController < ApplicationController
before_action :authenticate_member!, except: [:index, :hierarchy, :search, :show]
load_and_authorize_resource
skip_authorize_resource only: [:hierarchy, :search]
respond_to :html, :json, :rss, :csv
responders :flash
# GET /crops
# GET /crops.json
def index
@sort = params[:sort]
@crops = if @sort == 'alpha'
Crop.includes(:scientific_names, plantings: :photos)
else
popular_crops
end
@paginated_crops = @crops.approved.paginate(page: params[:page])
@has_requested_pending = Crop.pending_approval.where(requester: current_member).count if current_member
respond_to do |format|
format.html
format.json { render json: @crops }
format.rss do
@crops = Crop.recent.includes(:scientific_names, :creator)
render rss: @crops
end
format.csv do
@filename = "Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv"
@crops = Crop.includes(:scientific_names, :plantings, :seeds, :creator)
render csv: @crops
end
end
@crops = crops
@num_requested_crops = requested_crops.size if current_member
@filename = filename
respond_with @crops
end
def requested
@requested = Crop.pending_approval.where(requester: current_member).paginate(page: params[:page])
@requested = requested_crops.paginate(page: params[:page])
respond_with @requested
end
# GET /crops/wrangle
def wrangle
@approval_status = params[:approval_status]
@crops = case @approval_status
@@ -47,176 +29,124 @@ class CropsController < ApplicationController
Crop.rejected
else
Crop.recent
end
@crops = @crops.paginate(page: params[:page])
end.paginate(page: params[:page])
@crop_wranglers = Role.crop_wranglers
respond_to do |format|
format.html
end
respond_with @crops
end
# GET /crops/hierarchy
def hierarchy
@crops = Crop.toplevel
respond_to do |format|
format.html
end
respond_with @crops
end
# GET /crops/search
def search
@term = params[:term]
@matches = Crop.search(@term)
@paginated_matches = @matches.paginate(page: params[:page])
respond_to do |format|
format.html
format.json { render json: @matches }
end
respond_with @matches
end
# GET /crops/1
# GET /crops/1.json
def show
@crop = Crop.includes(:scientific_names, plantings: :photos).find(params[:id])
@posts = @crop.posts.paginate(page: params[:page])
respond_to do |format|
format.html # show.html.haml
format.json do
# TODO RABL or similar one day to avoid presentation logic here
owner_structure = {
owner: {
only: [:id, :login_name, :location, :latitude, :longitude]
}
}
render json: @crop.to_json(include: {
plantings: {
include: owner_structure
}
})
end
format.json { render json: @crop.to_json(crop_json_fields) }
end
end
# GET /crops/new
# GET /crops/new.json
def new
@crop = Crop.new
@crop.alternate_names.build
@crop.scientific_names.build
respond_to do |format|
format.html # new.html.haml
format.json { render json: @crop }
end
respond_with @crop
end
# GET /crops/1/edit
def edit
@crop.alternate_names.build if @crop.alternate_names.blank?
@crop.scientific_names.build if @crop.scientific_names.blank?
end
# POST /crops
# POST /crops.json
def create
@crop = Crop.new(crop_params)
if current_member.role? :crop_wrangler
@crop.creator = current_member
success_msg = "Crop was successfully created."
else
@crop.requester = current_member
@crop.approval_status = "pending"
success_msg = "Crop was successfully requested."
end
respond_to do |format|
if @crop.save
params[:alt_name].each do |index, value|
create_name('alternate', value)
end
params[:sci_name].each do |index, value|
create_name('scientific', value)
end
unless current_member.role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver_now!
end
end
notify_wranglers if Crop.transaction { @crop.save && save_crop_names }
format.html { redirect_to @crop, notice: success_msg }
format.json { render json: @crop, status: :created, location: @crop }
else
format.html { render action: "new" }
format.json { render json: @crop.errors, status: :unprocessable_entity }
end
end
respond_with @crop
end
# PUT /crops/1
# PUT /crops/1.json
def update
previous_status = @crop.approval_status
@crop.creator = current_member if previous_status == "pending"
respond_to do |format|
if @crop.update(crop_params)
recreate_names('alt_name', 'alternate')
recreate_names('sci_name', 'scientific')
if @crop.update(crop_params)
recreate_names('alt_name', 'alternate')
recreate_names('sci_name', 'scientific')
if previous_status == "pending"
requester = @crop.requester
new_status = @crop.approval_status
Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved"
Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected"
end
format.html { redirect_to @crop, notice: 'Crop was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @crop.errors, status: :unprocessable_entity }
end
notifier.deliver_now! if previous_status == "pending"
end
respond_with @crop
end
# DELETE /crops/1
# DELETE /crops/1.json
def destroy
@crop.destroy
respond_to do |format|
format.html { redirect_to crops_url }
format.json { head :no_content }
end
respond_with @crop
end
private
def popular_crops
Crop.popular.includes(:scientific_names, plantings: :photos)
def notifier
case @crop.approval_status
when "approved"
Notifier.crop_request_approved(@crop.requester, @crop)
when "rejected"
Notifier.crop_request_rejected(@crop.requester, @crop)
end
end
def save_crop_names
params[:alt_name]&.values&.each do |value|
create_name!('alternate', value) unless value.empty?
end
params[:sci_name]&.values&.each do |value|
create_name!('scientific', value) unless value.empty?
end
end
def notify_wranglers
return if current_member.role? :crop_wrangler
Role.crop_wranglers.each do |w|
Notifier.new_crop_request(w, @crop).deliver_now!
end
end
def recreate_names(param_name, name_type)
return unless params[param_name].present?
destroy_names(name_type)
params[param_name].each do |index, value|
create_name(name_type, value)
params[param_name].each do |_i, value|
create_name!(name_type, value) unless value.empty?
end
end
def destroy_names(name_type)
@crop.send("#{name_type}_names").each do |alt_name|
alt_name.destroy
end
@crop.send("#{name_type}_names").each(&:destroy)
end
def create_name(name_type, value)
@crop.send("#{name_type}_names").create(name: value, creator_id: current_member.id)
def create_name!(name_type, value)
@crop.send("#{name_type}_names").create!(name: value, creator_id: current_member.id)
end
def crop_params
@@ -224,11 +154,41 @@ class CropsController < ApplicationController
:name,
:parent_id,
:creator_id,
:perennial,
:approval_status,
:request_notes,
:reason_for_rejection,
:rejection_notes, scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
:rejection_notes,
scientific_names_attributes: [:scientific_name,
:_destroy,
:id])
end
def filename
"Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv"
end
def crop_json_fields
{
include: {
plantings: {
include: {
owner: { only: [:id, :login_name, :location, :latitude, :longitude] }
}
},
scientific_names: { only: [:name] },
alternate_names: { only: [:name] }
}
}
end
def crops
q = Crop.approved.includes(:scientific_names, plantings: :photos)
q = q.popular unless @sort == 'alpha'
q.includes(:photos).paginate(page: params[:page])
end
def requested_crops
current_member.requested_crops.pending_approval
end
end
+11 -46
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
+20 -48
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
@@ -8,94 +10,64 @@ class GardensController < ApplicationController
@owner = Member.find_by(slug: params[:owner])
@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
@current_plantings = @garden.plantings.current
.includes(:crop, :owner)
.order(planted_at: :desc)
@finished_plantings = @garden.plantings.finished
.includes(:crop)
.order(finished_at: :desc)
respond_with(@garden)
end
# GET /gardens/new
# GET /gardens/new.json
def new
@garden = Garden.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @garden }
end
respond_with(@garden)
end
# GET /gardens/1/edit
def edit
end
def edit; end
# POST /gardens
# POST /gardens.json
def create
@garden.owner_id = current_member.id
respond_to do |format|
if @garden.save
format.html { redirect_to @garden, notice: I18n.t('gardens.created') }
format.json { render json: @garden, status: :created, location: @garden }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('gardens.created') if @garden.save
respond_with(@garden)
end
# PUT /gardens/1
# PUT /gardens/1.json
def update
respond_to do |format|
if @garden.update(garden_params)
format.html { redirect_to @garden, notice: I18n.t('gardens.updated') }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @garden.errors, status: :unprocessable_entity }
end
end
flash[:notice] = I18n.t('gardens.updated') if @garden.update(garden_params)
respond_with(@garden)
end
# DELETE /gardens/1
# DELETE /gardens/1.json
def destroy
@garden.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html do
redirect_to gardens_by_owner_path(owner: @garden.owner), notice: I18n.t('gardens.deleted')
end
format.json { head :no_content }
end
flash[:notice] = I18n.t('gardens.deleted')
redirect_to(gardens_by_owner_path(owner: @garden.owner))
end
private
def garden_params
params.require(:garden).permit(:name, :slug, :owner_id, :description, :active,
params.require(:garden).permit(:name, :slug, :description, :active,
:location, :latitude, :longitude, :area, :area_unit)
end
def gardens
g = @owner ? @owner.gardens : Garden.all
g = g.active unless @show_all
g = g.includes(:owner).order(:name)
g = g.paginate(page: params[:page])
g
g.joins(:owner).order(:updated_at).paginate(page: params[:page])
end
end
+58 -64
View File
@@ -1,94 +1,52 @@
class HarvestsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: %i(index show)
after_action :update_crop_medians, only: %i(create update destroy)
load_and_authorize_resource
respond_to :html, :json
respond_to :csv, only: :index
responders :flash
# 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
@owner = Member.find_by(slug: params[:owner]) if params[:owner]
@crop = Crop.find_by(slug: params[:crop]) if params[:crop]
@planting = Planting.find_by(slug: params[:planting_id]) if params[:planting_id]
respond_to do |format|
format.html { @harvests = @harvests.paginate(page: params[:page]) }
format.json { render json: @harvests }
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_s(:number)}.csv"
render csv: @harvests
end
end
@harvests = harvests
@filename = csv_filename
respond_with(@harvests)
end
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
def edit
@planting = @harvest.planting if @harvest.planting_id
end
# POST /harvests
# 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
@harvest.harvested_at = Time.zone.now if @harvest.harvested_at.blank?
@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
@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 +58,40 @@ class HarvestsController < ApplicationController
:plant_part_id, :slug, :si_weight)
.merge(owner_id: current_member.id)
end
def matching_plantings
Planting.where(crop: @harvest.crop, owner: @harvest.owner)
.where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
.where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
end
def harvests
if @owner
@owner.harvests
elsif @crop
@crop.harvests
elsif @planting
@planting.harvests
else
Harvest.all
end.order(harvested_at: :desc).joins(: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
def update_crop_medians
# We only update medians to predict plantings
# if this harvest is not linked to a planting, then do nothing
return if @harvest.planting.nil?
@harvest.planting.update_harvest_days
@harvest.crop.update_harvest_medians
end
end
+1 -4
View File
@@ -1,14 +1,11 @@
class HomeController < ApplicationController
skip_authorize_resource
respond_to :html
def index
# we were previously generating a lot of instance variables like
# @members_count and @interesting_crops in here, but now we call
# the relevant class methods directly in the view, so that fragment
# caching will be effective.
respond_to do |format|
format.html # index.html.haml
end
end
end
+39 -53
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
+27 -31
View File
@@ -1,26 +1,15 @@
class MembersController < ApplicationController
load_and_authorize_resource except: [:finish_signup, :unsubscribe, :view_follows, :view_followers, :show]
skip_authorize_resource only: [:nearby, :unsubscribe, :finish_signup]
after_action :expire_cache_fragments, only: :create
respond_to :html, :json, :rss
after_action :expire_homepage, only: :create
def index
@sort = params[:sort]
@members = if @sort == 'recently_joined'
Member.confirmed.recently_joined.paginate(page: params[:page])
else
Member.confirmed.paginate(page: params[:page])
end
@members = members
respond_to do |format|
format.html # index.html.haml
format.json {
render json: @members.to_json(only: [
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
])
}
format.json { render json: @members.to_json(only: member_json_fields) }
end
end
@@ -31,6 +20,7 @@ class MembersController < ApplicationController
@facebook_auth = @member.auth('facebook')
@posts = @member.posts
@gardens = @member.gardens.active.order(:name)
# The garden form partial is called from the "New Garden" tab;
# it requires a garden to be passed in @garden.
# The new garden is not persisted unless Garden#save is called.
@@ -38,17 +28,13 @@ class MembersController < ApplicationController
respond_to do |format|
format.html # show.html.haml
format.json {
render json: @member.to_json(only: [
:id, :login_name, :bio,
:created_at, :slug, :location,
:latitude, :longitude
])
}
format.rss { render(
layout: false,
locals: { member: @member }
)}
format.json { render json: @member.to_json(only: member_json_fields) }
format.rss do
render(
layout: false,
locals: { member: @member }
)
end
end
end
@@ -65,7 +51,7 @@ class MembersController < ApplicationController
EMAIL_TYPE_STRING = {
send_notification_email: "direct message notifications",
send_planting_reminder: "planting reminders"
}
}.freeze
def unsubscribe
verifier = ActiveSupport::MessageVerifier.new(ENV['RAILS_SECRET_TOKEN'])
@@ -97,11 +83,21 @@ class MembersController < ApplicationController
private
def expire_cache_fragments
expire_fragment("homepage_stats")
end
def member_params
params.require(:member).permit(:login_name, :tos_agreement, :email, :newsletter)
end
def member_json_fields
[
:id, :login_name,
:slug, :bio, :created_at,
:location, :latitude, :longitude
]
end
def members
q = Member.confirmed
q = q.recently_joined if @sort == 'recently_joined'
q.paginate(page: params[:page])
end
end
+12 -30
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,26 @@ 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
@subject = if @sender_notification.subject.start_with? 'Re: '
@sender_notification.subject
else
"Re: #{@sender_notification.subject}"
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 +50,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
@@ -29,15 +29,15 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
member = action.find_or_create_from_authorization(auth)
@authentication = action.establish_authentication(auth, member)
unless action.member_created?
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
else
if action.member_created?
raise "Invalid provider" unless ['facebook', 'twitter', 'flickr'].index(auth['provider'].to_s)
session["devise.#{auth['provider']}_data"] = request.env["omniauth.auth"]
sign_in member
redirect_to finish_signup_url(member)
else
sign_in_and_redirect member, event: :authentication # this will throw if @user is not activated
set_flash_message(:notice, :success, kind: auth['provider']) if is_navigational_format?
end
end
+1 -1
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,
@@ -0,0 +1,13 @@
class PhotoAssociationsController < ApplicationController
before_action :authenticate_member!
respond_to :json, :html
def destroy
@photo = Photo.find_by!(id: params[:photo_id], owner: current_member)
collection = Growstuff::Constants::PhotoModels.get_relation(@photo, params[:type])
item_class = Growstuff::Constants::PhotoModels.get_item(params[:type])
@item = item_class.find_by!(id: params[:id], owner_id: current_member.id)
collection.delete(@item)
respond_with(@photo)
end
end
+35 -60
View File
@@ -1,89 +1,49 @@
class PhotosController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
after_action :expire_homepage, only: [:create, :delete]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# GET /photos
# GET /photos.json
def index
@photos = Photo.paginate(page: params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @photos }
if params[:crop_id]
@crop = Crop.find params[:crop_id]
@photos = @crop.photos
else
@photos = Photo.all
end
@photos = @photos.includes(:owner).order(:created_at).paginate(page: params[:page])
respond_with(@photos)
end
# GET /photos/new
# GET /photos/new.json
def new
@photo = Photo.new
@type = params[:type]
@id = params[:id]
page = params[:page] || 1
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
if @flickr_auth
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
respond_to do |format|
format.html # new.html.erb
format.json { render json: @photo }
end
@photo = Photo.new
retrieve_from_flickr
respond_with @photo
end
# GET /photos/1/edit
def edit
respond_with @photo
end
# POST /photos
# POST /photos.json
def create
find_or_create_photo_from_flickr_photo
add_photo_to_collection
respond_to do |format|
if @photo.present? && @photo.save
format.html { redirect_to photo_path(@photo), notice: 'Photo was successfully added.' }
format.json { render json: @photo, status: :created, location: @photo }
else
format.html { render action: "new" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
@photo.save if @photo.present?
respond_with @photo
end
# PUT /photos/1
# PUT /photos/1.json
def update
respond_to do |format|
if @photo.update(photo_params)
format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @photo.errors, status: :unprocessable_entity }
end
end
@photo.update(photo_params)
respond_with @photo
end
# DELETE /photos/1
# DELETE /photos/1.json
def destroy
@photo.destroy
flash[:alert] = "Photo successfully deleted."
respond_to do |format|
format.html { redirect_to photos_url }
format.json { head :no_content }
end
respond_with @photo
end
private
@@ -97,7 +57,7 @@ class PhotosController < ApplicationController
end
def photo_params
params.require(:photo).permit(:flickr_photo_id, :owner_id, :title, :license_name,
params.require(:photo).permit(:flickr_photo_id, :title, :license_name,
:license_url, :thumbnail_url, :fullsize_url, :link_url)
end
@@ -122,4 +82,19 @@ class PhotosController < ApplicationController
rescue => e
flash[:alert] = e.message
end
def retrieve_from_flickr
@flickr_auth = current_member.auth('flickr')
@current_set = params[:set]
return unless @flickr_auth
page = params[:page] || 1
@sets = current_member.flickr_sets
photos, total = current_member.flickr_photos(page, @current_set)
@photos = WillPaginate::Collection.create(page, 30, total) do |pager|
pager.replace photos
end
end
end
+3 -10
View File
@@ -1,5 +1,6 @@
class PlacesController < ApplicationController
skip_authorize_resource
respond_to :html, :json
def index
respond_to do |format|
@@ -30,17 +31,9 @@ class PlacesController < ApplicationController
def search
if params[:new_place].empty?
respond_to do |format|
format.html do
redirect_to places_path, alert: 'Please enter a valid location'
end
end
redirect_to places_path, alert: 'Please enter a valid location'
else
respond_to do |format|
format.html do
redirect_to place_path(params[:new_place])
end
end
redirect_to place_path(params[:new_place])
end
end
end
+11 -54
View File
@@ -1,80 +1,37 @@
class PlantPartsController < ApplicationController
load_and_authorize_resource
respond_to :html, :json
responders :flash
# 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
def edit
end
def edit; end
# POST /plant_parts
# POST /plant_parts.json
def create
@plant_part = PlantPart.new(plant_part_params)
respond_to do |format|
if @plant_part.save
format.html { redirect_to @plant_part, notice: 'Plant part was successfully created.' }
format.json { render json: @plant_part, status: :created, location: @plant_part }
else
format.html { render action: "new" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
@plant_part = PlantPart.create(plant_part_params)
respond_with(@plant_part)
end
# PUT /plant_parts/1
# PUT /plant_parts/1.json
def update
respond_to do |format|
if @plant_part.update(plant_part_params)
format.html { redirect_to @plant_part, notice: 'Plant part was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @plant_part.errors, status: :unprocessable_entity }
end
end
@plant_part.update(plant_part_params)
respond_with(@plant_part)
end
# DELETE /plant_parts/1
# DELETE /plant_parts/1.json
def destroy
@plant_part.destroy
respond_to do |format|
format.html { redirect_to plant_parts_url }
format.json { head :no_content }
end
respond_with(@plant_part)
end
private
+48 -82
View File
@@ -1,126 +1,89 @@
class PlantingsController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
before_action :authenticate_member!, except: %i(index show)
after_action :expire_homepage, only: %i(create update destroy)
after_action :update_crop_medians, only: %i(create update destroy)
after_action :update_planting_medians, only: :update
load_and_authorize_resource
# GET /plantings
# GET /plantings.json
respond_to :html, :json
respond_to :csv, :rss, only: [:index]
responders :flash
def index
@owner = Member.find_by(slug: params[:owner]) if params[:owner]
@crop = Crop.find_by(slug: params[:crop]) if params[:crop]
@show_all = params[:all] == '1'
@plantings = plantings
respond_to do |format|
format.html { @plantings = @plantings.paginate(page: params[:page]) }
format.json { render json: @plantings }
format.rss { render layout: false } # index.rss.builder
format.csv do
specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil)
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
render csv: @plantings
end
end
specifics = if @owner
"#{@owner.login_name}-"
elsif @crop
"#{@crop.name}-"
end
@filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv"
respond_with(@plantings)
end
# GET /plantings/1
# GET /plantings/1.json
def show
@planting = Planting.includes(:owner, :crop, :garden, :photos).friendly.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @planting }
end
@planting = Planting.includes(:owner, :crop, :garden, :photos)
.friendly
.find(params[:id])
respond_with @planting
end
# GET /plantings/new
# GET /plantings/new.json
def new
@planting = Planting.new('planted_at' => Time.zone.today)
@planting = Planting.new(planted_at: Time.zone.today)
# using find_by_id here because it returns nil, unlike find
@crop = Crop.find_by(id: params[:crop_id]) || Crop.new
@garden = Garden.find_by(id: params[:garden_id]) || Garden.new
@crop = Crop.approved.find_by(id: params[:crop_id]) || Crop.new
@garden = Garden.find_by(owner: current_member, id: params[:garden_id]) || Garden.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @planting }
end
respond_with @planting
end
# GET /plantings/1/edit
def edit
# the following are needed to display the form but aren't used
@crop = Crop.new
@garden = Garden.new
end
# POST /plantings
# POST /plantings.json
def create
params[:planted_at] = parse_date(params[:planted_at])
@planting = Planting.new(planting_params)
@planting.owner = current_member
respond_to do |format|
if @planting.save
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully created.' }
format.json { render json: @planting, status: :created, location: @planting }
expire_fragment("homepage_stats")
else
format.html { render action: "new" }
format.json { render json: @planting.errors, status: :unprocessable_entity }
end
end
@planting.save!
respond_with @planting
end
# PUT /plantings/1
# PUT /plantings/1.json
def update
params[:planted_at] = parse_date(params[:planted_at])
respond_to do |format|
if @planting.update(planting_params)
@planting.update_attribute(:days_before_maturity,
update_days_before_maturity(@planting, planting_params[:crop_id]))
format.html { redirect_to @planting, notice: 'Planting was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @planting.errors, status: :unprocessable_entity }
end
end
@planting.update(planting_params)
respond_with @planting
end
# DELETE /plantings/1
# DELETE /plantings/1.json
def destroy
@garden = @planting.garden
@planting.destroy
expire_fragment("homepage_stats")
respond_to do |format|
format.html { redirect_to @garden }
format.json { head :no_content }
end
respond_with @planting, location: @planting.garden
end
private
def planting_params
params.require(:planting).permit(:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :owner_id, :finished,
:finished_at)
def update_crop_medians
@planting.crop.update_lifespan_medians
end
def update_days_before_maturity(planting, crop_id)
if planting.finished_at.nil?
planting.calculate_days_before_maturity(planting, crop_id)
else
(planting.finished_at - planting.planted_at).to_i
end
def update_planting_medians
@planting.update_harvest_days
end
def planting_params
params[:planted_at] = parse_date(params[:planted_at]) if params[:planted_at]
params.require(:planting).permit(
:crop_id, :description, :garden_id, :planted_at,
:quantity, :sunniness, :planted_from, :finished,
:finished_at
)
end
def plantings
@@ -132,6 +95,9 @@ class PlantingsController < ApplicationController
Planting
end
p = p.current unless @show_all
p.includes(:owner, :crop, :garden).order(:created_at).paginate(page: params[:page])
p.joins(:owner, :crop, :garden)
.includes(:crop, :owner, :garden)
.order(:created_at)
.paginate(page: params[:page])
end
end
+23 -53
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,57 +26,33 @@ 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
def edit
end
def edit; end
# POST /posts
# POST /posts.json
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 +60,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
+11 -38
View File
@@ -1,67 +1,40 @@
class ProductsController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
responders :flash
# GET /products
def index
@products = Product.all
respond_to do |format|
format.html # index.html.erb
end
respond_with @products
end
# GET /products/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with @product
end
# GET /products/new
def new
@product = Product.new
respond_to do |format|
format.html # new.html.erb
end
respond_with @product
end
# GET /products/1/edit
def edit
respond_with @product
end
# POST /products
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
else
format.html { render action: "new" }
end
end
@product = Product.create(product_params)
respond_with @product
end
# PUT /products/1
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
else
format.html { render action: "edit" }
end
end
@product.update(product_params)
respond_with @product
end
# DELETE /products/1
def destroy
@product.destroy
respond_to do |format|
format.html { redirect_to products_url }
end
respond_with @product
end
private
@@ -35,6 +35,14 @@ class RegistrationsController < Devise::RegistrationsController
render "edit"
end
end
def destroy
if @member.destroy_with_password(params.require(:member)[:current_password])
redirect_to root_path
else
render "edit"
end
end
end
# check if we need the current password to update fields
+11 -38
View File
@@ -1,67 +1,40 @@
class RolesController < ApplicationController
before_action :authenticate_member!
load_and_authorize_resource
respond_to :html
responders :flash
# GET /roles
def index
@roles = Role.all
respond_to do |format|
format.html # index.html.erb
end
respond_with @roles
end
# GET /roles/1
def show
respond_to do |format|
format.html # show.html.erb
end
respond_with @role
end
# GET /roles/new
def new
@role = Role.new
respond_to do |format|
format.html # new.html.erb
end
respond_with @role
end
# GET /roles/1/edit
def edit
respond_with @role
end
# POST /roles
def create
@role = Role.new(role_params)
respond_to do |format|
if @role.save
format.html { redirect_to @role, notice: 'Role was successfully created.' }
else
format.html { render action: "new" }
end
end
@role = Role.create(role_params)
respond_with @role
end
# PUT /roles/1
def update
respond_to do |format|
if @role.update(role_params)
format.html { redirect_to @role, notice: 'Role was successfully updated.' }
else
format.html { render action: "edit" }
end
end
@role.update(role_params)
respond_with @role
end
# DELETE /roles/1
def destroy
@role.destroy
respond_to do |format|
format.html { redirect_to roles_url }
end
respond_with @role
end
private
+14 -43
View File
@@ -1,25 +1,20 @@
class ScientificNamesController < ApplicationController
before_action :authenticate_member!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :json
responders :flash
# 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,46 +22,27 @@ 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
def edit
end
def edit; end
# 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
@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
@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
+25 -53
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,66 +29,43 @@ 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
def edit
end
def edit; end
# 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 +77,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
+1 -1
View File
@@ -2,7 +2,7 @@ class SessionsController < Devise::SessionsController
respond_to :json
def create
super do |resource|
super do |_resource|
if Crop.pending_approval.present? && current_member.role?(:crop_wrangler)
flash[:alert] = "There are crops waiting to be wrangled."
end
+4 -10
View File
@@ -1,4 +1,5 @@
class ShopController < ApplicationController
respond_to :html
def index
@products = Product.all
@order_item = OrderItem.new
@@ -11,15 +12,8 @@ class ShopController < ApplicationController
@order = nil
@most_recent_item = nil
if current_member
@order = current_member.current_order
if @order
@most_recent_item = @order.order_items.first
end
end
respond_to do |format|
format.html # index.html.haml
end
return unless current_member
@order = current_member.current_order
@most_recent_item = @order.order_items.first if @order
end
end
+4 -1
View File
@@ -55,6 +55,7 @@ module ApplicationHelper
# Falls back to Gravatar
#
def avatar_uri(member, size = 150)
return unless member
if member.preferred_avatar_uri.present?
# Some avatars support different sizes
# http://graph.facebook.com/12345678/picture?width=150&height=150
@@ -93,11 +94,13 @@ module ApplicationHelper
end
end
def title(type, owner, crop)
def title(type, owner, crop, planting)
if owner
t(".title.owner_#{type}", owner: owner.login_name)
elsif crop
t(".title.crop_#{type}", crop: crop.name)
elsif planting
t(".title.planting_#{type}", planting: planting.to_s)
else
t(".title.default")
end
+2 -2
View File
@@ -5,14 +5,14 @@ module CropsHelper
seeds = member.seeds.select { |seed| seed.crop.name == crop.name }
seeds.each do |seed|
total_quantity = total_quantity + seed.quantity if seed.quantity
total_quantity += seed.quantity if seed.quantity
end
if !seeds.any?
return "You don't have any seeds of this crop."
end
if (total_quantity != 0)
if total_quantity != 0
"You have #{total_quantity} #{Seed.model_name.human(count: total_quantity)} of this crop."
else
"You have an unknown quantity of seeds of this crop."
+3 -2
View File
@@ -21,13 +21,14 @@ module GardensHelper
if plantings.blank?
"None"
else
output = ""
plantings.first(2).each do |planting|
output = '<ul class="plantings">'
plantings.each do |planting|
output += "<li>"
output += planting.quantity.nil? ? "0 " : "#{planting.quantity} "
output += link_to planting.crop.name, planting.crop
output += ", planted on #{planting.planted_at}</li>"
end
output += '</ul>'
output.html_safe
end
end
+1 -13
View File
@@ -1,18 +1,6 @@
module PlantingsHelper
def display_days_before_maturity(planting)
# First try to calc from finished/finished_at
if planting.finished? || planting.finished_at.present?
planting.days_until_finished.to_s
# then try to calc from planted at + maturity
elsif planting.planted_at.present? && planting.days_before_maturity.present?
planting.days_until_mature.to_s
else
"unknown"
end
end
def display_finished(planting)
if !planting.finished_at.nil?
if planting.finished_at.present?
planting.finished_at
elsif planting.finished
"Yes (no date specified)"
+6 -4
View File
@@ -1,7 +1,7 @@
class Ability
include CanCan::Ability
def initialize(member) # rubocop:disable Metrics/AbcSize
def initialize(member) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
# everyone can do these things, even non-logged in
@@ -72,11 +72,13 @@ class Ability
can :create, Authentication
can :destroy, Authentication, member_id: member.id
# anyone can create a post, or comment on a post,
# anyone can create a post, like, or comment on a post,
# but only the author can edit/destroy it.
can :create, Post
can :update, Post, author_id: member.id
can :destroy, Post, author_id: member.id
can :create, Like
can :destroy, Like, member_id: member.id
can :create, Comment
can :update, Comment, author_id: member.id
can :destroy, Comment, author_id: member.id
@@ -87,8 +89,8 @@ class Ability
can :destroy, Garden, owner_id: member.id
can :create, Planting
can :update, Planting, garden: { owner_id: member.id }
can :destroy, Planting, garden: { owner_id: member.id }
can :update, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :destroy, Planting, garden: { owner_id: member.id }, crop: { approval_status: 'approved' }
can :create, Harvest
can :update, Harvest, owner_id: member.id
+2
View File
@@ -2,4 +2,6 @@ class AlternateName < ActiveRecord::Base
after_commit { |an| an.crop.__elasticsearch__.index_document if an.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end
+1
View File
@@ -6,6 +6,7 @@ module PhotoCapable
has_and_belongs_to_many :photos # rubocop:disable Rails/HasAndBelongsToMany
before_destroy :remove_from_list
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
end
def remove_from_list
+50 -182
View File
@@ -2,43 +2,48 @@ class Crop < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
has_many :scientific_names, after_add: :update_index, after_remove: :update_index
accepts_nested_attributes_for :scientific_names,
allow_destroy: true,
reject_if: :all_blank
##
## Triggers
before_destroy { |crop| crop.posts.clear }
##
## Relationships
has_many :scientific_names, after_add: :update_index, after_remove: :update_index, dependent: :destroy
accepts_nested_attributes_for :scientific_names, allow_destroy: true, reject_if: :all_blank
has_many :alternate_names, after_add: :update_index, after_remove: :update_index, dependent: :destroy
has_many :plantings
has_many :photos, through: :plantings
has_many :seeds
has_many :harvests
has_many :plant_parts, -> { uniq }, through: :harvests
has_many :plant_parts, -> { uniq.reorder("plant_parts.name") }, through: :harvests
belongs_to :creator, class_name: 'Member'
belongs_to :requester, class_name: 'Member'
belongs_to :parent, class_name: 'Crop'
has_many :varieties, class_name: 'Crop', foreign_key: 'parent_id'
has_and_belongs_to_many :posts # rubocop:disable Rails/HasAndBelongsToMany
before_destroy { |crop| crop.posts.clear }
default_scope { order("lower(name) asc") }
scope :recent, lambda {
where(approval_status: "approved").reorder("created_at desc")
}
scope :toplevel, lambda {
where(approval_status: "approved", parent_id: nil)
}
scope :popular, lambda {
where(approval_status: "approved").reorder("plantings_count desc, lower(name) asc")
}
scope :randomized, lambda {
# ok on sqlite and psql, but not on mysql
where(approval_status: "approved").reorder('random()')
}
##
## Scopes
default_scope { order("lower(crops.name) asc") }
scope :recent, -> { approved.reorder("created_at desc") }
scope :toplevel, -> { approved.where(parent_id: nil) }
scope :popular, -> { approved.reorder("plantings_count desc, lower(name) asc") }
# ok on sqlite and psql, but not on mysql
scope :randomized, -> { approved.reorder('random()') }
scope :pending_approval, -> { where(approval_status: "pending") }
scope :approved, -> { where(approval_status: "approved") }
scope :rejected, -> { where(approval_status: "rejected") }
scope :interesting, -> { approved.has_photos.randomized }
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
##
## Validations
# Reasons are only necessary when rejecting
validates :reason_for_rejection, presence: true, if: :rejected?
## This validation addresses a race condition
validate :approval_status_cannot_be_changed_again
validate :must_be_rejected_if_rejected_reasons_present
validate :must_have_meaningful_reason_for_rejection
## Wikipedia urls are only necessary when approving a crop
validates :en_wikipedia_url,
format: {
@@ -47,16 +52,6 @@ class Crop < ActiveRecord::Base
},
if: :approved?
## Reasons are only necessary when rejecting
validates :reason_for_rejection, presence: true, if: :rejected?
## This validation addresses a race condition
validate :approval_status_cannot_be_changed_again
validate :must_be_rejected_if_rejected_reasons_present
validate :must_have_meaningful_reason_for_rejection
####################################
# Elastic search configuration
if ENV["GROWSTUFF_ELASTICSEARCH"] == "true"
@@ -103,14 +98,8 @@ class Crop < ActiveRecord::Base
end
end
def as_indexed_json(_options = {})
as_json(
only: [:id, :name, :approval_status],
include: {
scientific_names: { only: :name },
alternate_names: { only: :name }
}
)
def harvest_photos
Photo.joins(:harvests).where("harvests.crop_id": id)
end
# update the Elasticsearch index (only if we're using it in this
@@ -118,7 +107,6 @@ class Crop < ActiveRecord::Base
def update_index(_name_obj)
__elasticsearch__.index_document if ENV["GROWSTUFF_ELASTICSEARCH"] == "true"
end
# End Elasticsearch section
def to_s
@@ -129,7 +117,6 @@ class Crop < ActiveRecord::Base
scientific_names.first.name unless scientific_names.empty?
end
# crop.default_photo
# currently returns the first available photo, but exists so that
# later we can choose a default photo based on different criteria,
# eg. popularity
@@ -141,7 +128,6 @@ class Crop < ActiveRecord::Base
harvest_with_photo.photos.first if harvest_with_photo
end
# crop.sunniness
# returns hash indicating whether this crop is grown in
# sun/semi-shade/shade
# key: sunniness (eg. 'sun')
@@ -150,7 +136,6 @@ class Crop < ActiveRecord::Base
count_uses_of_property 'sunniness'
end
# crop.planted_from
# returns a hash of propagation methods (seed, seedling, etc),
# key: propagation method (eg. 'seed')
# value: count of how many times it's been used by plantings
@@ -158,7 +143,6 @@ class Crop < ActiveRecord::Base
count_uses_of_property 'planted_from'
end
# crop.popular_plant_parts
# returns a hash of most harvested plant parts (fruit, seed, etc)
# key: plant part (eg. 'fruit')
# value: count of how many times it's been used by harvests
@@ -170,6 +154,10 @@ class Crop < ActiveRecord::Base
.count("harvests.id")
end
def annual?
!perennial
end
def interesting?
min_plantings = 3 # needs this many plantings to be interesting
min_photos = 3 # needs this many photos to be interesting
@@ -198,156 +186,37 @@ class Crop < ActiveRecord::Base
["already in database", "not edible", "not enough information", "other"]
end
# Crop.interesting
# returns a list of interesting crops, for use on the homepage etc
def self.interesting
howmany = 12 # max number to find
interesting_crops = []
Crop.includes(:photos).randomized.each do |c|
break if interesting_crops.size == howmany
next unless c.interesting?
interesting_crops.push(c)
end
interesting_crops
end
# Crop.create_from_csv(row)
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def self.create_from_csv(row)
name, en_wikipedia_url, parent, scientific_names, alternate_names = row
cropbot = Member.find_by(login_name: 'cropbot')
raise "cropbot account not found: run rake db:seed" unless cropbot
crop = Crop.find_or_create_by(name: name)
crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
if parent
parent = Crop.find_by(name: parent)
if parent
crop.update_attributes(parent_id: parent.id)
else
logger.warn("Warning: parent crop #{parent} not found")
end
end
crop.add_scientific_names_from_csv(scientific_names)
crop.add_alternate_names_from_csv(alternate_names)
end
def add_scientific_names_from_csv(scientific_names)
names_to_add = []
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(/,\s*/)
elsif parent && !parent.scientific_names.empty? # pick up from parent
names_to_add = parent.scientific_names.map(&:name)
else
logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
cropbot = Member.find_by(login_name: 'cropbot')
return if names_to_add.empty?
raise "cropbot account not found: run rake db:seed" unless cropbot
add_names_to_list(names_to_add, 'scientific')
end
def add_alternate_names_from_csv(alternate_names)
# i.e. we actually passed something in, which isn't a given
return if alternate_names.blank?
cropbot = Member.find_by!(login_name: 'cropbot')
names_to_add = alternate_names.split(/,\s*/)
add_names_to_list(names_to_add, 'alternate')
rescue
raise "cropbot account not found: run rake db:seed" unless cropbot
end
def rejection_explanation
return rejection_notes if reason_for_rejection == "other"
reason_for_rejection
end
# Crop.search(string)
def update_medians
plantings.each(&:update_harvest_days)
update_lifespan_medians
update_harvest_medians
end
def update_lifespan_medians
# Median lifespan of plantings
update(median_lifespan: Planting.where(crop: self).median(:lifespan))
end
def update_harvest_medians
update(median_days_to_first_harvest: Planting.where(crop: self).median(:days_to_first_harvest))
update(median_days_to_last_harvest: Planting.where(crop: self).median(:days_to_last_harvest))
end
def self.search(query)
if ENV['GROWSTUFF_ELASTICSEARCH'] == "true"
search_str = query.nil? ? "" : query.downcase
response = __elasticsearch__.search( # Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: search_str.to_s,
analyzer: "standard",
fields: ["name",
"scientific_names.scientific_name",
"alternate_names.name"]
}
},
filter: {
term: { approval_status: "approved" }
},
size: 50
)
response.records.to_a
else
# if we don't have elasticsearch, just do a basic SQL query.
# also, make sure it's an actual array not an activerecord
# collection, so it matches what we get from elasticsearch and we can
# manipulate it in the same ways (eg. deleting elements without deleting
# the whole record from the db)
matches = Crop.approved.where("name ILIKE ?", "%#{query}%").to_a
# we want to make sure that exact matches come first, even if not
# using elasticsearch (eg. in development)
exact_match = Crop.approved.find_by(name: query)
if exact_match
matches.delete(exact_match)
matches.unshift(exact_match)
end
matches
end
CropSearchService.search(query)
end
def self.case_insensitive_name(name)
where(["lower(name) = :value", { value: name.downcase }])
where(["lower(crops.name) = :value", { value: name.downcase }])
end
private
def add_names_to_list(names_to_add, list_name)
names_to_add.each do |n|
if name_already_exists(list_name, n)
logger.warn("Warning: skipping duplicate #{list_name} name #{n} for #{self}")
else
create_crop_in_list(list_name, n)
end
end
end
def create_crop_in_list(list_name, name)
cropbot = Member.find_by(login_name: 'cropbot')
create_hash = {
creator_id: cropbot.id.to_s,
name: name
}
send("#{list_name}_names").create(create_hash)
end
def name_already_exists(list_name, name)
send("#{list_name}_names").exists?(name: name)
end
def count_uses_of_property(col_name)
plantings.unscoped
.where(crop_id: id)
@@ -357,7 +226,6 @@ class Crop < ActiveRecord::Base
end
# Custom validations
def approval_status_cannot_be_changed_again
previous = previous_changes.include?(:approval_status) ? previous_changes.approval_status : {}
return unless previous.include?(:rejected) || previous.include?(:approved)
+70
View File
@@ -0,0 +1,70 @@
class CsvImporter
# used by db/seeds.rb and rake growstuff:import_crops
# CSV fields:
# - name (required)
# - en_wikipedia_url (required)
# - parent (name, optional)
# - scientific name (optional, can be picked up from parent if it has one)
def import_crop(row)
name, en_wikipedia_url, parent_name, scientific_names, alternate_names = row
@crop = Crop.find_or_create_by(name: name)
@crop.update_attributes(
en_wikipedia_url: en_wikipedia_url,
creator_id: cropbot.id
)
add_parent(parent_name) if parent_name
add_scientific_names(scientific_names)
add_alternate_names(alternate_names)
@crop.save!
@crop
end
private
def add_parent(parent_name)
parent = Crop.find_by(name: parent_name)
if parent
@crop.update_attributes(parent_id: parent.id)
else
@crop.logger.warn("Warning: parent crop #{parent_name} not found")
end
end
def add_scientific_names(scientific_names)
names_to_add = []
if !scientific_names.blank? # i.e. we actually passed something in, which isn't a given
names_to_add = scientific_names.split(/,\s*/)
elsif @crop.parent && !@crop.parent.scientific_names.empty? # pick up from parent
names_to_add = @crop.parent.scientific_names.map(&:name)
else
@crop.logger.warn("Warning: no scientific name (not even on parent crop) for #{self}")
end
return if names_to_add.empty?
names_to_add.each do |name|
sciname = ScientificName.find_by(name: name, crop: @crop)
sciname = ScientificName.create!(name: name, crop: @crop, creator: cropbot) unless sciname
@crop.scientific_names << sciname
end
end
def add_alternate_names(alternate_names)
# i.e. we actually passed something in, which isn't a given
return if alternate_names.blank?
alternate_names.split(/,\s*/).each do |name|
altname = AlternateName.find_by(name: name, crop: @crop)
altname = AlternateName.create! name: name, crop: @crop, creator: cropbot unless altname
@crop.alternate_names << altname
end
end
def cropbot
@cropbot = Member.find_by!(login_name: 'cropbot') unless @cropbot
@cropbot
rescue
raise "cropbot account not found: run rake db:seed"
end
end
+2 -1
View File
@@ -1,6 +1,7 @@
class Forum < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
validates :name, presence: true
friendly_id :name, use: %i(slugged finders)
has_many :posts
belongs_to :owner, class_name: "Member"
+7 -7
View File
@@ -2,10 +2,10 @@ class Garden < ActiveRecord::Base
extend FriendlyId
include Geocodable
include PhotoCapable
friendly_id :garden_slug, use: [:slugged, :finders]
friendly_id :garden_slug, use: %i(slugged finders)
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
has_many :plantings, -> { order(created_at: :desc) }, dependent: :destroy
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
has_many :plantings, dependent: :destroy
has_many :crops, through: :plantings
# set up geocoding
@@ -14,7 +14,7 @@ class Garden < ActiveRecord::Base
after_validation :empty_unwanted_geocodes
after_save :mark_inactive_garden_plantings_as_finished
default_scope { order("lower(name) asc") }
default_scope { joins(:owner).order("lower(name) asc") }
scope :active, -> { where(active: true) }
scope :inactive, -> { where(active: false) }
@@ -23,7 +23,7 @@ class Garden < ActiveRecord::Base
validates :name,
format: {
with: /\A\w+[\w ]+\z/
with: /\A\w+[\w ()]+\z/
},
length: { maximum: 255 }
@@ -41,7 +41,7 @@ class Garden < ActiveRecord::Base
"acres" => "acre"
}.freeze
validates :area_unit, inclusion: { in: AREA_UNITS_VALUES.values,
message: "%{value} is not a valid area unit" },
message: "%<value>s is not a valid area unit" },
allow_nil: true,
allow_blank: true
@@ -62,7 +62,7 @@ class Garden < ActiveRecord::Base
unique_plantings = []
seen_crops = []
plantings.each do |p|
plantings.includes(:garden, :crop, :owner, :harvests).each do |p|
unless seen_crops.include?(p.crop)
unique_plantings.push(p)
seen_crops.push(p.crop)
+57 -34
View File
@@ -1,29 +1,11 @@
class Harvest < ActiveRecord::Base
extend FriendlyId
include ActionView::Helpers::NumberHelper
extend FriendlyId
include PhotoCapable
friendly_id :harvest_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member'
belongs_to :plant_part
belongs_to :planting
default_scope { order('created_at DESC') }
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }
validates :plant_part, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: false,
greater_than_or_equal_to: 0
},
allow_nil: true
friendly_id :harvest_slug, use: %i(slugged finders)
# Constants
UNITS_VALUES = {
"individual" => "individual",
"bunches" => "bunch",
@@ -36,29 +18,54 @@ class Harvest < ActiveRecord::Base
"baskets" => "basket",
"bushels" => "bushel"
}.freeze
validates :unit, inclusion: { in: UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
validates :weight_quantity,
numericality: { only_integer: false },
allow_nil: true
WEIGHT_UNITS_VALUES = {
"kg" => "kg",
"lb" => "lb",
"oz" => "oz"
}.freeze
validates :weight_unit, inclusion: { in: WEIGHT_UNITS_VALUES.values,
message: "%{value} is not a valid unit" },
allow_nil: true,
allow_blank: true
##
## Triggers
after_validation :cleanup_quantities
before_save :set_si_weight
##
## Relationships
belongs_to :crop
belongs_to :owner, class_name: 'Member', counter_cache: true
belongs_to :plant_part
belongs_to :planting
##
## Scopes
default_scope { joins(:owner) }
##
## Validations
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }
validates :plant_part, presence: { message: "must be present and exist in our database" }
validates :harvested_at, presence: true
validates :quantity, allow_nil: true, numericality: {
only_integer: false, greater_than_or_equal_to: 0
}
validates :unit, allow_nil: true, allow_blank: true, inclusion: {
in: UNITS_VALUES.values, message: "%<value>s is not a valid unit"
}
validates :weight_quantity, allow_nil: true, numericality: { only_integer: false }
validates :weight_unit, allow_nil: true, allow_blank: true, inclusion: {
in: WEIGHT_UNITS_VALUES.values, message: "%<value>s is not a valid unit"
}
validate :crop_must_match_planting
validate :owner_must_match_planting
validate :harvest_must_be_after_planting
def time_from_planting_to_harvest
return if planting.blank?
harvested_at - planting.planted_at
end
# we're storing the harvest weight in kilograms in the db too
# to make data manipulation easier
def set_si_weight
@@ -119,4 +126,20 @@ class Harvest < ActiveRecord::Base
def default_photo
photos.first || crop.default_photo
end
def crop_must_match_planting
return if planting.blank? # only check if we are linked to a planting
errors.add(:planting, "must be the same crop") unless crop == planting.crop
end
def owner_must_match_planting
return if planting.blank? # only check if we are linked to a planting
errors.add(:owner, "of harvest must be the same as planting") unless owner == planting.owner
end
def harvest_must_be_after_planting
# only check if we are linked to a planting
return unless harvested_at.present? && planting.present? && planting.planted_at.present?
errors.add(:planting, "cannot be harvested before planting") unless harvested_at > planting.planted_at
end
end
+13 -25
View File
@@ -1,13 +1,14 @@
class Member < ActiveRecord::Base
acts_as_paranoid # implements soft deletion
before_destroy :newsletter_unsubscribe
include Geocodable
extend FriendlyId
friendly_id :login_name, use: [:slugged, :finders]
friendly_id :login_name, use: %i(slugged finders)
has_many :posts, foreign_key: 'author_id'
has_many :comments, foreign_key: 'author_id'
has_many :forums, foreign_key: 'owner_id'
has_many :gardens, foreign_key: 'owner_id'
has_many :plantings, foreign_key: 'owner_id'
@@ -27,14 +28,19 @@ class Member < ActiveRecord::Base
has_many :photos
has_many :requested_crops, class_name: Crop, foreign_key: 'requester_id'
has_many :likes, dependent: :destroy
default_scope { order("lower(login_name) asc") }
scope :confirmed, -> { where('confirmed_at IS NOT NULL') }
scope :located, -> { where("location <> '' and latitude IS NOT NULL and longitude IS NOT NULL") }
scope :recently_signed_in, -> { reorder('updated_at DESC') }
scope :recently_joined, -> { reorder("confirmed_at desc") }
scope :confirmed, -> { where.not(confirmed_at: nil) }
scope :located, -> { where.not(location: '').where.not(latitude: nil).where.not(longitude: nil) }
scope :recently_signed_in, -> { reorder(updated_at: :desc) }
scope :recently_joined, -> { reorder(confirmed_at: :desc) }
scope :wants_newsletter, -> { where(newsletter: true) }
scope :interesting, -> { confirmed.located.recently_signed_in.has_plantings }
scope :has_plantings, -> { joins(:plantings).group("members.id") }
has_many :follows, class_name: "Follow", foreign_key: "follower_id"
has_many :followed, through: :follows
@@ -85,7 +91,7 @@ class Member < ActiveRecord::Base
# and an account record (for paid accounts etc)
# we use find_or_create to avoid accidentally creating a second one,
# which can happen sometimes especially with FactoryGirl associations
# which can happen sometimes especially with FactoryBot associations
after_create { |member| Account.find_or_create_by(member_id: member.id) }
after_save :update_newsletter_subscription
@@ -183,14 +189,6 @@ class Member < ActiveRecord::Base
sets
end
def interesting?
# we assume we're being passed something from
# Member.confirmed.located as those are required for
# interestingness, as well.
return true if plantings.present?
false
end
def self.login_name_or_email(login)
where(["lower(login_name) = :value OR lower(email) = :value", { value: login.downcase }])
end
@@ -199,16 +197,6 @@ class Member < ActiveRecord::Base
where(["lower(login_name) = :value", { value: login.downcase }])
end
def self.interesting
howmany = 12 # max number to find
interesting_members = []
Member.confirmed.located.recently_signed_in.each do |m|
break if interesting_members.size == howmany
interesting_members.push(m) if m.interesting?
end
interesting_members
end
def self.nearest_to(place)
nearby_members = []
if place
+2 -2
View File
@@ -1,5 +1,5 @@
class Order < ActiveRecord::Base
belongs_to :member
belongs_to :member, with_deleted: true
has_many :order_items, dependent: :destroy
@@ -64,7 +64,7 @@ class Order < ActiveRecord::Base
if args[:for]
case args[:by]
when "member"
member = Member.find_by(login_name: args[:for])
member = Member.with_deleted.find_by(login_name: args[:for])
return member.orders if member
when "order_id"
order = Order.find_by(id: args[:for])
+16 -2
View File
@@ -8,7 +8,11 @@ class Photo < ActiveRecord::Base
before_destroy { all_associations.clear }
default_scope { order("created_at desc") }
default_scope { joins(:owner).order(created_at: :desc) }
def associations?
plantings.any? || harvests.any? || gardens.any? || seeds.any?
end
def all_associations
associations = []
@@ -30,7 +34,7 @@ class Photo < ActiveRecord::Base
licenses = flickr.photos.licenses.getInfo
license = licenses.find { |l| l.id == info.license }
{
title: info.title || "Untitled",
title: calculate_title(info),
license_name: license.name,
license_url: license.url,
thumbnail_url: FlickRaw.url_q(info),
@@ -39,6 +43,16 @@ class Photo < ActiveRecord::Base
}
end
def calculate_title(info)
if id && title # already has a title saved
title
elsif info.title # use title from flickr
info.title
else
'untitled'
end
end
def set_flickr_metadata
update_attributes(flickr_metadata)
end
+1 -1
View File
@@ -1,6 +1,6 @@
class PlantPart < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
friendly_id :name, use: %i(slugged finders)
has_many :harvests
has_many :crops, -> { uniq }, through: :harvests
+94 -113
View File
@@ -1,78 +1,64 @@
class Planting < ActiveRecord::Base
extend FriendlyId
include PhotoCapable
friendly_id :planting_slug, use: [:slugged, :finders]
friendly_id :planting_slug, use: %i(slugged finders)
# Constants
SUNNINESS_VALUES = %w(sun semi-shade shade)
PLANTED_FROM_VALUES = [
'seed', 'seedling', 'cutting', 'root division', 'runner',
'bulb', 'root/tuber', 'bare root plant', 'advanced plant',
'graft', 'layering'
]
##
## Triggers
before_save :calculate_lifespan
belongs_to :garden
belongs_to :owner, class_name: 'Member', counter_cache: true
belongs_to :crop, counter_cache: true
has_many :harvests, -> { order(harvested_at: :desc) }, dependent: :destroy
has_many :harvests, dependent: :destroy
default_scope { order("created_at desc") }
##
## Scopes
default_scope { joins(:owner).order(created_at: :desc) }
scope :finished, -> { where(finished: true) }
scope :current, -> { where(finished: false) }
scope :interesting, -> { has_photos.one_per_owner }
scope :one_per_owner, lambda {
joins("JOIN members m ON (m.id=plantings.owner_id)
LEFT OUTER JOIN plantings p2
ON (m.id=p2.owner_id AND plantings.id < p2.id)").where("p2 IS NULL")
}
delegate :name,
:en_wikipedia_url,
:default_scientific_name,
:plantings_count,
to: :crop,
prefix: true
default_scope { order("created_at desc") }
validates :crop, approved: true
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
numericality: {
only_integer: true,
greater_than_or_equal_to: 0 },
allow_nil: true
SUNNINESS_VALUES = %w(sun semi-shade shade)
validates :sunniness, inclusion: { in: SUNNINESS_VALUES,
message: "%{value} is not a valid sunniness value" },
allow_nil: true,
allow_blank: true
PLANTED_FROM_VALUES = [
'seed',
'seedling',
'cutting',
'root division',
'runner',
'bulb',
'root/tuber',
'bare root plant',
'advanced plant',
'graft',
'layering'
]
validates :planted_from, inclusion: { in: PLANTED_FROM_VALUES,
message: "%{value} is not a valid planting method" },
allow_nil: true,
allow_blank: true
##
## Delegations
delegate :name, :en_wikipedia_url, :default_scientific_name, :plantings_count,
to: :crop, prefix: true
##
## Validations
validates :garden, presence: true
validates :crop, presence: true, approved: { message: "must be present and exist in our database" }
validate :finished_must_be_after_planted
# check that any finished_at date occurs after planted_at
def finished_must_be_after_planted
return unless planted_at && finished_at # only check if we have both
errors.add(:finished_at, "must be after the planting date") unless planted_at < finished_at
end
validate :owner_must_match_garden_owner
validates :quantity, allow_nil: true, numericality: {
only_integer: true, greater_than_or_equal_to: 0
}
validates :sunniness, allow_nil: true, allow_blank: true, inclusion: {
in: SUNNINESS_VALUES, message: "%<value>s is not a valid sunniness value"
}
validates :planted_from, allow_nil: true, allow_blank: true, inclusion: {
in: PLANTED_FROM_VALUES, message: "%<value>s is not a valid planting method"
}
def planting_slug
if garden.present? && crop.present?
"#{owner.login_name}-#{garden.name}-#{crop.name}"
elsif garden.present?
"#{owner.login_name}-#{garden.name}-null"
elsif crop.present?
"#{owner.login_name}-null-#{crop.name}"
else
"#{owner.login_name}-null-null"
end.downcase.gsub(' ', '-')
[
owner.login_name,
garden.present? ? garden.name : 'null',
crop.present? ? crop.name : 'null'
].join('-').tr(' ', '-').downcase
end
# location = garden owner + garden name, i.e. "Skud's backyard"
@@ -89,73 +75,68 @@ class Planting < ActiveRecord::Base
photos.first
end
def interesting?
photos.present?
def planted?
planted_at.present? && planted_at <= Date.current
end
def calculate_days_before_maturity(planting, crop)
p_crop = Planting.where(crop_id: crop).where.not(id: planting)
differences = p_crop.collect do |p|
if p.finished && !p.finished_at.nil?
(p.finished_at - p.planted_at).to_i
end
def finish_predicted_at
planted_at + crop.median_lifespan.days if crop.median_lifespan.present? && planted_at.present?
end
def calculate_lifespan
self.lifespan = (planted_at.present? && finished_at.present? ? finished_at - planted_at : nil)
end
def expected_lifespan
if planted_at.present? && finished_at.present?
return (finished_at - planted_at).to_i
end
crop.median_lifespan
end
if differences.compact.empty?
nil
else
differences.compact.sum / differences.compact.size
def days_since_planted
(Time.zone.today - planted_at).to_i if planted_at.present?
end
def percentage_grown
return 100 if finished
return if planted_at.blank? || expected_lifespan.blank?
p = (days_since_planted / expected_lifespan.to_f) * 100
return p if p <= 100
100
end
def update_harvest_days
days_to_first_harvest = nil
days_to_last_harvest = nil
if planted_at.present? && harvests_with_dates.size.positive?
days_to_first_harvest = (first_harvest_date - planted_at).to_i
days_to_last_harvest = (last_harvest_date - planted_at).to_i if finished?
end
update(days_to_first_harvest: days_to_first_harvest, days_to_last_harvest: days_to_last_harvest)
end
def planted?(current_date = Date.current)
planted_at.present? && current_date.to_date >= planted_at
def first_harvest_date
harvests_with_dates.minimum(:harvested_at)
end
def days_until_finished
return 0 if finished?
days = (finished_at - Date.current).to_i
days.positive? ? days : 0
def last_harvest_date
harvests_with_dates.maximum(:harvested_at)
end
def days_until_mature
days = ((planted_at + days_before_maturity) - Date.current).to_i
days.positive? ? days : 0
private
def harvests_with_dates
harvests.where.not(harvested_at: nil)
end
def percentage_grown(current_date = Date.current)
return nil unless days_before_maturity && planted?(current_date)
days = (current_date.to_date - planted_at.to_date).to_i
return 0 if current_date < planted_at
return 100 if days > days_before_maturity
percent = (days / days_before_maturity * 100).to_i
if percent >= 100
percent = 100
end
percent
# check that any finished_at date occurs after planted_at
def finished_must_be_after_planted
return unless planted_at && finished_at # only check if we have both
errors.add(:finished_at, "must be after the planting date") unless planted_at < finished_at
end
# return a list of interesting plantings, for the homepage etc.
# we can't do this via a scope (as far as we know) so sadly we have to
# do it this way.
def Planting.interesting(howmany = 12, require_photo = true)
interesting_plantings = []
seen_owners = Hash.new(false) # keep track of which owners we've seen already
Planting.includes(:photos).each do |p|
break if interesting_plantings.size == howmany # got enough yet?
if require_photo
next unless p.photos.present? # skip those without photos, if required
end
next if seen_owners[p.owner] # skip if we already have one from this owner
seen_owners[p.owner] = true # we've seen this owner
interesting_plantings.push(p)
end
interesting_plantings
def owner_must_match_garden_owner
errors.add(:owner, "must be the same as garden") unless owner == garden.owner
end
end
+3 -5
View File
@@ -1,7 +1,7 @@
class Post < ActiveRecord::Base
extend FriendlyId
include Likeable
friendly_id :author_date_subject, use: [:slugged, :finders]
friendly_id :author_date_subject, use: %i(slugged finders)
belongs_to :author, class_name: 'Member'
belongs_to :forum
has_many :comments, dependent: :destroy
@@ -36,12 +36,10 @@ class Post < ActiveRecord::Base
end
end
default_scope { order("created_at desc") }
default_scope { joins(:author).order(created_at: :desc) }
validates :subject,
format: {
with: /\S/
},
presence: true,
length: { maximum: 255 }
def author_date_subject
+1
View File
@@ -8,6 +8,7 @@ class Product < ActiveRecord::Base
greater_than_or_equal_to: 0
},
allow_nil: true
validates :min_price, presence: true
def to_s
name
+2 -2
View File
@@ -1,11 +1,11 @@
class Role < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
friendly_id :name, use: %i(slugged finders)
has_and_belongs_to_many :members # rubocop:disable Rails/HasAndBelongsToMany
class << self
[:crop_wranglers, :admins].each do |method|
%i(crop_wranglers admins).each do |method|
define_method method do
slug = method.to_s.singularize.dasherize
Role.where(slug: slug).try(:first).try(:members)
+2
View File
@@ -2,4 +2,6 @@ class ScientificName < ActiveRecord::Base
after_commit { |sn| sn.crop.__elasticsearch__.index_document if sn.crop && ENV['GROWSTUFF_ELASTICSEARCH'] == "true" }
belongs_to :crop
belongs_to :creator, class_name: 'Member'
validates :name, presence: true
validates :crop, presence: true
end
+7 -25
View File
@@ -4,11 +4,13 @@ class Seed < ActiveRecord::Base
friendly_id :seed_slug, use: [:slugged, :finders]
belongs_to :crop
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id'
belongs_to :owner, class_name: 'Member', foreign_key: 'owner_id', counter_cache: true
default_scope { order("created_at desc") }
default_scope { joins(:owner).order(created_at: :desc) }
validates :crop, approved: true
delegate :name, to: :crop
delegate :default_photo, to: :crop
validates :crop, presence: { message: "must be present and exist in our database" }
validates :quantity,
@@ -30,8 +32,9 @@ class Seed < ActiveRecord::Base
},
allow_nil: true
scope :tradable, -> { where("tradable_to != 'nowhere'") }
scope :tradable, -> { where.not(tradable_to: 'nowhere') }
scope :interesting, -> { tradable.has_location }
scope :has_location, -> { joins(:owner).where.not("members.location": nil) }
TRADABLE_TO_VALUES = %w(nowhere locally nationally internationally).freeze
validates :tradable_to, inclusion: { in: TRADABLE_TO_VALUES,
message: "You may only trade seed nowhere, "\
@@ -77,27 +80,6 @@ class Seed < ActiveRecord::Base
end
end
def interesting?
# assuming we're passed something that's already known to be tradable
# eg. from Seed.tradable scope
return false if owner.location.blank? # don't want unspecified locations
true
end
# Seed.interesting
# returns a list of interesting seeds, for use on the homepage etc
def self.interesting
howmany = 12 # max number to find
interesting_seeds = []
Seed.tradable.each do |s|
break if interesting_seeds.size == howmany
interesting_seeds.push(s) if s.interesting?
end
interesting_seeds
end
def seed_slug
"#{owner.login_name}-#{crop}".downcase.tr(' ', '-')
end
+8
View File
@@ -0,0 +1,8 @@
module Api
module V1
class BaseResource < JSONAPI::Resource
immutable
abstract
end
end
end
+22
View File
@@ -0,0 +1,22 @@
module Api
module V1
class CropResource < BaseResource
immutable
filter :approval_status, default: 'approved'
has_many :plantings
has_many :photos
has_many :harvests
has_one :parent
attribute :name
attribute :en_wikipedia_url
attribute :perennial
attribute :median_lifespan
attribute :median_days_to_first_harvest
attribute :median_days_to_last_harvest
end
end
end
+13
View File
@@ -0,0 +1,13 @@
module Api
module V1
class GardenResource < BaseResource
immutable
has_one :owner, class_name: 'Member'
has_many :plantings
has_many :photos
attribute :name
end
end
end
+19
View File
@@ -0,0 +1,19 @@
module Api
module V1
class HarvestResource < BaseResource
immutable
has_one :crop
has_one :planting
has_one :owner, class_name: 'Member'
has_many :photos
attribute :harvested_at
attribute :description
attribute :unit
attribute :weight_quantity
attribute :weight_unit
attribute :si_weight
end
end
end
+15
View File
@@ -0,0 +1,15 @@
module Api
module V1
class MemberResource < BaseResource
immutable
has_many :gardens
has_many :plantings
has_many :harvests
has_many :seeds
has_many :photos
attribute :login_name
end
end
end
+18
View File
@@ -0,0 +1,18 @@
module Api
module V1
class PhotoResource < BaseResource
immutable
has_one :owner, class_name: 'Member'
has_many :plantings
has_many :gardens
has_many :harvests
attribute :thumbnail_url
attribute :fullsize_url
attribute :license_name
attribute :link_url
attribute :title
end
end
end
+28
View File
@@ -0,0 +1,28 @@
module Api
module V1
class PlantingResource < BaseResource
immutable
has_one :garden
has_one :crop
has_one :owner, class_name: 'Member'
has_many :photos
has_many :harvests
attribute :planted_at
attribute :finished_at
attribute :finished
attribute :quantity
attribute :description
attribute :sunniness
attribute :planted_from
# Predictions
attribute :expected_lifespan
attribute :finish_predicted_at
attribute :percentage_grown
attribute :first_harvest_date
attribute :last_harvest_date
end
end
end
+20
View File
@@ -0,0 +1,20 @@
module Api
module V1
class SeedResource < BaseResource
immutable
has_one :owner, class_name: 'Member'
has_one :crop
attribute :description
attribute :quantity
attribute :plant_before
attribute :tradable_to
attribute :days_until_maturity_min
attribute :days_until_maturity_max
attribute :organic
attribute :gmo
attribute :heirloom
end
end
end
+42
View File
@@ -0,0 +1,42 @@
class CropSearchService
# Crop.search(string)
def self.search(query)
if ENV['GROWSTUFF_ELASTICSEARCH'] == "true"
search_str = query.nil? ? "" : query.downcase
response = Crop.__elasticsearch__.search( # Finds documents which match any field, but uses the _score from
# the best field insead of adding up _score from each field.
query: {
multi_match: {
query: search_str.to_s,
analyzer: "standard",
fields: ["name",
"scientific_names.scientific_name",
"alternate_names.name"]
}
},
filter: {
term: { approval_status: "approved" }
},
size: 50
)
response.records.to_a
else
# if we don't have elasticsearch, just do a basic SQL query.
# also, make sure it's an actual array not an activerecord
# collection, so it matches what we get from elasticsearch and we can
# manipulate it in the same ways (eg. deleting elements without deleting
# the whole record from the db)
matches = Crop.approved.where("name ILIKE ?", "%#{query}%").to_a
# we want to make sure that exact matches come first, even if not
# using elasticsearch (eg. in development)
exact_match = Crop.approved.find_by(name: query)
if exact_match
matches.delete(exact_match)
matches.unshift(exact_match)
end
matches
end
end
end
+2
View File
@@ -4,6 +4,8 @@
%ul#admin_links
%li= link_to "Account types", account_types_path
%li= link_to "Alternate names", alternate_names_path
%li= link_to "Scientific names", scientific_names_path
%li= link_to "Products", products_path
%li= link_to "Roles", roles_path
%li= link_to "Forums", forums_path
+3 -1
View File
@@ -18,7 +18,9 @@
- @orders.each do |order|
%tr
%td= link_to order.member.login_name, order.member
%td
= link_to order.member.login_name, order.member
= "(deleted)" if order.member.deleted_at
%td= order.id
%td
- if order.completed_at
+4 -1
View File
@@ -6,7 +6,10 @@
.col-md-11
.comment-meta
Posted by
= link_to comment.author.login_name, member_path(comment.author)
- if comment.author
= link_to comment.author.login_name, member_path(comment.author)
- else
Member Deleted
on
= comment.created_at
- if comment.updated_at > comment.created_at
+11 -2
View File
@@ -29,6 +29,16 @@
Wranglers: please ensure this is singular, and capitalize
proper nouns only.
.form-group
= f.label :perennial, 'Lifespan', class: 'control-label col-md-2'
.col-md-8
= f.radio_button(:perennial, false)
= f.label(:perennial_false, "Annual")
%span.help-block Living and reproducing in a single year or less
= f.radio_button(:perennial, true)
= f.label(:perennial_true, "Perennial")
%span.help-block Living more than two years
.form-group
= f.label :en_wikipedia_url, 'Wikipedia URL', class: 'control-label col-md-2'
.col-md-8
@@ -90,8 +100,7 @@
- unless can? :wrangle, @crop
%p
When you submit this form, your suggestion will be sent to our team of
= link_to 'volunteer crop wranglers', 'http://talk.growstuff.org/c/crop-wrangling'
for review. We'll let you know the outcome as soon as we can.
volunteer crop wranglers for review. We'll let you know the outcome as soon as we can.
-# Now, for crop wranglers, let's have approval/rejection at the bottom of the page
- if can?(:wrangle, @crop) && @crop.requester
+17 -5
View File
@@ -12,11 +12,23 @@
%p
%b Scientific name:
= crop.default_scientific_name
%p
%b
Planted
= pluralize(crop.plantings.size, "time")
by #{ENV['GROWSTUFF_SITE_NAME']} members
- if crop.annual? && crop.median_lifespan.present?
%p
Median Lifespan
%b= crop.median_lifespan
days
- unless crop.median_days_to_first_harvest.nil?
%p
First harvest expected
%b= crop.median_days_to_first_harvest
days after planting
- if crop.annual? && crop.median_days_to_last_harvest.present?
%p
Last harvest expected
%b= crop.median_days_to_last_harvest
days after planting
- if can? :create, Planting
= link_to 'Plant this', new_planting_path(params: { crop_id: crop.id }), class: 'btn btn-primary'
+14 -4
View File
@@ -1,5 +1,15 @@
- unless crop.harvest_photos.empty?
%h3 Photos of #{crop.name} harvests
.row
- crop.harvest_photos.first(6).each do |p|
.col-xs-6.col-md-2
= render "photos/thumbnail", photo: p
- unless crop.photos.empty?
%h3 Photos of #{crop.name} plants
.row
- crop.photos.first(6).each do |p|
.col-xs-6.col-md-2
= render "photos/thumbnail", photo: p
.row
- unless crop.photos.empty?
- crop.photos.first(3).each do |p|
.col-md-4
= render partial: "photos/thumbnail", locals: { photo: p }
= link_to "more photos", crop_photos_path(crop_id: crop.id)
+29
View File
@@ -0,0 +1,29 @@
- unless crop.perennial.nil?
%p
#{crop.name} is
- if crop.perennial == true
= link_to 'https://en.wikipedia.org/wiki/Annual_vs._perennial_plant_evolution' do
a perennial crop
(living more than two years)
- elsif crop.perennial == false
= link_to 'https://en.wikipedia.org/wiki/Annual_vs._perennial_plant_evolution' do
an annual crop
(living and reproducing in a single year or less)
- if crop.annual? && crop.median_lifespan.present?
%p
Median lifespan of #{crop.name} plants is
%strong= crop.median_lifespan
days
- if crop.median_days_to_first_harvest.present?
%p
First harvest expected
%strong= crop.median_days_to_first_harvest
days after planting
- if crop.annual? && crop.median_days_to_last_harvest.present?
%p
Last harvest expected
%strong= crop.median_days_to_last_harvest
days after planting
+5 -5
View File
@@ -4,8 +4,8 @@
- if can? :wrangle, Crop
= link_to 'Wrangle Crops', wrangle_crops_path, class: 'btn btn-primary'
- if @has_requested_pending
= link_to(I18n.t('crops.requested.link', number_crops: @has_requested_pending), requested_crops_path)
- if @num_requested_crops && @num_requested_crops.positive?
= link_to(I18n.t('crops.requested.link', number_crops: @num_requested_crops), requested_crops_path)
%p
#{ENV['GROWSTUFF_SITE_NAME']} tracks who's growing what, where.
@@ -23,10 +23,10 @@
= submit_tag "Show", class: 'btn btn-primary'
.pagination
= will_paginate @paginated_crops
= will_paginate @crops
.row
- @paginated_crops.each do |crop|
- @crops.each do |crop|
.col-md-2.six-across
= render partial: "thumbnail", locals: { crop: crop }
@@ -35,7 +35,7 @@
= link_to 'New Crop', new_crop_path, class: 'btn btn-primary'
.pagination
= will_paginate @paginated_crops
= will_paginate @crops
%ul.list-inline
+2 -2
View File
@@ -7,5 +7,5 @@
%item
%title= crop.name
%pubdate= crop.created_at.to_s(:rfc822)
%link= post_url(crop)
%guid= post_url(crop)
%link= crop_url(crop)
%guid= crop_url(crop)
+15 -17
View File
@@ -20,19 +20,17 @@
- if can? :create, Seed
= link_to 'Add seeds to stash', new_seed_path(params: { crop_id: @crop.id }), class: 'btn btn-default'
- if member_signed_in?
= display_seed_availability(@current_member, @crop)
= link_to "View your seeds", seeds_by_owner_path(owner: current_member.slug)
.row
.col-md-9
- unless current_member
Learn how to grow #{@crop.name.pluralize} from growers around the world.
#{ENV['GROWSTUFF_SITE_NAME']} has tips and advice from real-life growers,
including when to plant #{@crop.name.pluralize}, how to harvest
#{@crop.name.pluralize}, and more.
- if member_signed_in?
= display_seed_availability(@current_member, @crop)
= link_to "View your seeds", seeds_by_owner_path(owner: current_member.slug)
= render partial: 'photos', locals: { crop: @crop }
%h2 Predictions
= render 'predictions', crop: @crop
%p= render 'crops/photos', crop: @crop
%h2
- if !@crop.plantings.empty?
@@ -86,18 +84,18 @@
%h4 How to grow #{@crop.name.pluralize}
= render partial: 'grown_for', locals: { crop: @crop }
= render partial: 'planting_advice', locals: { crop: @crop }
= render 'grown_for', crop: @crop
= render 'planting_advice', crop: @crop
= render partial: 'scientific_names', locals: { crop: @crop }
= render partial: 'alternate_names', locals: { crop: @crop }
= render 'scientific_names', crop: @crop
= render 'alternate_names', crop: @crop
%h4 #{@crop.name.capitalize} varieties
= render partial: 'varieties', locals: { crop: @crop }
= render 'varieties', crop: @crop
= render partial: 'plantings', locals: { crop: @crop }
= render partial: 'harvests', locals: { crop: @crop }
= render partial: 'find_seeds', locals: { crop: @crop }
= render 'plantings', crop: @crop
= render 'harvests', crop: @crop
= render 'find_seeds', crop: @crop
%h4 Learn more about #{@crop.name.pluralize}
+6 -4
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
Loaded 100 of 417 files, more files were not shown because too many files have changed in this diff. Show more