hobo 2.1.1 → 2.1.2
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.
- checksums.yaml +4 -4
- data/Gemfile +4 -1
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/app/helpers/hobo_permissions_helper.rb +10 -3
- data/hobo.gemspec +2 -2
- data/lib/generators/hobo/i18n/templates/hobo.en.yml +1 -0
- data/lib/generators/hobo/setup_wizard/setup_wizard_generator.rb +1 -1
- data/lib/generators/hobo/user_model/templates/model_injection.rb.erb +5 -0
- data/lib/hobo/controller/model.rb +1 -1
- data/lib/hobo/extensions/active_record/permissions.rb +11 -3
- data/lib/hobo/model.rb +20 -4
- data/lib/hobo/model/accessible_associations.rb +18 -11
- data/lib/hobo/model/lifecycles/creator.rb +1 -0
- data/lib/hobo/model/permissions.rb +6 -6
- data/lib/hobo/model/scopes/apply_scopes.rb +2 -2
- data/lib/hobo/model/scopes/automatic_scopes.rb +8 -3
- data/lib/hobo/model/user_base.rb +11 -1
- data/test/irt/generators/front_controller.irt +2 -1
- data/test/irt/generators/test_framework.irt +4 -4
- metadata +10 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12fc9a9fb6626d3e125ab54d4357c98f4ffec9b6
|
4
|
+
data.tar.gz: bd705d3d658a46e93373599305f85476616911cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f43ce9b0b3b8f70fa5f702de7b7ad11d0e5b1e347fd49718582ffdd63a23bfe6e1821ca36fd046b43f86850046d17448146fdd62b49bdcb0a376cfcc958172f9
|
7
|
+
data.tar.gz: 61186300408c90cc1dbc6c24a0257fd027fd299a424e0ba3a59237d924b6ea282431ae78222be644fec1af91402e60ad73d6f647922e9ea0be0f430166f853a1
|
data/Gemfile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
3
|
gem 'rubydoctest', :git => 'git://github.com/bryanlarsen/rubydoctest.git'
|
4
|
-
gem 'rails', '
|
4
|
+
gem 'rails', '4.0.8'
|
5
|
+
gem 'protected_attributes'
|
5
6
|
gemspec :path => "../dryml"
|
6
7
|
gemspec :path => "../hobo_support"
|
7
8
|
gemspec :path => "../hobo_fields"
|
@@ -13,3 +14,5 @@ end
|
|
13
14
|
platform :jruby do
|
14
15
|
gem 'activerecord-jdbcsqlite3-adapter'
|
15
16
|
end
|
17
|
+
|
18
|
+
gem "irt"
|
data/Rakefile
CHANGED
@@ -4,6 +4,10 @@ require 'rake/testtask'
|
|
4
4
|
require 'tmpdir'
|
5
5
|
|
6
6
|
require 'active_record'
|
7
|
+
require 'action_view'
|
8
|
+
require 'action_controller'
|
9
|
+
require 'action_mailer'
|
10
|
+
|
7
11
|
ActiveRecord::ActiveRecordError # hack for https://rails.lighthouseapp.com/projects/8994/tickets/2577-when-using-activerecordassociations-outside-of-rails-a-nameerror-is-thrown
|
8
12
|
$:.unshift File.expand_path('../lib', __FILE__)
|
9
13
|
$:.unshift File.expand_path('../../hobo_support/lib', __FILE__)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.2
|
@@ -21,13 +21,20 @@ module HoboPermissionsHelper
|
|
21
21
|
object = object.new
|
22
22
|
elsif (refl = object.try.proxy_association._?.reflection) && refl.macro == :has_many
|
23
23
|
if Hobo.simple_has_many_association?(object)
|
24
|
-
|
25
|
-
|
24
|
+
new_object = object.build
|
25
|
+
new_object.set_creator(current_user)
|
26
26
|
else
|
27
27
|
return false
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
# When running `can_create?(@something.children)`, a new object is instantiated to check if we can create
|
31
|
+
# After the check we need to remove it from memory
|
32
|
+
if new_object
|
33
|
+
new_object.creatable_by?(current_user)
|
34
|
+
object.delete(new_object)
|
35
|
+
else
|
36
|
+
object.creatable_by?(current_user)
|
37
|
+
end
|
31
38
|
end
|
32
39
|
|
33
40
|
|
data/hobo.gemspec
CHANGED
@@ -16,9 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_runtime_dependency('dryml', ["= #{version}"])
|
17
17
|
s.add_runtime_dependency('hobo_will_paginate')
|
18
18
|
|
19
|
-
s.add_development_dependency('rubydoctest', [">= 1.1.3"])
|
19
|
+
# s.add_development_dependency('rubydoctest', [">= 1.1.3"])
|
20
20
|
s.add_development_dependency('shoulda', [">= 0"])
|
21
|
-
s.add_development_dependency('irt', ["= 1.2
|
21
|
+
s.add_development_dependency('irt', ["= 1.3.2"])
|
22
22
|
s.add_development_dependency('mocha')
|
23
23
|
s.add_development_dependency('yard')
|
24
24
|
|
@@ -109,7 +109,7 @@ NOTE: You might want to sign up as the administrator before adding this!
|
|
109
109
|
@invite_only = invite_only?
|
110
110
|
private_site = options[:private_site]
|
111
111
|
end
|
112
|
-
inject_into_file 'app/controllers/application_controller.rb', <<EOI, :after => "protect_from_forgery\n" if private_site
|
112
|
+
inject_into_file 'app/controllers/application_controller.rb', <<EOI, :after => "protect_from_forgery with: :exception\n" if private_site
|
113
113
|
include Hobo::Controller::AuthenticationSupport
|
114
114
|
before_filter :except => [:login, :forgot_password, :accept_invitation, :do_accept_invitation, :reset_password,
|
115
115
|
:do_reset_password] do
|
@@ -2,6 +2,11 @@
|
|
2
2
|
hobo_user_model # Don't put anything above this
|
3
3
|
|
4
4
|
fields do
|
5
|
+
|
6
|
+
# NOTE: If you add fields here, you may need to include them in both the attr_accessible list, and
|
7
|
+
# the list of fields passed to 'only_changed?' in the update_permitted? method for them to appear
|
8
|
+
# on the user#edit form.
|
9
|
+
|
5
10
|
name :string, :required, :unique
|
6
11
|
email_address :email_address, :login => true
|
7
12
|
administrator :boolean, :default => false
|
@@ -335,7 +335,7 @@ module Hobo
|
|
335
335
|
|
336
336
|
|
337
337
|
def parse_sort_param(*args)
|
338
|
-
_, desc, field = *params[:sort]._?.match(/^(-)?([a-
|
338
|
+
_, desc, field = *params[:sort]._?.match(/^(-)?([a-z0-9_]+(?:\.[a-z0-9_]+)?)$/)
|
339
339
|
|
340
340
|
if field
|
341
341
|
hash = args.extract_options!
|
@@ -103,13 +103,21 @@ ActiveRecord::Associations::HasManyThroughAssociation.class_eval do
|
|
103
103
|
|
104
104
|
# TODO - add dependent option support
|
105
105
|
def delete_records_with_hobo_permission_check(records, method)
|
106
|
-
klass = @reflection.through_reflection.klass
|
107
106
|
user = acting_user
|
107
|
+
|
108
|
+
problem_joiner=nil
|
109
|
+
association = self.respond_to?(:proxy_association) ? proxy_association : self
|
110
|
+
through_assoc_name = association.send(:through_reflection).name
|
108
111
|
if user && records.any? { |r|
|
109
|
-
|
112
|
+
ja = construct_join_attributes(r)
|
113
|
+
problem_joiner = joiner = association.owner.send(through_assoc_name).where(ja).first
|
110
114
|
joiner.is_a?(Hobo::Model) && !joiner.destroyable_by?(user)
|
111
115
|
}
|
112
|
-
|
116
|
+
message = "#{@owner.class}##{association.reflection.name}.destroy "
|
117
|
+
if 'development' == Rails.env
|
118
|
+
message += " because of #{problem_joiner.class.name}(#{problem_joiner.to_json})"
|
119
|
+
end
|
120
|
+
raise Hobo::PermissionDeniedError, message
|
113
121
|
end
|
114
122
|
delete_records_without_hobo_permission_check(records, method)
|
115
123
|
end
|
data/lib/hobo/model.rb
CHANGED
@@ -132,13 +132,29 @@ module Hobo
|
|
132
132
|
names += public_instance_methods.*.to_s
|
133
133
|
end
|
134
134
|
|
135
|
-
def belongs_to_with_creator_metadata(name,
|
135
|
+
def belongs_to_with_creator_metadata(name, *args, &block)
|
136
|
+
if args.size == 0 || (args.size == 1 && args[0].kind_of?(Proc))
|
137
|
+
options = {}
|
138
|
+
args.push(options)
|
139
|
+
elsif args.size == 1
|
140
|
+
options = args[0]
|
141
|
+
else
|
142
|
+
options = args[1]
|
143
|
+
end
|
136
144
|
self.creator_attribute = name.to_sym if options.delete(:creator)
|
137
|
-
belongs_to_without_creator_metadata(name,
|
145
|
+
belongs_to_without_creator_metadata(name, *args, &block)
|
138
146
|
end
|
139
147
|
|
140
|
-
def belongs_to_with_test_methods(name,
|
141
|
-
|
148
|
+
def belongs_to_with_test_methods(name, *args, &block)
|
149
|
+
if args.size == 0 || (args.size == 1 && args[0].kind_of?(Proc))
|
150
|
+
options = {}
|
151
|
+
args.push(options)
|
152
|
+
elsif args.size == 1
|
153
|
+
options = args[0]
|
154
|
+
else
|
155
|
+
options = args[1]
|
156
|
+
end
|
157
|
+
belongs_to_without_test_methods(name, *args, &block)
|
142
158
|
refl = reflections[name]
|
143
159
|
id_method = refl.options[:primary_key] || refl.klass.primary_key
|
144
160
|
if options[:polymorphic]
|
@@ -103,21 +103,20 @@ module Hobo
|
|
103
103
|
|
104
104
|
# --- has_many mass assignment support --- #
|
105
105
|
|
106
|
-
def self.has_many_with_accessible(name,
|
106
|
+
def self.has_many_with_accessible(name, *args, &block)
|
107
107
|
# Rails 4 supports a lambda as the second argument in a has_many association
|
108
108
|
# We need to support it too (required for gems like papertrail)
|
109
109
|
# The problem is that when it is not used, the options hash is taken as the scope
|
110
110
|
# To fix this, we make a small hack checking the second argument's class
|
111
|
-
if
|
112
|
-
has_many_without_accessible(name, received_scope, options, &block)
|
113
|
-
else
|
114
|
-
if received_scope == nil
|
111
|
+
if args.size == 0 || (args.size == 1 && args[0].kind_of?(Proc))
|
115
112
|
options = {}
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
113
|
+
args.push(options)
|
114
|
+
elsif args.size == 1
|
115
|
+
options = args[0]
|
116
|
+
else
|
117
|
+
options = args[1]
|
120
118
|
end
|
119
|
+
has_many_without_accessible(name, *args, &block)
|
121
120
|
# End of the received_scope hack
|
122
121
|
|
123
122
|
if options[:accessible]
|
@@ -138,8 +137,16 @@ module Hobo
|
|
138
137
|
|
139
138
|
# --- belongs_to assignment support --- #
|
140
139
|
|
141
|
-
def self.belongs_to_with_accessible(name,
|
142
|
-
|
140
|
+
def self.belongs_to_with_accessible(name,*args, &block)
|
141
|
+
if args.size == 0 || (args.size == 1 && args[0].kind_of?(Proc))
|
142
|
+
options = {}
|
143
|
+
args.push(options)
|
144
|
+
elsif args.size == 1
|
145
|
+
options = args[0]
|
146
|
+
else
|
147
|
+
options = args[1]
|
148
|
+
end
|
149
|
+
belongs_to_without_accessible(name,*args, &block)
|
143
150
|
|
144
151
|
if options[:accessible]
|
145
152
|
class_eval %{
|
@@ -79,8 +79,8 @@ module Hobo
|
|
79
79
|
# ensure active_user gets passed down to :dependent => destroy
|
80
80
|
# associations (Ticket #528)
|
81
81
|
|
82
|
-
def has_many_with_hobo_permission_check(association_id,
|
83
|
-
has_many_without_hobo_permission_check(association_id,
|
82
|
+
def has_many_with_hobo_permission_check(association_id, *args, &extension)
|
83
|
+
has_many_without_hobo_permission_check(association_id, *args, &extension)
|
84
84
|
reflection = reflections[association_id]
|
85
85
|
if reflection.options[:dependent]==:destroy
|
86
86
|
#overriding dynamic method created in ActiveRecord::Associations#configure_dependency_for_has_many
|
@@ -91,8 +91,8 @@ module Hobo
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
def has_one_with_hobo_permission_check(association_id,
|
95
|
-
has_one_without_hobo_permission_check(association_id,
|
94
|
+
def has_one_with_hobo_permission_check(association_id, *args, &extension)
|
95
|
+
has_one_without_hobo_permission_check(association_id, *args, &extension)
|
96
96
|
reflection = reflections[association_id]
|
97
97
|
if reflection.options[:dependent]==:destroy
|
98
98
|
#overriding dynamic method created in ActiveRecord::Associations#configure_dependency_for_has_one
|
@@ -106,8 +106,8 @@ module Hobo
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
def belongs_to_with_hobo_permission_check(association_id,
|
110
|
-
belongs_to_without_hobo_permission_check(association_id,
|
109
|
+
def belongs_to_with_hobo_permission_check(association_id, *args, &extension)
|
110
|
+
belongs_to_without_hobo_permission_check(association_id, *args, &extension)
|
111
111
|
reflection = reflections[association_id]
|
112
112
|
if reflection.options[:dependent]==:destroy
|
113
113
|
#overriding dynamic method created in ActiveRecord::Associations#configure_dependency_for_belongs_to
|
@@ -7,9 +7,9 @@ module Hobo
|
|
7
7
|
result = self
|
8
8
|
scopes.each_pair do |scope, arg|
|
9
9
|
if arg.is_a?(Array)
|
10
|
-
result =
|
10
|
+
result = result.send(scope, *arg) unless arg.first.blank?
|
11
11
|
else
|
12
|
-
result =
|
12
|
+
result = result.send(scope, arg) unless arg.blank?
|
13
13
|
end
|
14
14
|
end
|
15
15
|
result
|
@@ -322,13 +322,18 @@ module Hobo
|
|
322
322
|
return true if check_only
|
323
323
|
|
324
324
|
def_scope do |query, *fields|
|
325
|
-
|
326
|
-
|
325
|
+
using_postgresql = %w(PostgreSQL PostGIS).include?(::ActiveRecord::Base.connection.adapter_name)
|
326
|
+
match_keyword = using_postgresql ? "ILIKE" : "LIKE"
|
327
327
|
words = (query || "").split
|
328
328
|
args = []
|
329
329
|
word_queries = words.map do |word|
|
330
330
|
field_query = '(' + fields.map { |field|
|
331
|
-
|
331
|
+
if using_postgresql
|
332
|
+
casted_field = "CAST(#{@klass.table_name}.#{field} AS TEXT)"
|
333
|
+
else
|
334
|
+
casted_field = "#{@klass.table_name}.#{field}"
|
335
|
+
end
|
336
|
+
field = "#{casted_field}" unless field =~ /\./
|
332
337
|
"(#{field} #{match_keyword} ?)"
|
333
338
|
}.join(" OR ") + ')'
|
334
339
|
args += ["%#{word}%"] * fields.length
|
data/lib/hobo/model/user_base.rb
CHANGED
@@ -42,7 +42,7 @@ module Hobo
|
|
42
42
|
# https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/530
|
43
43
|
attr_accessor :current_password, :password, :password_confirmation, :type => :password
|
44
44
|
|
45
|
-
before_save :encrypt_password
|
45
|
+
before_save :encrypt_password, :downcase_email
|
46
46
|
after_save :stash_current_password
|
47
47
|
|
48
48
|
never_show *AUTHENTICATION_FIELDS
|
@@ -75,6 +75,9 @@ module Hobo
|
|
75
75
|
|
76
76
|
# Authenticates a user by their login name and unencrypted password. Returns the user or nil.
|
77
77
|
def authenticate(login, password)
|
78
|
+
# Downcase emails before logging in
|
79
|
+
login = login.downcase if attr_type(@login_attribute) == HoboFields::Types::EmailAddress
|
80
|
+
|
78
81
|
u = where("#{@login_attribute} = ?", login).first # need to get the salt
|
79
82
|
|
80
83
|
if u && u.authenticated?(password)
|
@@ -179,6 +182,13 @@ module Hobo
|
|
179
182
|
if changing_password? && !authenticated?(current_password)
|
180
183
|
end
|
181
184
|
|
185
|
+
# Downcase emails used for logging in before saving them to the database
|
186
|
+
def downcase_email
|
187
|
+
if self.login.class == HoboFields::Types::EmailAddress
|
188
|
+
self.login = self.login.downcase
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
182
192
|
end
|
183
193
|
end
|
184
194
|
end
|
@@ -18,6 +18,7 @@ test_value_eql? true
|
|
18
18
|
|
19
19
|
desc "Routes added"
|
20
20
|
file_include? 'config/routes.rb',
|
21
|
-
%(
|
21
|
+
%(post 'search' => 'front#search', :as => 'site_search_post'),
|
22
|
+
%(get 'search' => 'front#search', :as => 'site_search'),
|
22
23
|
%(root :to => 'front#index')
|
23
24
|
test_value_eql? true
|
@@ -24,7 +24,7 @@ file_include? 'config/application.rb',
|
|
24
24
|
test_value_eql? true
|
25
25
|
|
26
26
|
desc "shoulda Gemfile injection"
|
27
|
-
file_include? 'Gemfile', %(gem "shoulda", :
|
27
|
+
file_include? 'Gemfile', %(gem "shoulda", group: :test)
|
28
28
|
test_value_eql? true
|
29
29
|
|
30
30
|
git_reset_app
|
@@ -38,7 +38,7 @@ file_include? 'config/application.rb',
|
|
38
38
|
test_value_eql? true
|
39
39
|
|
40
40
|
desc "rspec Gemfile injection"
|
41
|
-
file_include? 'Gemfile', %(gem "rspec-rails", ">= 2.5.0", :
|
41
|
+
file_include? 'Gemfile', %(gem "rspec-rails", ">= 2.5.0", group: [:test, :development])
|
42
42
|
test_value_eql? true
|
43
43
|
|
44
44
|
git_reset_app
|
@@ -52,8 +52,8 @@ file_include? 'config/application.rb',
|
|
52
52
|
test_value_eql? true
|
53
53
|
|
54
54
|
desc "rspec_with_shoulda Gemfile injection"
|
55
|
-
file_include? 'Gemfile', %(gem "rspec-rails", ">= 2.5.0", :
|
56
|
-
%(gem "shoulda", :
|
55
|
+
file_include? 'Gemfile', %(gem "rspec-rails", ">= 2.5.0", group: [:test, :development]),
|
56
|
+
%(gem "shoulda", group: :test)
|
57
57
|
test_value_eql? true
|
58
58
|
|
59
59
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hobo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Locke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hobo_support
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.1.
|
19
|
+
version: 2.1.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.1.
|
26
|
+
version: 2.1.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hobo_fields
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.1.
|
33
|
+
version: 2.1.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.1.
|
40
|
+
version: 2.1.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: dryml
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2.1.
|
47
|
+
version: 2.1.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.1.
|
54
|
+
version: 2.1.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: hobo_will_paginate
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rubydoctest
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.1.3
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 1.1.3
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: shoulda
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +86,14 @@ dependencies:
|
|
100
86
|
requirements:
|
101
87
|
- - '='
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.2
|
89
|
+
version: 1.3.2
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - '='
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.2
|
96
|
+
version: 1.3.2
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: mocha
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|