mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-25 01:13:03 -04:00
Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
494dd1d658 | ||
|
|
a3a88c48de | ||
|
|
705240014a | ||
|
|
78aa049502 | ||
|
|
97c7277a73 | ||
|
|
0e0af44d9f | ||
|
|
45af8d5f4f | ||
|
|
a1ee822690 | ||
|
|
b6e61eba7a | ||
|
|
b356d86931 | ||
|
|
34f91c2189 | ||
|
|
faf3f60e78 | ||
|
|
e3113fd53d | ||
|
|
68768c4d6a | ||
|
|
da7fec5e0b | ||
|
|
191c8e4e9d | ||
|
|
edc763cd8c | ||
|
|
fdfb116d92 | ||
|
|
888e0669a0 | ||
|
|
d55e2b5466 | ||
|
|
c28ae4fe83 | ||
|
|
4b4669459e | ||
|
|
77902ad300 | ||
|
|
f314fcd919 | ||
|
|
8171c12a5b | ||
|
|
08b6b46bfa | ||
|
|
bf189092ea | ||
|
|
a539a47044 | ||
|
|
e29ac8827a | ||
|
|
c5cee72ae5 | ||
|
|
5396550a8a | ||
|
|
76d2fb37b4 | ||
|
|
a42676ef0a | ||
|
|
3f3fc6a4ca | ||
|
|
c710a8b1ef | ||
|
|
6ada0c4f84 | ||
|
|
2e5a2455d6 | ||
|
|
d89d4cea39 | ||
|
|
01a82ac993 | ||
|
|
68660b3c65 | ||
|
|
67b4f3558e | ||
|
|
63b973833f | ||
|
|
4b19f73eb8 | ||
|
|
9b4d6044ef | ||
|
|
9c70ffe051 | ||
|
|
e7a1d2345d | ||
|
|
c7585f1931 | ||
|
|
63b76d175d | ||
|
|
1d5d2cc704 | ||
|
|
9477b4f9c7 | ||
|
|
a42a61abdd | ||
|
|
62eaa07862 | ||
|
|
f26420c380 | ||
|
|
6de13b7327 | ||
|
|
310f631f40 | ||
|
|
bec59aba43 | ||
|
|
c86902967d | ||
|
|
361e3df692 | ||
|
|
ce18bef892 | ||
|
|
ac2b0d04ea | ||
|
|
9d0b48b84c | ||
|
|
d8f41b5ca0 | ||
|
|
b5fbfaf515 | ||
|
|
ce9a71cdad | ||
|
|
42a10bcd80 | ||
|
|
33656a4104 | ||
|
|
ca200c1f30 | ||
|
|
ccd352d699 | ||
|
|
bd396dabfe | ||
|
|
1279dd63bc | ||
|
|
8d681dd90a | ||
|
|
dfd0e1dbf5 | ||
|
|
0d555542c2 | ||
|
|
99a69cd492 | ||
|
|
e8e9aa23b2 | ||
|
|
2fafc6f3e4 | ||
|
|
6b1714eb05 | ||
|
|
8e5c52e85e | ||
|
|
c749f4a813 | ||
|
|
5ed5f9ec7e | ||
|
|
f4658df208 | ||
|
|
e21b95a353 | ||
|
|
19205cb6a8 | ||
|
|
17521cde17 | ||
|
|
5f7d48c633 | ||
|
|
94bb3bf6bb | ||
|
|
c9aacd0110 | ||
|
|
ca5f14bb37 | ||
|
|
43da004ccb | ||
|
|
2704fcf515 | ||
|
|
1af19335d7 | ||
|
|
4d33c32866 | ||
|
|
01333bf965 | ||
|
|
a145abff56 | ||
|
|
9732553d3b | ||
|
|
9142613b6b | ||
|
|
7132c95b61 | ||
|
|
8f76ccf836 | ||
|
|
58e6411bbe |
10
.hound.yml
Normal file
10
.hound.yml
Normal 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
|
||||
@@ -31,6 +31,7 @@ PreCommit:
|
||||
enabled: true
|
||||
on_fail: warn
|
||||
command: ['npm', 'run', 'coffeelint']
|
||||
required_executable: 'npm'
|
||||
HardTabs:
|
||||
enabled: true
|
||||
AuthorEmail:
|
||||
@@ -42,6 +43,7 @@ PreCommit:
|
||||
exclude:
|
||||
- '**/bootstrap.min.css'
|
||||
command: ['npm', 'run', 'csslint']
|
||||
required_executable: 'npm'
|
||||
HamlLint:
|
||||
enabled: true
|
||||
command: ['bundle', 'exec', 'haml-lint', 'app/views']
|
||||
@@ -60,6 +62,7 @@ PreCommit:
|
||||
- 'spec/javascripts/support/vendor/**'
|
||||
- '**/bootstrap*'
|
||||
command: ['npm', 'run', 'jshint']
|
||||
required_executable: 'npm'
|
||||
ScssLint:
|
||||
enabled: true
|
||||
RailsSchemaUpToDate:
|
||||
@@ -69,11 +72,6 @@ PreCommit:
|
||||
YamlLint:
|
||||
enabled: true
|
||||
|
||||
PostCommit:
|
||||
GitGuilt:
|
||||
enabled: true
|
||||
command: ['npm', 'run', 'git-guilt']
|
||||
|
||||
PostCheckout:
|
||||
ALL:
|
||||
quiet: false
|
||||
|
||||
@@ -6,17 +6,6 @@
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
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'
|
||||
|
||||
Lint/HandleExceptions:
|
||||
Exclude:
|
||||
@@ -28,7 +17,6 @@ Lint/UnusedBlockArgument:
|
||||
Exclude:
|
||||
- 'app/controllers/sessions_controller.rb'
|
||||
- 'config/unicorn.rb'
|
||||
- 'lib/haml/filters/growstuff_markdown.rb'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
|
||||
@@ -121,7 +109,6 @@ 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'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
Style/ColonMethodCall:
|
||||
@@ -226,11 +213,6 @@ Style/PercentLiteralDelimiters:
|
||||
- 'spec/features/signin_spec.rb'
|
||||
- 'spec/features/signout_spec.rb'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
Style/PerlBackrefs:
|
||||
Exclude:
|
||||
- 'lib/haml/filters/growstuff_markdown.rb'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
|
||||
# SupportedStyles: slashes, percent_r, mixed
|
||||
@@ -256,11 +238,6 @@ Style/SymbolProc:
|
||||
Exclude:
|
||||
- 'lib/tasks/growstuff.rake'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnlessElse:
|
||||
Exclude:
|
||||
- 'app/controllers/omniauth_callbacks_controller.rb'
|
||||
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: SupportedStyles, WordRegex.
|
||||
# SupportedStyles: percent, brackets
|
||||
|
||||
@@ -1 +1 @@
|
||||
2.3.4
|
||||
2.4.1
|
||||
|
||||
19
.travis.yml
19
.travis.yml
@@ -1,4 +1,4 @@
|
||||
sudo: false
|
||||
sudo: required
|
||||
language: ruby
|
||||
cache:
|
||||
bundler: true
|
||||
@@ -14,18 +14,26 @@ env:
|
||||
- GROWSTUFF_SITE_NAME="Growstuff (travis)"
|
||||
- RAILS_SECRET_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
- secure: "Z5TpM2jEX4UCvNePnk/LwltQX48U2u9BRc+Iypr1x9QW2o228QJhPIOH39a8RMUrepGnkQIq9q3ZRUn98RfrJz1yThtlNFL3NmzdQ57gKgjGwfpa0e4Dwj/ZJqV2D84tDGjvdVYLP7zzaYZxQcwk/cgNpzKf/jq97HLNP7CYuf4="
|
||||
rvm:
|
||||
- 2.3.4
|
||||
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 [ "${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
|
||||
before_script:
|
||||
- bundle exec rake db:create db:migrate db:test:prepare
|
||||
- set -e
|
||||
- >
|
||||
if [ "${STATIC_CHECKS}" = "true" ]; then
|
||||
./script/install_linters;
|
||||
else
|
||||
bundle exec rake db:create db:migrate db:test:prepare;
|
||||
bundle exec rake assets:precompile;
|
||||
fi
|
||||
- set +e
|
||||
@@ -40,9 +48,6 @@ script:
|
||||
bundle exec rake jasmine:ci;
|
||||
fi;
|
||||
- set +e
|
||||
|
||||
services:
|
||||
- elasticsearch
|
||||
before_deploy:
|
||||
- bundle exec script/heroku_maintenance.rb on
|
||||
deploy:
|
||||
|
||||
8
Gemfile
8
Gemfile
@@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
source 'https://rubygems.org'
|
||||
|
||||
ruby '2.3.4'
|
||||
ruby '2.4.1'
|
||||
|
||||
gem 'rails', '~> 4.2.8'
|
||||
|
||||
@@ -91,6 +91,8 @@ 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
|
||||
gem 'dalli'
|
||||
@@ -104,7 +106,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'
|
||||
@@ -143,5 +145,5 @@ group :test do
|
||||
end
|
||||
|
||||
group :travis do
|
||||
gem 'heroku-api'
|
||||
gem 'platform-api'
|
||||
end
|
||||
|
||||
234
Gemfile.lock
234
Gemfile.lock
@@ -1,49 +1,49 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (4.2.9)
|
||||
actionpack (= 4.2.9)
|
||||
actionview (= 4.2.9)
|
||||
activejob (= 4.2.9)
|
||||
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.9)
|
||||
actionview (= 4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
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.9)
|
||||
activesupport (= 4.2.9)
|
||||
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.3)
|
||||
active_link_to (1.0.4)
|
||||
active_link_to (1.0.5)
|
||||
actionpack
|
||||
addressable
|
||||
active_merchant-paypal-bogus-gateway (0.1.0)
|
||||
activemerchant
|
||||
active_utils (3.3.7)
|
||||
active_utils (3.3.9)
|
||||
activesupport (>= 3.2, < 5.2.0)
|
||||
i18n
|
||||
activejob (4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
activejob (4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
globalid (>= 0.3.0)
|
||||
activemerchant (1.69.0)
|
||||
activemerchant (1.73.0)
|
||||
activesupport (>= 3.2.14, < 6.x)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
nokogiri (~> 1.4)
|
||||
activemodel (4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
activemodel (4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.9)
|
||||
activemodel (= 4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
activerecord (4.2.10)
|
||||
activemodel (= 4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
arel (~> 6.0)
|
||||
activesupport (4.2.9)
|
||||
activesupport (4.2.10)
|
||||
i18n (~> 0.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
@@ -51,24 +51,24 @@ GEM
|
||||
acts_as_paranoid (0.5.0)
|
||||
activerecord (>= 4.0, < 5.1)
|
||||
activesupport (>= 4.0, < 5.1)
|
||||
addressable (2.5.1)
|
||||
public_suffix (~> 2.0, >= 2.0.2)
|
||||
addressable (2.5.2)
|
||||
public_suffix (>= 2.0.2, < 4.0)
|
||||
arel (6.0.4)
|
||||
ast (2.3.0)
|
||||
autoprefixer-rails (7.1.2.3)
|
||||
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.2.0)
|
||||
elasticsearch-model (~> 0)
|
||||
elasticsearch-rails (~> 0)
|
||||
bootstrap-datepicker-rails (1.6.4.1)
|
||||
bootstrap-datepicker-rails (1.7.1.1)
|
||||
railties (>= 3.0)
|
||||
bootstrap-kaminari-views (0.0.5)
|
||||
kaminari (>= 0.13)
|
||||
@@ -78,14 +78,14 @@ GEM
|
||||
sass (>= 3.3.4)
|
||||
bootstrap_form (2.7.0)
|
||||
builder (3.2.3)
|
||||
bullet (5.6.0)
|
||||
bullet (5.6.1)
|
||||
activesupport (>= 3.0.0)
|
||||
uniform_notifier (~> 1.10.0)
|
||||
byebug (9.0.6)
|
||||
byebug (9.1.0)
|
||||
cancancan (2.0.0)
|
||||
capybara (2.14.4)
|
||||
capybara (2.15.4)
|
||||
addressable
|
||||
mime-types (>= 1.16)
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (>= 1.3.3)
|
||||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
@@ -96,7 +96,7 @@ GEM
|
||||
capybara-screenshot (1.0.17)
|
||||
capybara (>= 1.0, < 3)
|
||||
launchy
|
||||
childprocess (0.7.1)
|
||||
childprocess (0.8.0)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.2.0)
|
||||
cliver (0.3.2)
|
||||
@@ -106,7 +106,7 @@ GEM
|
||||
simplecov (<= 0.13)
|
||||
codemirror-rails (5.16.0)
|
||||
railties (>= 3.0, < 6.0)
|
||||
coderay (1.1.1)
|
||||
coderay (1.1.2)
|
||||
coffee-rails (4.2.2)
|
||||
coffee-script (>= 2.2.0)
|
||||
railties (>= 4.0.0)
|
||||
@@ -137,6 +137,7 @@ GEM
|
||||
term-ansicolor (~> 1.3)
|
||||
thor (~> 0.19.1)
|
||||
tins (~> 1.6)
|
||||
crass (1.0.2)
|
||||
csv_shaper (1.3.0)
|
||||
activesupport (>= 3.0.0)
|
||||
d3-rails (3.5.17)
|
||||
@@ -170,9 +171,9 @@ GEM
|
||||
faraday
|
||||
multi_json
|
||||
erubis (2.7.0)
|
||||
excon (0.57.1)
|
||||
excon (0.59.0)
|
||||
execjs (2.7.0)
|
||||
factory_girl (4.8.0)
|
||||
factory_girl (4.8.1)
|
||||
activesupport (>= 3.0.0)
|
||||
factory_girl_rails (4.8.0)
|
||||
factory_girl (~> 4.8.0)
|
||||
@@ -186,7 +187,7 @@ GEM
|
||||
font-awesome-sass (4.7.0)
|
||||
sass (>= 3.2)
|
||||
formatador (0.2.5)
|
||||
friendly_id (5.2.1)
|
||||
friendly_id (5.2.3)
|
||||
activerecord (>= 4.0.0)
|
||||
geocoder (1.4.4)
|
||||
gibbon (1.2.1)
|
||||
@@ -211,7 +212,7 @@ GEM
|
||||
guard (~> 2.1)
|
||||
guard-compat (~> 1.1)
|
||||
rspec (>= 2.99.0, < 4.0)
|
||||
haml (5.0.1)
|
||||
haml (5.0.4)
|
||||
temple (>= 0.8.0)
|
||||
tilt
|
||||
haml-i18n-extractor (0.5.9)
|
||||
@@ -233,9 +234,11 @@ GEM
|
||||
rubocop (>= 0.47.0)
|
||||
sysexits (~> 1.1)
|
||||
hashie (3.5.6)
|
||||
heroku-api (0.4.2)
|
||||
excon (~> 0.45)
|
||||
multi_json (~> 1.8)
|
||||
heroics (0.0.24)
|
||||
erubis (~> 2.0)
|
||||
excon
|
||||
moneta
|
||||
multi_json (>= 1.9.2)
|
||||
highline (1.7.8)
|
||||
html2haml (2.2.0)
|
||||
erubis (~> 2.7.0)
|
||||
@@ -244,7 +247,8 @@ GEM
|
||||
ruby_parser (~> 3.5)
|
||||
httparty (0.15.6)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.8.6)
|
||||
i18n (0.9.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
i18n-tasks (0.9.12)
|
||||
activesupport (>= 4.0.2)
|
||||
ast (>= 2.1.0)
|
||||
@@ -255,37 +259,37 @@ GEM
|
||||
parser (>= 2.2.3.0)
|
||||
term-ansicolor (>= 1.3.2)
|
||||
terminal-table (>= 1.5.1)
|
||||
jasmine (2.6.0)
|
||||
jasmine-core (>= 2.6.0, < 3.0.0)
|
||||
jasmine (2.8.0)
|
||||
jasmine-core (>= 2.8.0, < 3.0.0)
|
||||
phantomjs
|
||||
rack (>= 1.2.1)
|
||||
rake
|
||||
jasmine-core (2.6.4)
|
||||
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.3)
|
||||
js-routes (1.4.1)
|
||||
railties (>= 3.2)
|
||||
sprockets-rails
|
||||
json (2.1.0)
|
||||
jwt (1.5.6)
|
||||
kaminari (1.0.1)
|
||||
kaminari (1.1.1)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.0.1)
|
||||
kaminari-activerecord (= 1.0.1)
|
||||
kaminari-core (= 1.0.1)
|
||||
kaminari-actionview (1.0.1)
|
||||
kaminari-actionview (= 1.1.1)
|
||||
kaminari-activerecord (= 1.1.1)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-actionview (1.1.1)
|
||||
actionview
|
||||
kaminari-core (= 1.0.1)
|
||||
kaminari-activerecord (1.0.1)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-activerecord (1.1.1)
|
||||
activerecord
|
||||
kaminari-core (= 1.0.1)
|
||||
kaminari-core (1.0.1)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-core (1.1.1)
|
||||
kgio (2.11.0)
|
||||
kramdown (1.14.0)
|
||||
kramdown (1.15.0)
|
||||
launchy (2.4.3)
|
||||
addressable (~> 2.3)
|
||||
leaflet-markercluster-rails (0.7.0)
|
||||
@@ -297,26 +301,29 @@ 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.12)
|
||||
mail (2.6.6)
|
||||
mime-types (>= 1.16, < 4)
|
||||
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.2.0)
|
||||
mini_mime (0.1.4)
|
||||
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 (4.3.0.335)
|
||||
nokogiri (1.8.0)
|
||||
mini_portile2 (~> 2.2.0)
|
||||
newrelic_rpm (4.5.0.337)
|
||||
nokogiri (1.8.1)
|
||||
mini_portile2 (~> 2.3.0)
|
||||
notiffany (0.1.1)
|
||||
nenv (~> 0.1)
|
||||
shellany (~> 0.0)
|
||||
@@ -327,7 +334,7 @@ GEM
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
omniauth (1.6.1)
|
||||
omniauth (1.7.1)
|
||||
hashie (>= 3.4.6, < 3.6.0)
|
||||
rack (>= 1.6.2, < 3)
|
||||
omniauth-facebook (4.0.0)
|
||||
@@ -355,18 +362,20 @@ GEM
|
||||
ast (~> 2.2)
|
||||
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.15.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.2)
|
||||
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.0)
|
||||
quiet_assets (1.1.0)
|
||||
railties (>= 3.1, < 5.0)
|
||||
rack (1.6.8)
|
||||
@@ -374,16 +383,16 @@ GEM
|
||||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.2.9)
|
||||
actionmailer (= 4.2.9)
|
||||
actionpack (= 4.2.9)
|
||||
actionview (= 4.2.9)
|
||||
activejob (= 4.2.9)
|
||||
activemodel (= 4.2.9)
|
||||
activerecord (= 4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
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.9)
|
||||
railties (= 4.2.10)
|
||||
sprockets-rails
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
@@ -401,59 +410,59 @@ GEM
|
||||
rails_stdout_logging
|
||||
rails_serve_static_assets (0.0.5)
|
||||
rails_stdout_logging (0.0.5)
|
||||
railties (4.2.9)
|
||||
actionpack (= 4.2.9)
|
||||
activesupport (= 4.2.9)
|
||||
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.18.0)
|
||||
rake (12.0.0)
|
||||
raindrops (0.19.0)
|
||||
rake (12.1.0)
|
||||
rb-fsevent (0.10.2)
|
||||
rb-inotify (0.9.10)
|
||||
ffi (>= 0.5.0, < 2)
|
||||
redis (3.3.3)
|
||||
redis (4.0.1)
|
||||
responders (2.4.0)
|
||||
actionpack (>= 4.2.0, < 5.3)
|
||||
railties (>= 4.2.0, < 5.3)
|
||||
rspec (3.6.0)
|
||||
rspec-core (~> 3.6.0)
|
||||
rspec-expectations (~> 3.6.0)
|
||||
rspec-mocks (~> 3.6.0)
|
||||
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.6.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-expectations (3.6.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.6.0)
|
||||
rspec-mocks (3.6.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-mocks (3.7.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-rails (3.6.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-rails (3.7.1)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
rspec-core (~> 3.6.0)
|
||||
rspec-expectations (~> 3.6.0)
|
||||
rspec-mocks (~> 3.6.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-support (3.6.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.1.0)
|
||||
ruby-progressbar (1.9.0)
|
||||
ruby-units (2.2.0)
|
||||
ruby_dep (1.5.0)
|
||||
ruby_parser (3.10.1)
|
||||
sexp_processor (~> 4.9)
|
||||
rubyzip (1.2.1)
|
||||
sass (3.5.1)
|
||||
sass (3.5.2)
|
||||
sass-listen (~> 4.0.0)
|
||||
sass-listen (4.0.0)
|
||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||
@@ -464,28 +473,27 @@ GEM
|
||||
sprockets (>= 2.8, < 4.0)
|
||||
sprockets-rails (>= 2.0, < 4.0)
|
||||
tilt (>= 1.1, < 3)
|
||||
selenium-webdriver (3.4.4)
|
||||
selenium-webdriver (3.6.0)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.0)
|
||||
sexp_processor (4.10.0)
|
||||
shellany (0.0.1)
|
||||
sidekiq (5.0.4)
|
||||
sidekiq (5.0.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
connection_pool (~> 2.2, >= 2.2.0)
|
||||
rack-protection (>= 1.5.0)
|
||||
redis (~> 3.3, >= 3.3.3)
|
||||
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.1)
|
||||
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)
|
||||
@@ -507,7 +515,7 @@ GEM
|
||||
uglifier (3.2.0)
|
||||
execjs (>= 0.3.0, < 3)
|
||||
unicode-display_width (1.3.0)
|
||||
unicorn (5.3.0)
|
||||
unicorn (5.3.1)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
uniform_notifier (1.10.0)
|
||||
@@ -517,10 +525,11 @@ GEM
|
||||
nokogiri (>= 1.2.0)
|
||||
rack (>= 1.0)
|
||||
rack-test (>= 0.5.3)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-driver (0.7.0)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.2)
|
||||
will_paginate (3.1.6)
|
||||
xmlrpc (0.3.0)
|
||||
xpath (2.1.0)
|
||||
nokogiri (~> 1.3)
|
||||
|
||||
@@ -532,7 +541,7 @@ DEPENDENCIES
|
||||
active_utils
|
||||
activemerchant
|
||||
acts_as_paranoid (~> 0.5.0)
|
||||
better_errors
|
||||
better_errors (~> 2.2.0)
|
||||
binding_of_caller
|
||||
bluecloth
|
||||
bonsai-elasticsearch-rails
|
||||
@@ -573,7 +582,6 @@ DEPENDENCIES
|
||||
haml-rails
|
||||
haml_lint
|
||||
hashie (>= 3.5.3)
|
||||
heroku-api
|
||||
i18n-tasks
|
||||
jasmine
|
||||
jquery-rails
|
||||
@@ -590,6 +598,7 @@ DEPENDENCIES
|
||||
omniauth-flickr (>= 0.0.15)
|
||||
omniauth-twitter
|
||||
pg
|
||||
platform-api
|
||||
poltergeist
|
||||
pry
|
||||
quiet_assets
|
||||
@@ -611,10 +620,11 @@ DEPENDENCIES
|
||||
unicorn
|
||||
webrat
|
||||
will_paginate
|
||||
xmlrpc
|
||||
|
||||
|
||||
RUBY VERSION
|
||||
ruby 2.3.4p301
|
||||
ruby 2.4.1p111
|
||||
|
||||
BUNDLED WITH
|
||||
1.15.1
|
||||
1.15.4
|
||||
|
||||
@@ -337,3 +337,11 @@ ul.plantings
|
||||
ul.thumbnail-buttons
|
||||
list-style-type: none
|
||||
text-align: right
|
||||
|
||||
|
||||
.hover-wrapper .text
|
||||
position: absolute
|
||||
visibility: hidden
|
||||
|
||||
.hover-wrapper:hover .text
|
||||
visibility: visible
|
||||
|
||||
@@ -31,9 +31,11 @@ class NotificationsController < ApplicationController
|
||||
@sender_notification.read = true
|
||||
@sender_notification.save
|
||||
@recipient = @sender_notification.sender
|
||||
@subject = @sender_notification.subject =~ /^Re: / ?
|
||||
@sender_notification.subject :
|
||||
"Re: " + @sender_notification.subject
|
||||
@subject = if @sender_notification.subject.start_with? 'Re: '
|
||||
@sender_notification.subject
|
||||
else
|
||||
"Re: #{@sender_notification.subject}"
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE /notifications/1
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ class PlantingsController < ApplicationController
|
||||
|
||||
def destroy
|
||||
@planting.destroy
|
||||
respond_with @planting, location: garden
|
||||
respond_with @planting, location: @planting.garden
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -39,7 +39,7 @@ class Crop < ActiveRecord::Base
|
||||
scope :approved, -> { where(approval_status: "approved") }
|
||||
scope :rejected, -> { where(approval_status: "rejected") }
|
||||
|
||||
scope :interesting, -> { approved.has_photos }
|
||||
scope :interesting, -> { approved.has_photos.randomized }
|
||||
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
|
||||
|
||||
## Wikipedia urls are only necessary when approving a crop
|
||||
|
||||
@@ -17,7 +17,7 @@ class PlantingPredictions
|
||||
def percentage_grown
|
||||
return nil unless @planting.days_before_maturity && @planting.planted?
|
||||
|
||||
days = (Date.current - @planting.planted_at.to_date).to_i
|
||||
days = (Date.current - @planting.planted_at.to_date).to_f
|
||||
|
||||
return 0 if Date.current < @planting.planted_at
|
||||
return 100 if days > @planting.days_before_maturity
|
||||
|
||||
23
app/views/gardens/_actions.html.haml
Normal file
23
app/views/gardens/_actions.html.haml
Normal file
@@ -0,0 +1,23 @@
|
||||
- if can?(:edit, garden) || can?(:delete, garden)
|
||||
- if can? :edit, garden
|
||||
- if garden.active
|
||||
= link_to new_planting_path(garden_id: garden.id), class: 'btn btn-primary' do
|
||||
%span.glyphicon.glyphicon-grain{ title: "Plant" }
|
||||
Plant something
|
||||
= link_to "Mark as inactive", garden_path(garden, garden: { active: 0 }),
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
|
||||
- else
|
||||
= link_to "Mark as active", garden_path(garden, garden: { active: 1 }),
|
||||
method: :put,
|
||||
class: 'btn btn-default'
|
||||
= link_to edit_garden_path(garden), class: 'btn btn-default', id: 'edit_garden_link' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
Edit
|
||||
- if can?(:destroy, garden)
|
||||
= link_to garden,
|
||||
method: :delete,
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
|
||||
class: 'btn btn-default', id: 'delete_garden_link' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
Delete
|
||||
25
app/views/gardens/_overview.html.haml
Normal file
25
app/views/gardens/_overview.html.haml
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
.panel.panel-success
|
||||
.panel-heading
|
||||
%h3.panel-title
|
||||
= link_to garden.name, garden_path(garden)
|
||||
|
||||
.panel-body
|
||||
.row
|
||||
.col-md-2.col-xs-12.garden-info
|
||||
.row
|
||||
.col-md-12.col-xs-6
|
||||
= render 'gardens/photo', garden: garden
|
||||
.col-md-12.col-xs-6
|
||||
= render 'gardens/actions', garden: garden
|
||||
.col-md-10
|
||||
.row
|
||||
- if garden.plantings.current.size.positive?
|
||||
- garden.plantings.current.includes(:crop).each do |planting|
|
||||
.col-md-2.col-sm-6.col-xs-6
|
||||
.hover-wrapper
|
||||
.text= render 'plantings/actions', planting: planting
|
||||
= render partial: "plantings/thumbnail", locals: { planting: planting }
|
||||
- else
|
||||
no plantings
|
||||
-# .panel-footer
|
||||
3
app/views/gardens/_photo.html.haml
Normal file
3
app/views/gardens/_photo.html.haml
Normal file
@@ -0,0 +1,3 @@
|
||||
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: garden.name, class: 'img-responsive'),
|
||||
garden_path(garden)
|
||||
@@ -6,15 +6,13 @@
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
.row
|
||||
- if @gardens.empty?
|
||||
%p There are no gardens to display.
|
||||
- else
|
||||
- @gardens.each do |garden|
|
||||
.col-md-6
|
||||
= render partial: 'gardens/thumbnail', locals: { garden: garden }
|
||||
|
||||
- if @gardens.empty?
|
||||
%p There are no gardens to display.
|
||||
- else
|
||||
- @gardens.each do |garden|
|
||||
= render 'overview', garden: garden
|
||||
|
||||
.pagination
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
|
||||
@@ -11,28 +11,7 @@
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
.row
|
||||
.col-md-9
|
||||
- if can?(:edit, @garden) || can?(:delete, @garden)
|
||||
%p.btn-group
|
||||
- if can? :edit, @garden
|
||||
- if @garden.active
|
||||
= link_to new_planting_path(garden_id: @garden.id), class: 'btn btn-primary' do
|
||||
%span.glyphicon.glyphicon-grain{ title: "Plant" }
|
||||
Plant something
|
||||
= link_to "Mark as inactive", garden_path(@garden, garden: { active: 0 }),
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
|
||||
- else
|
||||
= link_to "Mark as active", garden_path(@garden, garden: { active: 1 }),
|
||||
method: :put,
|
||||
class: 'btn btn-default'
|
||||
= link_to edit_garden_path(@garden), class: 'btn btn-default', id: 'edit_garden_link' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
- if can?(:destroy, @garden)
|
||||
= link_to @garden,
|
||||
method: :delete,
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
|
||||
class: 'btn btn-default', id: 'delete_garden_link' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
%p.btn-group= render 'gardens/actions', garden: @garden
|
||||
|
||||
- unless @garden.active
|
||||
.alert.alert-warning
|
||||
@@ -119,4 +98,4 @@
|
||||
.row
|
||||
- @garden.photos.includes(:owner).each do |photo|
|
||||
.col-xs-6
|
||||
= render partial: 'photos/thumbnail', locals: { photo: photo }
|
||||
= render partial: 'photos/thumbnail', locals: { photo: photo }
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
.col-md-4
|
||||
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: harvest.crop.name, class: 'img'),
|
||||
harvest.crop
|
||||
harvest
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Crop :
|
||||
|
||||
@@ -15,10 +15,13 @@
|
||||
- if can? :read, n
|
||||
%tr
|
||||
%td
|
||||
- if n.read
|
||||
= link_to n.sender, member_path(n.sender)
|
||||
- if n.sender.present?
|
||||
- if n.read
|
||||
= link_to n.sender, member_path(n.sender)
|
||||
- else
|
||||
%strong= link_to n.sender, member_path(n.sender)
|
||||
- else
|
||||
%strong= link_to n.sender, member_path(n.sender)
|
||||
*deleted member*
|
||||
%td
|
||||
- if n.read
|
||||
= link_to n.subject, notification_path(n)
|
||||
|
||||
16
app/views/plantings/_actions.html.haml
Normal file
16
app/views/plantings/_actions.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
- if can?(:edit, planting) || can?(:destroy, planting)
|
||||
- if can? :edit, planting
|
||||
= link_to edit_planting_path(planting), class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
Edit
|
||||
- if can? :destroy, planting
|
||||
= link_to planting, method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
Delete
|
||||
- unless planting.finished
|
||||
= link_to "Mark as finished", planting_path(planting, planting: { finished: 1 }),
|
||||
method: :put, class: 'btn btn-default btn-xs append-date'
|
||||
- if can? :create, Harvest
|
||||
= link_to 'Harvest', new_planting_harvest_path(planting), class: 'btn btn-default btn-xs'
|
||||
@@ -16,7 +16,7 @@
|
||||
%dt Owner:
|
||||
%dd= link_to planting.owner.login_name, planting.owner
|
||||
%dt Garden:
|
||||
%dd= link_to planting.garden.name, planting.garden
|
||||
%dd= link_to planting.garden&.name, planting.garden
|
||||
%dt Planted on:
|
||||
%dd= planting.planted_at
|
||||
- if planting.quantity
|
||||
@@ -38,7 +38,7 @@
|
||||
= display_days_before_maturity(planting)
|
||||
days
|
||||
|
||||
%p= render partial: 'plantings/planting_progress', locals: { planting: planting }
|
||||
%p= render 'plantings/progress', planting: planting, show_explanation: true
|
||||
|
||||
= link_to 'Details', planting_path(planting),
|
||||
class: 'btn btn-default btn-xs'
|
||||
@@ -58,4 +58,3 @@
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
- if !planting.planted?
|
||||
Progress: 0% - not planted yet
|
||||
- elsif planting.finished?
|
||||
Progress: 100%
|
||||
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "100%" }
|
||||
- elsif planting.days_before_maturity.nil?
|
||||
Progress: Not calculated, days before maturity unknown
|
||||
- else
|
||||
Progress: #{planting.percentage_grown}%
|
||||
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "#{planting.percentage_grown}%" }
|
||||
19
app/views/plantings/_progress.html.haml
Normal file
19
app/views/plantings/_progress.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
- if !planting.planted?
|
||||
- if show_explanation == true
|
||||
Progress: 0% - not planted yet
|
||||
= render "plantings/progress_bar", status: "not planted", progress: 0
|
||||
|
||||
- elsif planting.finished?
|
||||
- if show_explanation == true
|
||||
Progress: 100%
|
||||
= render "plantings/progress_bar", status: 'finished', progress: 100
|
||||
|
||||
- elsif planting.days_before_maturity.nil?
|
||||
- if show_explanation == true
|
||||
Progress: Not calculated, days before maturity unknown
|
||||
= render "plantings/progress_bar", status: "unknown", progress: nil
|
||||
|
||||
- else
|
||||
- if show_explanation == true
|
||||
Progress: #{planting.percentage_grown}%
|
||||
= render "plantings/progress_bar", status: 'growing', progress: planting.percentage_grown
|
||||
@@ -1,3 +1,11 @@
|
||||
.progress
|
||||
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}" }
|
||||
|
||||
- if progress.nil?
|
||||
= status
|
||||
- else
|
||||
-# haml-lint:disable InlineStyles
|
||||
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}%" }
|
||||
- if progress >= 30
|
||||
#{progress}%
|
||||
- if progress < 30
|
||||
#{progress}%
|
||||
-# haml-lint:enable InlineStyles
|
||||
|
||||
@@ -6,6 +6,5 @@
|
||||
planting
|
||||
.plantinginfo
|
||||
.planting-name
|
||||
= render 'plantings/progress', planting: planting, show_explanation: false
|
||||
= link_to planting.crop.name, planting
|
||||
%small.planting-date
|
||||
= display_finished(planting)
|
||||
|
||||
@@ -48,22 +48,10 @@
|
||||
%dt Finished:
|
||||
%dd= display_finished(@planting)
|
||||
|
||||
%p= render 'plantings/planting_harvest', planting: @planting
|
||||
%p= render 'planting_progress', planting: @planting
|
||||
%p= render 'plantings/harvests', planting: @planting
|
||||
%p= render 'plantings/progress', planting: @planting, show_explanation: true
|
||||
|
||||
- if can?(:edit, @planting) || can?(:destroy, @planting)
|
||||
%p
|
||||
- if can? :edit, @planting
|
||||
= link_to 'Edit', edit_planting_path(@planting), class: 'btn btn-default btn-xs'
|
||||
- unless @planting.finished
|
||||
= link_to "Mark as finished", planting_path(@planting, planting: { finished: 1 }),
|
||||
method: :put, class: 'btn btn-default btn-xs append-date'
|
||||
- if can? :create, Harvest
|
||||
= link_to 'Harvest', new_planting_harvest_path(@planting), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, @planting
|
||||
= link_to 'Delete', @planting, method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
= render 'plantings/actions', planting: @planting
|
||||
|
||||
.col-md-6
|
||||
= render partial: "crops/index_card", locals: { crop: @planting.crop }
|
||||
|
||||
@@ -1,56 +1,70 @@
|
||||
require 'bluecloth'
|
||||
|
||||
module Haml::Filters
|
||||
module Haml::Filters # rubocop:disable Style/ClassAndModuleChildren
|
||||
module GrowstuffMarkdown
|
||||
include Haml::Filters::Base
|
||||
|
||||
def render(text)
|
||||
@expanded = text
|
||||
expand_crops!
|
||||
expand_members!
|
||||
BlueCloth.new(@expanded).to_html
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
CROP_REGEX = /(?<!\\)\[([^\[\]]+?)\]\(crop\)/
|
||||
MEMBER_REGEX = /(?<!\\)\[([^\[\]]+?)\]\(member\)/
|
||||
MEMBER_AT_REGEX = /(?<!\\)(\@\w+)/
|
||||
MEMBER_ESCAPE_AT_REGEX = /(?<!\\)\\(?=\@\w+)/
|
||||
include Haml::Filters::Base
|
||||
HOST = Growstuff::Application.config.host
|
||||
|
||||
def render(text)
|
||||
def expand_crops!
|
||||
# turn [tomato](crop) into [tomato](http://growstuff.org/crops/tomato)
|
||||
expanded = text.gsub(CROP_REGEX) do |m|
|
||||
crop_str = $1
|
||||
@expanded = @expanded.gsub(CROP_REGEX) do
|
||||
crop_str = Regexp.last_match(1)
|
||||
# find crop case-insensitively
|
||||
crop = Crop.where('lower(name) = ?', crop_str.downcase).first
|
||||
if crop
|
||||
url = Rails.application.routes.url_helpers.crop_url(crop, host: Growstuff::Application.config.host)
|
||||
"[#{crop_str}](#{url})"
|
||||
else
|
||||
crop_str
|
||||
end
|
||||
crop_link crop, crop_str
|
||||
end
|
||||
end
|
||||
|
||||
def expand_members!
|
||||
# turn [jane](member) into [jane](http://growstuff.org/members/jane)
|
||||
expanded = expanded.gsub(MEMBER_REGEX) do |m|
|
||||
member_str = $1
|
||||
# find member case-insensitively
|
||||
member = Member.case_insensitive_login_name(member_str).first
|
||||
if member
|
||||
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
|
||||
"[#{member_str}](#{url})"
|
||||
else
|
||||
member_str
|
||||
end
|
||||
end
|
||||
|
||||
# turn @jane into [@jane](http://growstuff.org/members/jane)
|
||||
expanded = expanded.gsub(MEMBER_AT_REGEX) do |m|
|
||||
member_str = $1
|
||||
# find member case-insensitively
|
||||
member = Member.case_insensitive_login_name(member_str[1..-1]).first
|
||||
if member
|
||||
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
|
||||
"[#{member_str}](#{url})"
|
||||
else
|
||||
member_str
|
||||
[MEMBER_REGEX, MEMBER_AT_REGEX].each do |re|
|
||||
@expanded = @expanded.gsub(re) do
|
||||
member_str = Regexp.last_match(1)
|
||||
member = find_member(member_str)
|
||||
member_link(member, member_str)
|
||||
end
|
||||
end
|
||||
|
||||
expanded = expanded.gsub(MEMBER_ESCAPE_AT_REGEX, "")
|
||||
@expanded = @expanded.gsub(MEMBER_ESCAPE_AT_REGEX, '')
|
||||
end
|
||||
|
||||
BlueCloth.new(expanded).to_html
|
||||
def member_link(member, link_text)
|
||||
if member
|
||||
url = Rails.application.routes.url_helpers.member_url(member, only_path: true)
|
||||
"[#{link_text}](#{url})"
|
||||
else
|
||||
link_text
|
||||
end
|
||||
end
|
||||
|
||||
def crop_link(crop, link_text)
|
||||
if crop
|
||||
url = Rails.application.routes.url_helpers.crop_url(crop, host: HOST)
|
||||
"[#{link_text}](#{url})"
|
||||
else
|
||||
link_text
|
||||
end
|
||||
end
|
||||
|
||||
def find_member(login_name)
|
||||
# Remove @ if present
|
||||
login_name = login_name[1..-1] if login_name.start_with?('@')
|
||||
Member.case_insensitive_login_name(login_name).first
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
"coffeelint": "^1.16.0",
|
||||
"csslint": "^1.0.5",
|
||||
"eslint": "^3.17.1",
|
||||
"git-guilt": "^0.1.1",
|
||||
"jshint": "^2.9.4"
|
||||
},
|
||||
"repository": {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'heroku-api'
|
||||
require 'platform-api'
|
||||
require 'yaml'
|
||||
|
||||
heroku = Heroku::API.new(api_key: ENV['HEROKU_API_KEY'])
|
||||
heroku = PlatformAPI.connect(ENV['HEROKU_API_KEY'])
|
||||
branch = ENV['TRAVIS_BRANCH']
|
||||
travis_config = YAML.load_file('.travis.yml')
|
||||
if travis_config['deploy']['app'].key? branch
|
||||
@@ -14,12 +14,12 @@ end
|
||||
|
||||
case ARGV[0]
|
||||
when "on"
|
||||
maintenance_state = 1
|
||||
maintenance_state = true
|
||||
when "off"
|
||||
maintenance_state = 0
|
||||
maintenance_state = false
|
||||
else
|
||||
abort "usage: #{$0} (on|off)"
|
||||
end
|
||||
|
||||
puts "Turning #{maintenance_state} maintenance mode on app #{app}"
|
||||
heroku.post_app_maintenance(app, maintenance_state)
|
||||
heroku.app.update app, maintenance: maintenance_state
|
||||
|
||||
@@ -24,7 +24,7 @@ describe Admin::OrdersController do
|
||||
|
||||
it "sets an error message if nothing found" do
|
||||
get :search, search_by: 'order_id', search_text: 'foo'
|
||||
flash[:alert].should match /Couldn't find order with/
|
||||
flash[:alert].should have_text "Couldn't find order with"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,7 +39,7 @@ describe OrdersController do
|
||||
order = Order.create!(member_id: member.id)
|
||||
get :checkout, id: order.to_param
|
||||
response.status.should eq 302
|
||||
response.redirect_url.should match /paypal\.com/
|
||||
response.redirect_url.should match(/paypal\.com/)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -21,6 +21,6 @@ feature "cms admin" do
|
||||
scenario "admin members can view CMS admin area" do
|
||||
login_as admin_member
|
||||
visit comfy_admin_cms_path
|
||||
expect(current_path).to match /#{comfy_admin_cms_path}/ # match any CMS admin page
|
||||
expect(current_path).to match(/#{comfy_admin_cms_path}/) # match any CMS admin page
|
||||
end
|
||||
end
|
||||
|
||||
@@ -58,7 +58,7 @@ feature "Planting a crop", js: true do
|
||||
end
|
||||
|
||||
scenario "button on index to edit garden" do
|
||||
first(".panel-title").click_link("edit_garden_glyphicon")
|
||||
first(".garden-info").click_link("Edit")
|
||||
expect(page).to have_content 'Edit garden'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,6 +17,6 @@ describe 'Haml::Filters::Escaped_Markdown' do
|
||||
it 'converts quick crop links' do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::EscapedMarkdown.render("[#{@crop.name}](crop)")
|
||||
rendered.should match /<a href="/
|
||||
rendered.should match(/<a href="/)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -31,18 +31,18 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
it 'converts quick crop links' do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link(@crop.name))
|
||||
rendered.should match /#{output_link(@crop)}/
|
||||
expect(rendered).to match(/#{output_link(@crop)}/)
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent crops" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link("not a crop"))
|
||||
rendered.should match /not a crop/
|
||||
expect(rendered).to match(/not a crop/)
|
||||
end
|
||||
|
||||
it "doesn't convert escaped crop links" do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_link(@crop.name))
|
||||
rendered.should match /\[#{@crop.name}\]\(crop\)/
|
||||
expect(rendered).to match(/\[#{@crop.name}\]\(crop\)/)
|
||||
end
|
||||
|
||||
it "handles multiple crop links" do
|
||||
@@ -50,55 +50,55 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
maize = FactoryGirl.create(:maize)
|
||||
string = "#{input_link(tomato)} #{input_link(maize)}"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /#{output_link(tomato)} #{output_link(maize)}/
|
||||
expect(rendered).to match(/#{output_link(tomato)} #{output_link(maize)}/)
|
||||
end
|
||||
|
||||
it "converts normal markdown" do
|
||||
string = "**foo**"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /<strong>foo<\/strong>/
|
||||
expect(rendered).to match(/<strong>foo<\/strong>/)
|
||||
end
|
||||
|
||||
it "finds crops case insensitively" do
|
||||
@crop = FactoryGirl.create(:crop, name: 'tomato')
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link('ToMaTo'))
|
||||
rendered.should match /#{output_link(@crop, 'ToMaTo')}/
|
||||
expect(rendered).to match(/#{output_link(@crop, 'ToMaTo')}/)
|
||||
end
|
||||
|
||||
it "fixes PT bug #78615258 (Markdown rendering bug with URLs and crops in same text)" do
|
||||
tomato = FactoryGirl.create(:tomato)
|
||||
string = "[test](http://example.com) [tomato](crop)"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /#{output_link(tomato)}/
|
||||
rendered.should match "<a href=\"http://example.com\">test</a>"
|
||||
expect(rendered).to match(/#{output_link(tomato)}/)
|
||||
expect(rendered).to match "<a href=\"http://example.com\">test</a>"
|
||||
end
|
||||
|
||||
it 'converts quick member links' do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link(@member.login_name))
|
||||
rendered.should match /#{output_member_link(@member)}/
|
||||
expect(rendered).to match(/#{output_member_link(@member)}/)
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent members" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link("not a member"))
|
||||
rendered.should match /not a member/
|
||||
expect(rendered).to include('not a member')
|
||||
end
|
||||
|
||||
it "doesn't convert escaped members" do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_member_link(@member.login_name))
|
||||
rendered.should match /\[#{@member.login_name}\]\(member\)/
|
||||
expect(rendered).to match(/\[#{@member.login_name}\]\(member\)/)
|
||||
end
|
||||
|
||||
it 'converts @ member links' do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member.login_name}! What's up")
|
||||
rendered.should match /#{output_member_link(@member, "@#{@member.login_name}")}/
|
||||
expect(rendered).to match(/#{output_member_link(@member, "@#{@member.login_name}")}/)
|
||||
end
|
||||
|
||||
it "doesn't convert invalid @ members" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("@not-a-member")
|
||||
rendered.should match /@not-a-member/
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("@notamember")
|
||||
expect(rendered).to include('@notamember')
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent @ members" do
|
||||
@@ -106,12 +106,12 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
@member_name = @member.login_name
|
||||
@member.destroy
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member_name}")
|
||||
rendered.should match /Hey @#{@member_name}/
|
||||
expect(rendered).to include("Hey @#{@member_name}")
|
||||
end
|
||||
|
||||
it "doesn't convert escaped @ members" do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey \\@#{@member.login_name}! What's up")
|
||||
rendered.should match /Hey @#{@member.login_name}!/
|
||||
expect(rendered).to include("Hey @#{@member.login_name}!")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ describe Comment do
|
||||
@n = Notification.first
|
||||
@n.sender.should eq @c.author
|
||||
@n.recipient.should eq @c.post.author
|
||||
@n.subject.should match /commented on/
|
||||
@n.subject.should include 'commented on'
|
||||
@n.body.should eq @c.body
|
||||
@n.post.should eq @c.post
|
||||
end
|
||||
|
||||
@@ -65,7 +65,7 @@ describe Planting do
|
||||
end
|
||||
|
||||
it "should have a slug" do
|
||||
planting.slug.should match /^member\d+-springfield-community-garden-tomato$/
|
||||
planting.slug.should match(/^member\d+-springfield-community-garden-tomato$/)
|
||||
end
|
||||
|
||||
it 'should sort in reverse creation order' do
|
||||
|
||||
@@ -1,41 +1,28 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "members/_location" do
|
||||
context "member with location" do
|
||||
before(:each) do
|
||||
@member = FactoryGirl.create(:london_member)
|
||||
render partial: 'members/location', locals: { member: @member }
|
||||
end
|
||||
let(:member) { FactoryGirl.create(:london_member) }
|
||||
|
||||
before(:each) { render partial: 'members/location', locals: { member: member } }
|
||||
|
||||
it 'shows location if available' do
|
||||
rendered.should have_content @member.location
|
||||
expect(rendered).to have_content member.location
|
||||
end
|
||||
|
||||
it "links to the places page" do
|
||||
assert_select "a", href: place_path(@member.location)
|
||||
assert_select "a", href: place_path(member.location)
|
||||
end
|
||||
end
|
||||
|
||||
context "member with no location" do
|
||||
before(:each) do
|
||||
@member = FactoryGirl.create(:member)
|
||||
render partial: 'members/location', locals: { member: @member }
|
||||
member = FactoryGirl.create(:member)
|
||||
render partial: 'members/location', locals: { member: member }
|
||||
end
|
||||
|
||||
it 'shows unknown location' do
|
||||
rendered.should have_content "unknown location"
|
||||
expect(rendered).to have_content "unknown location"
|
||||
end
|
||||
|
||||
it "doesn't link anywhere" do
|
||||
|
||||
@@ -1,26 +1,14 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "members/index" do
|
||||
let(:member) { FactoryGirl.create(:london_member) }
|
||||
before(:each) do
|
||||
controller.stub(:current_user) { nil }
|
||||
page = 1
|
||||
per_page = 2
|
||||
total_entries = 2
|
||||
@member = FactoryGirl.create(:london_member)
|
||||
members = WillPaginate::Collection.create(page, per_page, total_entries) do |pager|
|
||||
pager.replace([@member, @member])
|
||||
pager.replace([member, member])
|
||||
end
|
||||
assign(:members, members)
|
||||
render
|
||||
@@ -31,6 +19,6 @@ describe "members/index" do
|
||||
end
|
||||
|
||||
it 'contains member locations' do
|
||||
rendered.should have_content @member.location
|
||||
expect(rendered).to have_content member.location
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'members/show.rss.haml', type: "view" do
|
||||
@@ -21,21 +9,23 @@ describe 'members/show.rss.haml', type: "view" do
|
||||
render
|
||||
end
|
||||
|
||||
subject { rendered }
|
||||
|
||||
it 'shows RSS feed title' do
|
||||
rendered.should have_content /member\d+'s recent posts/
|
||||
is_expected.to match(/member\d+'s recent posts/)
|
||||
end
|
||||
|
||||
it 'shows content of posts' do
|
||||
rendered.should have_content "This is some text."
|
||||
is_expected.to have_content "This is some text."
|
||||
end
|
||||
|
||||
it 'renders post bodies to HTML and XML-escapes them' do
|
||||
# The variable "rendered" has been entity-replaced and tag-stripped
|
||||
# The literal string output contains "<strong>" etc.
|
||||
rendered.should have_content "<strong>strong</strong>"
|
||||
is_expected.to have_content "<strong>strong</strong>"
|
||||
end
|
||||
|
||||
it 'gives the author in the item title' do
|
||||
rendered.should have_content "#{@post1.subject} by #{@post1.author}"
|
||||
is_expected.to have_content "#{@post1.subject} by #{@post1.author}"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,64 +1,58 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "posts/show" do
|
||||
let(:author) { FactoryGirl.create(:member) }
|
||||
|
||||
before(:each) do
|
||||
controller.stub(:current_user) { nil }
|
||||
@author = FactoryGirl.create(:member)
|
||||
assign(:post, post)
|
||||
end
|
||||
subject { rendered }
|
||||
|
||||
it "renders the post" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
render
|
||||
# show the name of the member who posted the post
|
||||
rendered.should match(/member\d+/)
|
||||
# Subject goes in title
|
||||
rendered.should match(/This is some text./)
|
||||
# shouldn't show the subject on a single post page
|
||||
# (it appears in the title/h1 via the layout, not via this view)
|
||||
rendered.should_not match(/An Update/)
|
||||
end
|
||||
describe 'render post' do
|
||||
before { render }
|
||||
describe "basic post" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
|
||||
it "should parse markdown into html" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:markdown_post, author: @author))
|
||||
render
|
||||
assert_select "strong", "strong"
|
||||
end
|
||||
# show the name of the member who posted the post
|
||||
it { is_expected.to match(/member\d+/) }
|
||||
# Subject goes in title
|
||||
it { is_expected.to have_text('This is some text.') }
|
||||
# shouldn't show the subject on a single post page
|
||||
# (it appears in the title/h1 via the layout, not via this view)
|
||||
it { is_expected.not_to have_text('An Update') }
|
||||
end
|
||||
|
||||
it "shouldn't let html through in body" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
render
|
||||
rendered.should match(/EVIL/)
|
||||
rendered.should_not match(/a href="http:\/\/evil.com"/)
|
||||
end
|
||||
describe "should parse markdown into html" do
|
||||
let(:post) { FactoryGirl.create(:markdown_post, author: author) }
|
||||
it { assert_select "strong", "strong" }
|
||||
end
|
||||
|
||||
it 'has an anchor to the comments' do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
render
|
||||
assert_select 'a[name=comments]'
|
||||
describe "shouldn't let html through in body" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, body: '<a href="http://evil.com">EVIL</a>') }
|
||||
it { is_expected.to have_content('EVIL') }
|
||||
it { is_expected.not_to have_link("http://evil.com") }
|
||||
end
|
||||
describe 'script tag in post body' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, body: "<script>alert('hakker!')</script>") }
|
||||
it { is_expected.not_to have_selector('script') }
|
||||
end
|
||||
describe 'script tag in post title' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, subject: "<script>alert('hakker!')</script>") }
|
||||
it { is_expected.not_to have_selector('script') }
|
||||
end
|
||||
|
||||
describe 'has an anchor to the comments' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
it { is_expected.to have_selector('a[name=comments]') }
|
||||
end
|
||||
end
|
||||
|
||||
context "when there is one comment" do
|
||||
let(:post) { FactoryGirl.create(:html_post, author: author) }
|
||||
let!(:comment) { FactoryGirl.create(:comment, post: post) }
|
||||
before(:each) do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
@comment = FactoryGirl.create(:comment, post: @post)
|
||||
@comments = @post.comments
|
||||
@comments = post.comments
|
||||
render
|
||||
end
|
||||
|
||||
@@ -67,7 +61,7 @@ describe "posts/show" do
|
||||
end
|
||||
|
||||
it "shows comments" do
|
||||
rendered.should have_content @comment.body
|
||||
is_expected.to have_content comment.body
|
||||
end
|
||||
|
||||
it 'has an anchor to the comments' do
|
||||
@@ -76,45 +70,42 @@ describe "posts/show" do
|
||||
end
|
||||
|
||||
context "when there is more than one comment" do
|
||||
let(:post) { FactoryGirl.create(:html_post, author: author) }
|
||||
before(:each) do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
@comment1 = FactoryGirl.create(:comment, post: @post, body: "F1rst!!!",
|
||||
@comment1 = FactoryGirl.create(:comment, post: post, body: "F1rst!!!",
|
||||
created_at: Date.new(2010, 5, 17))
|
||||
@comment3 = FactoryGirl.create(:comment, post: @post, body: "Th1rd!!!",
|
||||
@comment3 = FactoryGirl.create(:comment, post: post, body: "Th1rd!!!",
|
||||
created_at: Date.new(2012, 5, 17))
|
||||
@comment4 = FactoryGirl.create(:comment, post: @post, body: "F0urth!!!")
|
||||
@comment2 = FactoryGirl.create(:comment, post: @post, body: "S3c0nd!!1!",
|
||||
@comment4 = FactoryGirl.create(:comment, post: post, body: "F0urth!!!")
|
||||
@comment2 = FactoryGirl.create(:comment, post: post, body: "S3c0nd!!1!",
|
||||
created_at: Date.new(2011, 5, 17))
|
||||
@comments = @post.comments
|
||||
@comments = post.comments
|
||||
render
|
||||
end
|
||||
|
||||
it "shows the oldest comments first" do
|
||||
rendered.should have_content /#{@comment1.body}.*#{@comment2.body}.*#{@comment3.body}.*#{@comment4.body}/m
|
||||
is_expected.to have_content(/#{@comment1.body}.*#{@comment2.body}.*#{@comment3.body}.*#{@comment4.body}/m)
|
||||
end
|
||||
end
|
||||
|
||||
context "forum post" do
|
||||
let(:post) { FactoryGirl.create(:forum_post, author: author) }
|
||||
before { render }
|
||||
it "shows forum name" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:forum_post, author: @author))
|
||||
render
|
||||
rendered.should have_content "in #{@post.forum.name}"
|
||||
is_expected.to have_content "in #{post.forum.name}"
|
||||
end
|
||||
end
|
||||
|
||||
context "signed in" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
before(:each) do
|
||||
sign_in @author
|
||||
controller.stub(:current_user) { @author }
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
sign_in author
|
||||
controller.stub(:current_user) { author }
|
||||
render
|
||||
end
|
||||
|
||||
it 'shows a comment button' do
|
||||
assert_select "a", { href: new_comment_path(post_id: @post.id) }, "Comment"
|
||||
is_expected.to have_link "Comment", href: new_comment_path(post_id: post.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user