active_mocker 1.1.23 → 1.2.pre
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/README.md +12 -22
- data/active_mocker.gemspec +1 -0
- data/lib/active_hash/init.rb +1 -1
- data/lib/active_mocker.rb +4 -5
- data/lib/active_mocker/active_record/schema.rb +2 -4
- data/lib/active_mocker/config.rb +6 -22
- data/lib/active_mocker/field.rb +3 -1
- data/lib/active_mocker/generate.rb +161 -0
- data/lib/active_mocker/mock_class_methods.rb +82 -0
- data/lib/active_mocker/mock_instance_methods.rb +81 -0
- data/lib/active_mocker/mock_requires.rb +12 -0
- data/lib/active_mocker/mock_task.rb +12 -0
- data/lib/active_mocker/mock_template.erb +84 -0
- data/lib/active_mocker/public_methods.rb +6 -2
- data/lib/active_mocker/schema_reader.rb +35 -16
- data/lib/active_mocker/table.rb +2 -0
- data/lib/active_mocker/version.rb +1 -1
- data/mocks/micropost_mock.rb +100 -0
- data/mocks/relationship_mock.rb +100 -0
- data/mocks/user_mock.rb +196 -0
- data/plan_mock.rb +2323 -0
- data/spec/lib/active_mocker/generate_spec.rb +49 -0
- data/spec/lib/active_mocker/{base_spec.rb → performance/base_spec.rb} +17 -37
- data/spec/lib/active_mocker/performance/large_schema.rb +3576 -0
- data/spec/lib/active_mocker/performance/migration/20140327205359_migration.rb +0 -0
- data/spec/lib/active_mocker/performance/schema_reader_spec.rb +96 -0
- data/spec/lib/active_mocker/schema_reader_spec.rb +12 -27
- data/spec/lib/compare_mocker_and_record_spec.rb +3 -2
- data/spec/lib/readme_spec.rb +205 -0
- data/spec/mocks/micropost_mock.rb +100 -0
- data/spec/mocks/relationship_mock.rb +100 -0
- data/spec/mocks/user_mock.rb +196 -0
- data/spec/mocks/user_mock_spec.rb +173 -0
- metadata +48 -9
- data/lib/active_mocker/base.rb +0 -356
- data/spec/lib/active_mocker/active_record/schema_spec.rb +0 -2721
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_mocker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dustin Zeisler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: fuubar
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: Create mocks from active record models without loading rails or running
|
112
126
|
a database. The Mock's methods have the same arguments as the AR model and if they
|
113
127
|
change you get a error in your test.
|
@@ -138,12 +152,17 @@ files:
|
|
138
152
|
- lib/active_mocker/active_record/scope.rb
|
139
153
|
- lib/active_mocker/active_record/unknown_class_method.rb
|
140
154
|
- lib/active_mocker/active_record/unknown_module.rb
|
141
|
-
- lib/active_mocker/base.rb
|
142
155
|
- lib/active_mocker/collection_association.rb
|
143
156
|
- lib/active_mocker/config.rb
|
144
157
|
- lib/active_mocker/const_sets.rb
|
145
158
|
- lib/active_mocker/field.rb
|
159
|
+
- lib/active_mocker/generate.rb
|
146
160
|
- lib/active_mocker/logger.rb
|
161
|
+
- lib/active_mocker/mock_class_methods.rb
|
162
|
+
- lib/active_mocker/mock_instance_methods.rb
|
163
|
+
- lib/active_mocker/mock_requires.rb
|
164
|
+
- lib/active_mocker/mock_task.rb
|
165
|
+
- lib/active_mocker/mock_template.erb
|
147
166
|
- lib/active_mocker/model_reader.rb
|
148
167
|
- lib/active_mocker/public_methods.rb
|
149
168
|
- lib/active_mocker/reparameterize.rb
|
@@ -156,15 +175,27 @@ files:
|
|
156
175
|
- lib/active_record/db/schema.rb
|
157
176
|
- lib/file_reader.rb
|
158
177
|
- lib/string_reader.rb
|
159
|
-
-
|
160
|
-
-
|
178
|
+
- mocks/micropost_mock.rb
|
179
|
+
- mocks/relationship_mock.rb
|
180
|
+
- mocks/user_mock.rb
|
181
|
+
- plan_mock.rb
|
161
182
|
- spec/lib/active_mocker/collection_association_spec.rb
|
183
|
+
- spec/lib/active_mocker/generate_spec.rb
|
162
184
|
- spec/lib/active_mocker/model_reader_spec.rb
|
185
|
+
- spec/lib/active_mocker/performance/base_spec.rb
|
186
|
+
- spec/lib/active_mocker/performance/large_schema.rb
|
187
|
+
- spec/lib/active_mocker/performance/migration/20140327205359_migration.rb
|
188
|
+
- spec/lib/active_mocker/performance/schema_reader_spec.rb
|
163
189
|
- spec/lib/active_mocker/schema_reader_spec.rb
|
164
190
|
- spec/lib/compare_mocker_and_record_spec.rb
|
165
191
|
- spec/lib/model.rb
|
166
192
|
- spec/lib/person.rb
|
193
|
+
- spec/lib/readme_spec.rb
|
167
194
|
- spec/lib/schema.rb
|
195
|
+
- spec/mocks/micropost_mock.rb
|
196
|
+
- spec/mocks/relationship_mock.rb
|
197
|
+
- spec/mocks/user_mock.rb
|
198
|
+
- spec/mocks/user_mock_spec.rb
|
168
199
|
homepage: https://github.com/zeisler/active_mocker
|
169
200
|
licenses:
|
170
201
|
- MIT
|
@@ -180,9 +211,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
180
211
|
version: 2.0.0
|
181
212
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
213
|
requirements:
|
183
|
-
- - "
|
214
|
+
- - ">"
|
184
215
|
- !ruby/object:Gem::Version
|
185
|
-
version:
|
216
|
+
version: 1.3.1
|
186
217
|
requirements: []
|
187
218
|
rubyforge_project:
|
188
219
|
rubygems_version: 2.2.2
|
@@ -191,12 +222,20 @@ specification_version: 4
|
|
191
222
|
summary: Create mocks from active record models without loading rails or running a
|
192
223
|
database
|
193
224
|
test_files:
|
194
|
-
- spec/lib/active_mocker/active_record/schema_spec.rb
|
195
|
-
- spec/lib/active_mocker/base_spec.rb
|
196
225
|
- spec/lib/active_mocker/collection_association_spec.rb
|
226
|
+
- spec/lib/active_mocker/generate_spec.rb
|
197
227
|
- spec/lib/active_mocker/model_reader_spec.rb
|
228
|
+
- spec/lib/active_mocker/performance/base_spec.rb
|
229
|
+
- spec/lib/active_mocker/performance/large_schema.rb
|
230
|
+
- spec/lib/active_mocker/performance/migration/20140327205359_migration.rb
|
231
|
+
- spec/lib/active_mocker/performance/schema_reader_spec.rb
|
198
232
|
- spec/lib/active_mocker/schema_reader_spec.rb
|
199
233
|
- spec/lib/compare_mocker_and_record_spec.rb
|
200
234
|
- spec/lib/model.rb
|
201
235
|
- spec/lib/person.rb
|
236
|
+
- spec/lib/readme_spec.rb
|
202
237
|
- spec/lib/schema.rb
|
238
|
+
- spec/mocks/micropost_mock.rb
|
239
|
+
- spec/mocks/relationship_mock.rb
|
240
|
+
- spec/mocks/user_mock.rb
|
241
|
+
- spec/mocks/user_mock_spec.rb
|
data/lib/active_mocker/base.rb
DELETED
@@ -1,356 +0,0 @@
|
|
1
|
-
module ActiveMocker
|
2
|
-
class Base
|
3
|
-
extend Config
|
4
|
-
extend Forwardable
|
5
|
-
@@_self = self
|
6
|
-
def_delegators :@@_self,
|
7
|
-
:mass_assignment,
|
8
|
-
:schema_attributes,
|
9
|
-
:model_attributes,
|
10
|
-
:model_dir,
|
11
|
-
:schema_file,
|
12
|
-
:model_file_reader,
|
13
|
-
:schema_file_reader,
|
14
|
-
:clear_cache
|
15
|
-
|
16
|
-
attr_reader :model_name, :klass
|
17
|
-
|
18
|
-
def initialize(model_name)
|
19
|
-
@model_name = model_name
|
20
|
-
active_hash_mock_class
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.configure(&block)
|
24
|
-
config(&block)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.mock(model_name)
|
28
|
-
self.send(:new, model_name).klass
|
29
|
-
end
|
30
|
-
|
31
|
-
def model_definition
|
32
|
-
@model_definition ||= ModelReader.new({model_dir: model_dir, file_reader: model_file_reader}).parse(model_file_name)
|
33
|
-
end
|
34
|
-
|
35
|
-
def model_file_name
|
36
|
-
model_name.tableize.singularize
|
37
|
-
end
|
38
|
-
|
39
|
-
def table_definition
|
40
|
-
@table_definition ||= SchemaReader.new({schema_file: schema_file, file_reader: schema_file_reader, clear_cache: clear_cache}).search(model_name.tableize)
|
41
|
-
end
|
42
|
-
|
43
|
-
def active_hash_mock_class
|
44
|
-
fill_templates
|
45
|
-
add_method_mock_of
|
46
|
-
if schema_attributes
|
47
|
-
klass = create_klass
|
48
|
-
fields = table_definition.column_names
|
49
|
-
klass.class_eval do
|
50
|
-
klass.fields(*fields)
|
51
|
-
end
|
52
|
-
add_column_names_method
|
53
|
-
end
|
54
|
-
if model_attributes
|
55
|
-
add_class_methods
|
56
|
-
add_instance_methods
|
57
|
-
add_single_relationships
|
58
|
-
add_collections_relationships
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def fill_templates
|
63
|
-
klass = create_klass
|
64
|
-
klass.send(:association_names=, model_definition.relationships)
|
65
|
-
klass.send(:attribute_names=, table_definition.column_names)
|
66
|
-
end
|
67
|
-
|
68
|
-
def add_method_mock_of
|
69
|
-
klass = create_klass
|
70
|
-
m_name = model_name
|
71
|
-
klass.instance_variable_set(:@model_class, model_definition.klass)
|
72
|
-
klass.instance_eval do
|
73
|
-
define_method(:mock_of) {m_name}
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def add_single_relationships
|
78
|
-
klass = create_klass
|
79
|
-
model_definition.single_relationships.each do |m|
|
80
|
-
klass.send(:association_template)[m] = nil
|
81
|
-
create_association(m)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def add_collections_relationships
|
86
|
-
klass = create_klass
|
87
|
-
model_definition.collections.each do |m|
|
88
|
-
klass.send(:association_template)[m] = nil
|
89
|
-
begin
|
90
|
-
klass.class_eval <<-eos, __FILE__, __LINE__+1
|
91
|
-
def #{m}
|
92
|
-
read_association(#{m.inspect})
|
93
|
-
end
|
94
|
-
|
95
|
-
def #{m}=(value)
|
96
|
-
write_association(#{m.inspect}, CollectionAssociation.new(value))
|
97
|
-
end
|
98
|
-
eos
|
99
|
-
rescue SyntaxError
|
100
|
-
Logger_.warn "ActiveMocker :: Can't create accessor methods for #{m}.\n #{caller}"
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def create_association(m)
|
106
|
-
begin
|
107
|
-
klass.class_eval <<-eos, __FILE__, __LINE__+1
|
108
|
-
def #{m}
|
109
|
-
read_association(#{m.inspect})
|
110
|
-
end
|
111
|
-
|
112
|
-
def #{m}=(value)
|
113
|
-
write_association(#{m.inspect}, value)
|
114
|
-
end
|
115
|
-
eos
|
116
|
-
rescue SyntaxError
|
117
|
-
Logger_.warn "ActiveMocker :: Can't create accessor methods for #{m}.\n #{caller}"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
def add_instance_methods
|
123
|
-
klass = create_klass
|
124
|
-
model_definition.instance_methods_with_arguments.each do |method|
|
125
|
-
m = method.keys.first
|
126
|
-
if m == :attributes
|
127
|
-
Logger_.warn "ActiveMocker Depends on the #attributes method. It will not be redefined for the mock."
|
128
|
-
next
|
129
|
-
end
|
130
|
-
params = Reparameterize.call(method.values.first)
|
131
|
-
params_pass = Reparameterize.call(method.values.first, true)
|
132
|
-
|
133
|
-
klass.send(:model_methods_template)[m] = eval_lambda(params, %Q[raise "##{m} is not Implemented for Class: #{klass.name}"])
|
134
|
-
klass.class_eval <<-eos, __FILE__, __LINE__+1
|
135
|
-
def #{m}(#{params})
|
136
|
-
block = model_instance_methods[#{m.inspect}].to_proc
|
137
|
-
instance_exec(*[#{params_pass}], &block)
|
138
|
-
end
|
139
|
-
eos
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def add_class_methods
|
144
|
-
klass = create_klass
|
145
|
-
model_definition.class_methods_with_arguments.each do |method|
|
146
|
-
m = method.keys.first
|
147
|
-
params = Reparameterize.call(method.values.first)
|
148
|
-
params_pass = Reparameterize.call(method.values.first, true)
|
149
|
-
klass.send(:model_class_methods)[m] = eval_lambda(params, %Q[raise "::#{m} is not Implemented for Class: #{klass.name}"])
|
150
|
-
klass.class_eval <<-eos, __FILE__, __LINE__+1
|
151
|
-
def self.#{m}(#{params})
|
152
|
-
block = model_class_methods[#{m.inspect}].to_proc
|
153
|
-
instance_exec(*[#{params_pass}], &block)
|
154
|
-
end
|
155
|
-
eos
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def eval_lambda(arguments, block)
|
160
|
-
eval(%Q[ ->(#{arguments}){ #{block} }],binding, __FILE__, __LINE__)
|
161
|
-
end
|
162
|
-
|
163
|
-
def add_column_names_method
|
164
|
-
klass = create_klass
|
165
|
-
table = table_definition
|
166
|
-
klass.singleton_class.class_eval do
|
167
|
-
define_method(:column_names) do
|
168
|
-
table.column_names
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def create_klass
|
174
|
-
@klass ||= const_class
|
175
|
-
end
|
176
|
-
|
177
|
-
def const_class
|
178
|
-
remove_const(mock_class_name) if class_exists? mock_class_name
|
179
|
-
klass = Object.const_set(mock_class_name, Class.new(::ActiveHash::Base))
|
180
|
-
klass.send(:include, ActiveHash::ARApi)
|
181
|
-
klass.send(:prepend, ModelInstanceMethods) # is a private method for ruby 2.0.0
|
182
|
-
klass.extend ModelClassMethods
|
183
|
-
klass
|
184
|
-
end
|
185
|
-
|
186
|
-
def remove_const(class_name)
|
187
|
-
Object.send(:remove_const, class_name)
|
188
|
-
end
|
189
|
-
|
190
|
-
def class_exists?(class_name)
|
191
|
-
klass = Module.const_get(class_name)
|
192
|
-
return klass.is_a?(Class)
|
193
|
-
rescue NameError
|
194
|
-
return false
|
195
|
-
end
|
196
|
-
|
197
|
-
def mock_class_name
|
198
|
-
"#{model_name}Mock"
|
199
|
-
end
|
200
|
-
|
201
|
-
end
|
202
|
-
|
203
|
-
module ModelInstanceMethods
|
204
|
-
|
205
|
-
def mock_instance_method(method, &block)
|
206
|
-
model_instance_methods[method] = block
|
207
|
-
end
|
208
|
-
|
209
|
-
def inspect
|
210
|
-
inspection = self.class.column_names.map { |name|
|
211
|
-
"#{name}: #{attribute_for_inspect(name)}"
|
212
|
-
}.compact.join(", ")
|
213
|
-
|
214
|
-
"#<#{self.class} #{inspection}>"
|
215
|
-
end
|
216
|
-
|
217
|
-
def attribute_for_inspect(attr_name)
|
218
|
-
value = self.attributes[attr_name]
|
219
|
-
if value.is_a?(String) && value.length > 50
|
220
|
-
"#{value[0, 50]}...".inspect
|
221
|
-
elsif value.is_a?(Date) || value.is_a?(Time)
|
222
|
-
%("#{value.to_s(:db)}")
|
223
|
-
elsif value.is_a?(Array) && value.size > 10
|
224
|
-
inspected = value.first(10).inspect
|
225
|
-
%(#{inspected[0...-1]}, ...])
|
226
|
-
else
|
227
|
-
value.inspect
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
def hash
|
232
|
-
attributes.hash
|
233
|
-
end
|
234
|
-
|
235
|
-
def ==(obj)
|
236
|
-
hash == obj.attributes.hash
|
237
|
-
end
|
238
|
-
|
239
|
-
private
|
240
|
-
|
241
|
-
def read_attribute(attr)
|
242
|
-
attributes[attr]
|
243
|
-
end
|
244
|
-
|
245
|
-
def write_attribute(attr, value)
|
246
|
-
attributes[attr] = value
|
247
|
-
end
|
248
|
-
|
249
|
-
def read_association(attr)
|
250
|
-
@associations[attr]
|
251
|
-
end
|
252
|
-
|
253
|
-
def write_association(attr, value)
|
254
|
-
@associations[attr] = value
|
255
|
-
end
|
256
|
-
|
257
|
-
def attribute_to_string
|
258
|
-
attributes.map {|k, v| "#{k.to_s}: #{v.inspect}"}.join(', ')
|
259
|
-
end
|
260
|
-
|
261
|
-
def delegate_to_model_instance(method, *args)
|
262
|
-
self.class.send(:delegate_to_model_instance, method, *args)
|
263
|
-
end
|
264
|
-
|
265
|
-
def delegate_to_model_class(method, *args)
|
266
|
-
self.class.send(:delegate_to_model_class, method, *args)
|
267
|
-
end
|
268
|
-
|
269
|
-
def model_instance_methods
|
270
|
-
@model_instance_methods ||= self.class.send(:model_methods_template).dup
|
271
|
-
end
|
272
|
-
|
273
|
-
def schema_attributes
|
274
|
-
@schema_attributes ||= self.class.send(:attribute_template).dup
|
275
|
-
end
|
276
|
-
|
277
|
-
end
|
278
|
-
|
279
|
-
module ModelClassMethods
|
280
|
-
|
281
|
-
def mock_instance_method(method, &block)
|
282
|
-
model_methods_template[method] = block
|
283
|
-
end
|
284
|
-
|
285
|
-
def mock_class_method(method, &block)
|
286
|
-
model_class_methods[method] = block
|
287
|
-
end
|
288
|
-
|
289
|
-
def column_names
|
290
|
-
schema_attributes_template
|
291
|
-
end
|
292
|
-
|
293
|
-
private
|
294
|
-
|
295
|
-
def delegate_to_model_instance(method, *args)
|
296
|
-
model_class_instance.send(method, *args)
|
297
|
-
end
|
298
|
-
|
299
|
-
def delegate_to_model_class(method, *args)
|
300
|
-
model_class.send(method, *args)
|
301
|
-
end
|
302
|
-
|
303
|
-
def model_class_methods
|
304
|
-
@model_class_methods ||= HashWithIndifferentAccess.new
|
305
|
-
end
|
306
|
-
|
307
|
-
def model_methods_template
|
308
|
-
@model_methods_template ||= HashWithIndifferentAccess.new
|
309
|
-
end
|
310
|
-
|
311
|
-
def schema_attributes_template
|
312
|
-
@schema_attributes_template ||= HashWithIndifferentAccess.new
|
313
|
-
end
|
314
|
-
|
315
|
-
def model_class
|
316
|
-
@model_class
|
317
|
-
end
|
318
|
-
|
319
|
-
def model_class_instance
|
320
|
-
@model_class_instance ||= model_class.new
|
321
|
-
end
|
322
|
-
|
323
|
-
def attribute_names
|
324
|
-
@attribute_names
|
325
|
-
end
|
326
|
-
|
327
|
-
def attribute_names=(attributes)
|
328
|
-
@attribute_names = attributes.map{|a| a.to_sym}
|
329
|
-
end
|
330
|
-
|
331
|
-
def attribute_template
|
332
|
-
return @attribute_template unless @attribute_template.nil?
|
333
|
-
@attribute_template = HashWithIndifferentAccess.new
|
334
|
-
attribute_names.each {|a| @attribute_template[a] = nil}
|
335
|
-
return @attribute_template
|
336
|
-
end
|
337
|
-
|
338
|
-
def association_names
|
339
|
-
@association_names
|
340
|
-
end
|
341
|
-
|
342
|
-
def association_names=(associations)
|
343
|
-
@association_names = associations.map{|a| a.to_sym}
|
344
|
-
end
|
345
|
-
|
346
|
-
def association_template
|
347
|
-
return @association_template unless @association_template.nil?
|
348
|
-
@association_template = HashWithIndifferentAccess.new
|
349
|
-
association_names.each {|a| @association_template[a] = nil}
|
350
|
-
return @association_template
|
351
|
-
end
|
352
|
-
|
353
|
-
end
|
354
|
-
|
355
|
-
end
|
356
|
-
|