hobo 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|