consul 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,7 @@ module Consul
5
5
  base.send :include, InstanceMethods
6
6
  base.send :extend, ClassMethods
7
7
  if ensure_power_initializer_present?
8
- if Rails.version.to_i < 4
9
- base.before_filter :ensure_power_initializer_present
10
- else
11
- base.before_action :ensure_power_initializer_present
12
- end
8
+ Util.before_action(base, :ensure_power_initializer_present)
13
9
  end
14
10
  end
15
11
 
@@ -32,68 +28,35 @@ module Consul
32
28
  private
33
29
 
34
30
  def require_power_check(options = {})
35
- if Rails.version.to_i < 4
36
- before_filter :unchecked_power, options
37
- else
38
- before_action :unchecked_power, options
39
- end
31
+ Util.before_action(self, :unchecked_power, options)
40
32
  end
41
33
 
42
34
  # This is badly named, since it doesn't actually skip the :check_power filter
43
35
  def skip_power_check(options = {})
44
- if Rails.version.to_i < 4
45
- skip_before_filter :unchecked_power, options
46
- elsif Rails.version.to_i < 5
47
- skip_before_action :unchecked_power, options
48
- else
49
- # Every `power` in a controller will skip the power check filter. After the 1st time, Rails 5+ will raise
50
- # an error because there is no `unchecked_power` action to skip any more.
51
- # To avoid this, we add the following extra option. Note that it must not be added in Rails 4 to avoid errors.
52
- # See http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback
53
- skip_before_action :unchecked_power, { :raise => false }.merge!(options)
54
- end
36
+ Util.skip_before_action(self, :unchecked_power, options)
55
37
  end
56
38
 
57
39
  def current_power(&initializer)
58
40
  self.current_power_initializer = initializer
59
- if Rails.version.to_i < 4
60
- around_filter :with_current_power
61
- else
62
- around_action :with_current_power
63
- end
41
+ Util.around_action(self, :with_current_power)
64
42
 
65
43
  if respond_to?(:helper_method)
66
44
  helper_method :current_power
67
45
  end
68
46
  end
69
47
 
70
- attr_writer :consul_guards
71
-
72
- def consul_guards
73
- unless @consul_guards_initialized
74
- if superclass && superclass.respond_to?(:consul_guards, true)
75
- @consul_guards = superclass.send(:consul_guards).dup
76
- else
77
- @consul_guards = []
78
- end
79
- @consul_guards_initialized = true
80
- end
81
- @consul_guards
82
- end
83
-
84
48
  def power(*args)
85
-
86
49
  guard = Consul::Guard.new(*args)
87
- consul_guards << guard
88
- skip_power_check guard.filter_options
50
+
51
+ # One .power directive will skip the check for all actions, even
52
+ # if that .power directive has :only or :except options.
53
+ skip_power_check
89
54
 
90
55
  # Store arguments for testing
91
- (@consul_power_args ||= []) << args
56
+ consul_power_args << args
92
57
 
93
- if Rails.version.to_i < 4
94
- before_filter :check_power, guard.filter_options
95
- else
96
- before_action :check_power, guard.filter_options
58
+ Util.before_action(self, guard.filter_options) do |controller|
59
+ guard.ensure!(controller, controller.action_name)
97
60
  end
98
61
 
99
62
  if guard.direct_access_method
@@ -105,18 +68,26 @@ module Consul
105
68
 
106
69
  end
107
70
 
71
+ # On first access we inherit .consul_power_args from our ancestor classes.
72
+ # We also copy inherited args so we don't change our parent's .consul_power_args
73
+ def consul_power_args
74
+ unless @consul_power_args_initialized
75
+ if superclass && superclass.respond_to?(:consul_power_args, true)
76
+ @consul_power_args = superclass.send(:consul_power_args).dup
77
+ else
78
+ @consul_power_args = []
79
+ end
80
+ @consul_power_args_initialized = true
81
+ end
82
+ @consul_power_args
83
+ end
84
+
108
85
  end
109
86
 
110
87
  module InstanceMethods
111
88
 
112
89
  private
113
90
 
114
- define_method :check_power do
115
- self.class.send(:consul_guards).each do |guard|
116
- guard.ensure!(self, action_name)
117
- end
118
- end
119
-
120
91
  def unchecked_power
121
92
  raise Consul::UncheckedPower, "This controller does not check against a power"
122
93
  end
@@ -10,7 +10,7 @@ module Consul
10
10
 
11
11
  def matches?(controller)
12
12
  @controller_class = controller.class
13
- @actual_args = @controller_class.instance_variable_get('@consul_power_args')
13
+ @actual_args = @controller_class.send(:consul_power_args)
14
14
  @actual_args.present? && @actual_args.include?(@expected_args)
15
15
  end
16
16
 
data/lib/consul/util.rb CHANGED
@@ -31,9 +31,9 @@ module Consul
31
31
  options = lambda.call(*args)
32
32
  klass.scoped(options.slice *EdgeRider::Scoped::VALID_FIND_OPTIONS)
33
33
  }
34
- end
34
+ end
35
35
  end
36
-
36
+
37
37
  # This method does not support dynamic default scopes via lambdas
38
38
  # (as does #define_scope), because it is currently not required.
39
39
  def define_default_scope(klass, conditions)
@@ -57,6 +57,36 @@ module Consul
57
57
  [adjective, record]
58
58
  end
59
59
 
60
+ def skip_before_action(controller_class, name, options)
61
+ if Rails.version.to_i < 4
62
+ controller_class.skip_before_filter name, options
63
+ elsif Rails.version.to_i < 5
64
+ controller_class.skip_before_action name, options
65
+ else
66
+ # Every `power` in a controller will skip the power check filter. After the 1st time, Rails 5+ will raise
67
+ # an error because there is no `unchecked_power` action to skip any more.
68
+ # To avoid this, we add the following extra option. Note that it must not be added in Rails 4 to avoid errors.
69
+ # See http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback
70
+ controller_class.skip_before_action name, { :raise => false }.merge!(options)
71
+ end
72
+ end
73
+
74
+ def before_action(controller_class, *args, &block)
75
+ if Rails.version.to_i < 4
76
+ controller_class.before_filter *args, &block
77
+ else
78
+ controller_class.before_action *args, &block
79
+ end
80
+ end
81
+
82
+ def around_action(controller_class, *args, &block)
83
+ if Rails.version.to_i < 4
84
+ controller_class.around_filter *args, &block
85
+ else
86
+ controller_class.around_action *args, &block
87
+ end
88
+ end
89
+
60
90
  end
61
91
  end
62
92
 
@@ -1,3 +1,3 @@
1
1
  module Consul
2
- VERSION = '1.0.2'
2
+ VERSION = '1.1.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consul
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-22 00:00:00.000000000 Z
11
+ date: 2022-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: memoized
@@ -25,7 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.0.2
27
27
  - !ruby/object:Gem::Dependency
28
- name: rails
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: railties
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - ">="
@@ -58,19 +86,17 @@ executables: []
58
86
  extensions: []
59
87
  extra_rdoc_files: []
60
88
  files:
89
+ - ".github/workflows/test.yml"
61
90
  - ".gitignore"
62
91
  - ".ruby-version"
63
- - ".travis.yml"
64
92
  - CHANGELOG.md
65
93
  - Gemfile
66
- - Gemfile.3-2
67
- - Gemfile.3-2.lock
68
- - Gemfile.4-2
69
- - Gemfile.4-2.lock
70
94
  - Gemfile.5-2
71
95
  - Gemfile.5-2.lock
72
- - Gemfile.6-0
73
- - Gemfile.6-0.lock
96
+ - Gemfile.6-1
97
+ - Gemfile.6-1.lock
98
+ - Gemfile.7-0
99
+ - Gemfile.7-0.lock
74
100
  - Gemfile.lock
75
101
  - LICENSE
76
102
  - README.md
@@ -90,8 +116,10 @@ homepage: https://github.com/makandra/consul
90
116
  licenses:
91
117
  - MIT
92
118
  metadata:
119
+ source_code_uri: https://github.com/makandra/consul
93
120
  bug_tracker_uri: https://github.com/makandra/consul/issues
94
121
  changelog_uri: https://github.com/makandra/consul/blob/master/CHANGELOG.md
122
+ rubygems_mfa_required: 'true'
95
123
  post_install_message:
96
124
  rdoc_options: []
97
125
  require_paths:
@@ -107,8 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
135
  - !ruby/object:Gem::Version
108
136
  version: '0'
109
137
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.5.2.3
138
+ rubygems_version: 3.2.22
112
139
  signing_key:
113
140
  specification_version: 4
114
141
  summary: A scope-based authorization solution for Ruby on Rails.
data/.travis.yml DELETED
@@ -1,40 +0,0 @@
1
- language: ruby
2
-
3
- sudo: false
4
-
5
- cache: bundler
6
-
7
- rvm:
8
- - 2.3.8
9
- - 2.4.5
10
- - 2.5.3
11
-
12
- gemfile:
13
- - Gemfile.3-2
14
- - Gemfile.4-2
15
- - Gemfile.5-2
16
- - Gemfile.6-0
17
-
18
- matrix:
19
- exclude:
20
- - gemfile: Gemfile.3-2
21
- rvm: 2.4.5
22
- - gemfile: Gemfile.3-2
23
- rvm: 2.5.3
24
- - gemfile: Gemfile.4-2
25
- rvm: 2.5.3
26
- - gemfile: Gemfile.6-0
27
- rvm: 2.3.8
28
- - gemfile: Gemfile.6-0
29
- rvm: 2.4.5
30
-
31
- install:
32
- # Replace default Travis CI bundler script with a version that doesn't
33
- # explode when lockfile doesn't match recently bumped version
34
- - bundle install --no-deployment --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
35
-
36
- script: bundle exec rake current_rspec
37
-
38
- notifications:
39
- email:
40
- - fail@makandra.de
data/Gemfile.3-2 DELETED
@@ -1,20 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Runtime dependencies
4
- gem 'assignable_values'
5
- gem 'rails', '~> 3.2.22.5'
6
- gem 'rake', '~>10.5.0'
7
- gem 'rack-cache', '~>1.2.0'
8
-
9
- # Development dependencies
10
- gem 'rspec', '~>3.4'
11
- gem 'rspec-rails'
12
- gem 'test-unit', '~> 3.0'
13
- gem 'shoulda-matchers', '<2'
14
- gem 'sqlite3'
15
- gem 'rspec_candy'
16
- gem 'database_cleaner', '~>1.4.1'
17
- gem 'gemika'
18
-
19
- # Gem under test
20
- gem 'consul', :path => '.'
data/Gemfile.3-2.lock DELETED
@@ -1,156 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- consul (1.0.1)
5
- edge_rider (>= 0.3.0)
6
- memoized (>= 1.0.2)
7
- rails (>= 3.2)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- actionmailer (3.2.22.5)
13
- actionpack (= 3.2.22.5)
14
- mail (~> 2.5.4)
15
- actionpack (3.2.22.5)
16
- activemodel (= 3.2.22.5)
17
- activesupport (= 3.2.22.5)
18
- builder (~> 3.0.0)
19
- erubis (~> 2.7.0)
20
- journey (~> 1.0.4)
21
- rack (~> 1.4.5)
22
- rack-cache (~> 1.2)
23
- rack-test (~> 0.6.1)
24
- sprockets (~> 2.2.1)
25
- activemodel (3.2.22.5)
26
- activesupport (= 3.2.22.5)
27
- builder (~> 3.0.0)
28
- activerecord (3.2.22.5)
29
- activemodel (= 3.2.22.5)
30
- activesupport (= 3.2.22.5)
31
- arel (~> 3.0.2)
32
- tzinfo (~> 0.3.29)
33
- activeresource (3.2.22.5)
34
- activemodel (= 3.2.22.5)
35
- activesupport (= 3.2.22.5)
36
- activesupport (3.2.22.5)
37
- i18n (~> 0.6, >= 0.6.4)
38
- multi_json (~> 1.0)
39
- arel (3.0.3)
40
- assignable_values (0.7.1)
41
- activerecord
42
- bourne (1.4.0)
43
- mocha (~> 0.13.2)
44
- builder (3.0.4)
45
- concurrent-ruby (1.1.4)
46
- database_cleaner (1.4.1)
47
- diff-lcs (1.3)
48
- edge_rider (0.3.3)
49
- activerecord
50
- erubis (2.7.0)
51
- gemika (0.3.4)
52
- hike (1.2.3)
53
- i18n (0.9.5)
54
- concurrent-ruby (~> 1.0)
55
- journey (1.0.4)
56
- json (1.8.6)
57
- mail (2.5.5)
58
- mime-types (~> 1.16)
59
- treetop (~> 1.4.8)
60
- memoized (1.0.2)
61
- metaclass (0.0.1)
62
- mime-types (1.25.1)
63
- mocha (0.13.3)
64
- metaclass (~> 0.0.1)
65
- multi_json (1.13.1)
66
- polyglot (0.3.5)
67
- power_assert (1.1.3)
68
- rack (1.4.7)
69
- rack-cache (1.2)
70
- rack (>= 0.4)
71
- rack-ssl (1.3.4)
72
- rack
73
- rack-test (0.6.3)
74
- rack (>= 1.0)
75
- rails (3.2.22.5)
76
- actionmailer (= 3.2.22.5)
77
- actionpack (= 3.2.22.5)
78
- activerecord (= 3.2.22.5)
79
- activeresource (= 3.2.22.5)
80
- activesupport (= 3.2.22.5)
81
- bundler (~> 1.0)
82
- railties (= 3.2.22.5)
83
- railties (3.2.22.5)
84
- actionpack (= 3.2.22.5)
85
- activesupport (= 3.2.22.5)
86
- rack-ssl (~> 1.3.2)
87
- rake (>= 0.8.7)
88
- rdoc (~> 3.4)
89
- thor (>= 0.14.6, < 2.0)
90
- rake (10.5.0)
91
- rdoc (3.12.2)
92
- json (~> 1.4)
93
- rspec (3.8.0)
94
- rspec-core (~> 3.8.0)
95
- rspec-expectations (~> 3.8.0)
96
- rspec-mocks (~> 3.8.0)
97
- rspec-core (3.8.0)
98
- rspec-support (~> 3.8.0)
99
- rspec-expectations (3.8.1)
100
- diff-lcs (>= 1.2.0, < 2.0)
101
- rspec-support (~> 3.8.0)
102
- rspec-mocks (3.8.0)
103
- diff-lcs (>= 1.2.0, < 2.0)
104
- rspec-support (~> 3.8.0)
105
- rspec-rails (3.8.0)
106
- actionpack (>= 3.0)
107
- activesupport (>= 3.0)
108
- railties (>= 3.0)
109
- rspec-core (~> 3.8.0)
110
- rspec-expectations (~> 3.8.0)
111
- rspec-mocks (~> 3.8.0)
112
- rspec-support (~> 3.8.0)
113
- rspec-support (3.8.0)
114
- rspec_candy (0.2.9)
115
- rspec
116
- sneaky-save
117
- shoulda-matchers (1.5.6)
118
- activesupport (>= 3.0.0)
119
- bourne (~> 1.3)
120
- sneaky-save (0.0.4)
121
- activerecord (>= 3.2.0)
122
- sprockets (2.2.3)
123
- hike (~> 1.2)
124
- multi_json (~> 1.0)
125
- rack (~> 1.0)
126
- tilt (~> 1.1, != 1.3.0)
127
- sqlite3 (1.3.13)
128
- test-unit (3.3.0)
129
- power_assert
130
- thor (0.20.3)
131
- tilt (1.4.1)
132
- treetop (1.4.15)
133
- polyglot
134
- polyglot (>= 0.3.1)
135
- tzinfo (0.3.55)
136
-
137
- PLATFORMS
138
- ruby
139
-
140
- DEPENDENCIES
141
- assignable_values
142
- consul!
143
- database_cleaner (~> 1.4.1)
144
- gemika
145
- rack-cache (~> 1.2.0)
146
- rails (~> 3.2.22.5)
147
- rake (~> 10.5.0)
148
- rspec (~> 3.4)
149
- rspec-rails
150
- rspec_candy
151
- shoulda-matchers (< 2)
152
- sqlite3
153
- test-unit (~> 3.0)
154
-
155
- BUNDLED WITH
156
- 1.17.3
data/Gemfile.4-2.lock DELETED
@@ -1,158 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- consul (1.0.1)
5
- edge_rider (>= 0.3.0)
6
- memoized (>= 1.0.2)
7
- rails (>= 3.2)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- actionmailer (4.2.11)
13
- actionpack (= 4.2.11)
14
- actionview (= 4.2.11)
15
- activejob (= 4.2.11)
16
- mail (~> 2.5, >= 2.5.4)
17
- rails-dom-testing (~> 1.0, >= 1.0.5)
18
- actionpack (4.2.11)
19
- actionview (= 4.2.11)
20
- activesupport (= 4.2.11)
21
- rack (~> 1.6)
22
- rack-test (~> 0.6.2)
23
- rails-dom-testing (~> 1.0, >= 1.0.5)
24
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
25
- actionview (4.2.11)
26
- activesupport (= 4.2.11)
27
- builder (~> 3.1)
28
- erubis (~> 2.7.0)
29
- rails-dom-testing (~> 1.0, >= 1.0.5)
30
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
31
- activejob (4.2.11)
32
- activesupport (= 4.2.11)
33
- globalid (>= 0.3.0)
34
- activemodel (4.2.11)
35
- activesupport (= 4.2.11)
36
- builder (~> 3.1)
37
- activerecord (4.2.11)
38
- activemodel (= 4.2.11)
39
- activesupport (= 4.2.11)
40
- arel (~> 6.0)
41
- activesupport (4.2.11)
42
- i18n (~> 0.7)
43
- minitest (~> 5.1)
44
- thread_safe (~> 0.3, >= 0.3.4)
45
- tzinfo (~> 1.1)
46
- arel (6.0.4)
47
- assignable_values (0.12.1)
48
- activerecord (>= 2.3)
49
- builder (3.2.3)
50
- concurrent-ruby (1.1.4)
51
- crass (1.0.4)
52
- database_cleaner (1.7.0)
53
- diff-lcs (1.2.5)
54
- edge_rider (0.3.3)
55
- activerecord
56
- erubis (2.7.0)
57
- gemika (0.3.4)
58
- globalid (0.4.2)
59
- activesupport (>= 4.2.0)
60
- i18n (0.9.5)
61
- concurrent-ruby (~> 1.0)
62
- loofah (2.2.3)
63
- crass (~> 1.0.2)
64
- nokogiri (>= 1.5.9)
65
- mail (2.7.1)
66
- mini_mime (>= 0.1.1)
67
- memoized (1.0.2)
68
- mini_mime (1.0.1)
69
- mini_portile2 (2.4.0)
70
- minitest (5.11.3)
71
- nokogiri (1.10.1)
72
- mini_portile2 (~> 2.4.0)
73
- rack (1.6.11)
74
- rack-test (0.6.3)
75
- rack (>= 1.0)
76
- rails (4.2.11)
77
- actionmailer (= 4.2.11)
78
- actionpack (= 4.2.11)
79
- actionview (= 4.2.11)
80
- activejob (= 4.2.11)
81
- activemodel (= 4.2.11)
82
- activerecord (= 4.2.11)
83
- activesupport (= 4.2.11)
84
- bundler (>= 1.3.0, < 2.0)
85
- railties (= 4.2.11)
86
- sprockets-rails
87
- rails-deprecated_sanitizer (1.0.3)
88
- activesupport (>= 4.2.0.alpha)
89
- rails-dom-testing (1.0.9)
90
- activesupport (>= 4.2.0, < 5.0)
91
- nokogiri (~> 1.6)
92
- rails-deprecated_sanitizer (>= 1.0.1)
93
- rails-html-sanitizer (1.0.4)
94
- loofah (~> 2.2, >= 2.2.2)
95
- railties (4.2.11)
96
- actionpack (= 4.2.11)
97
- activesupport (= 4.2.11)
98
- rake (>= 0.8.7)
99
- thor (>= 0.18.1, < 2.0)
100
- rake (12.3.2)
101
- rspec (3.5.0)
102
- rspec-core (~> 3.5.0)
103
- rspec-expectations (~> 3.5.0)
104
- rspec-mocks (~> 3.5.0)
105
- rspec-core (3.5.4)
106
- rspec-support (~> 3.5.0)
107
- rspec-expectations (3.5.0)
108
- diff-lcs (>= 1.2.0, < 2.0)
109
- rspec-support (~> 3.5.0)
110
- rspec-mocks (3.5.0)
111
- diff-lcs (>= 1.2.0, < 2.0)
112
- rspec-support (~> 3.5.0)
113
- rspec-rails (3.5.2)
114
- actionpack (>= 3.0)
115
- activesupport (>= 3.0)
116
- railties (>= 3.0)
117
- rspec-core (~> 3.5.0)
118
- rspec-expectations (~> 3.5.0)
119
- rspec-mocks (~> 3.5.0)
120
- rspec-support (~> 3.5.0)
121
- rspec-support (3.5.0)
122
- rspec_candy (0.4.1)
123
- rspec
124
- sneaky-save
125
- shoulda-matchers (3.1.1)
126
- activesupport (>= 4.0.0)
127
- sneaky-save (0.1.2)
128
- activerecord (>= 3.2.0)
129
- sprockets (3.7.2)
130
- concurrent-ruby (~> 1.0)
131
- rack (> 1, < 3)
132
- sprockets-rails (3.2.1)
133
- actionpack (>= 4.0)
134
- activesupport (>= 4.0)
135
- sprockets (>= 3.0.0)
136
- sqlite3 (1.3.12)
137
- thor (0.20.3)
138
- thread_safe (0.3.6)
139
- tzinfo (1.2.5)
140
- thread_safe (~> 0.1)
141
-
142
- PLATFORMS
143
- ruby
144
-
145
- DEPENDENCIES
146
- assignable_values
147
- consul!
148
- database_cleaner
149
- gemika
150
- rails (~> 4.2.7)
151
- rspec
152
- rspec-rails
153
- rspec_candy
154
- shoulda-matchers
155
- sqlite3
156
-
157
- BUNDLED WITH
158
- 1.17.3