active_mocker 1.1.9 → 1.1.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d9940d5208df11f3cc98ab2172753293c4e6e480
4
- data.tar.gz: 37c61f9c1cf275c9807f0de8b2f3c0bbdceedc30
3
+ metadata.gz: 7bb54273c96a7bc0bd3734d3193ec1993f6a6336
4
+ data.tar.gz: abf486f0dc2c983059a4a2a82eac5061b333430a
5
5
  SHA512:
6
- metadata.gz: c49ea8b615fb04c03e59a75415dba2f906c262917785f8e1c8f5c6a49228425e2959f1c8d23c5819c5a3847c4380753b5b3bf6327528005237bcd1678b183820
7
- data.tar.gz: 540acf96d88c6df5c474e8b69c40d92d3b6d4d4b691a87a71a55f558bf13b60da3ebb6d8e71c2ca48001c883569b317d5479923c32bde557bcef687f86c0cdb7
6
+ metadata.gz: 36401322a2d363a592d8c3cfa6fc7b322765103680b02a0e14e2391bfa0dc70deca69cf247d2ff2cd673c12dd01d119996d69711599af8e555996f41ca0c3859
7
+ data.tar.gz: 17c97729cfe75f2a46ec1bb97f4a751e67a9dd8b12bc8462922f2b549d87a273cf135c20ae22d2b325de67e308c039ea6da97b278fe16b8423a545b1bf6c7d5a
data/README.md CHANGED
@@ -51,17 +51,14 @@ Or install it yourself as:
51
51
  require 'active_mocker'
52
52
 
53
53
  ActiveMocker.configure do |config|
54
- # Required Options
54
+ # Required Options
55
55
  config.schema_file = "#{APP_ROOT}/db/schema.rb"
56
56
  config.model_dir = "#{APP_ROOT}/app/models"
57
- # Additional Options
58
- config.active_hash_as_base = false #default
57
+ # Additional Options
59
58
  config.schema_attributes = true #default
60
- config.model_relationships = true #default
61
- config.model_methods = true #default
62
- config.mass_assignment = true #default
63
- # Logging
64
- config.log_level = Logger::WARN #default
59
+ config.model_attributes = true #default
60
+ # Logging
61
+ config.log_level = Logger::WARN #default
65
62
  end
66
63
 
67
64
  ActiveMocker.mock('Person')
@@ -149,59 +146,28 @@ Or install it yourself as:
149
146
  end
150
147
  => NameError: undefined method `bar' for class `PersonMock'
151
148
 
152
- ### Enable ActiveHash support
153
- ActiveHash is a simple base class that allows you to use a ruby hash as a readonly datasource for an ActiveRecord-like model.
154
- [zilkey/active_hash](https://github.com/zilkey/active_hash)
155
-
156
-
157
- ActiveMocker.configure do |config|
158
- config.active_hash_as_base = true
159
- end
160
-
161
- ActiveMocker.mock('Person').superclass
162
- => ActiveHash::Base
163
-
164
- dustin = PersonMock.create(first_name: 'Dustin')
165
- => #<PersonMock @attributes={:first_name=>"Dustin" :id=>1}>
166
-
167
- PersonMock.all
168
- => [#<PersonMock: @attributes={:first_name=>"Dustin", :id=>1}>]
169
-
170
- dustin.last_name = 'Zeisler'
171
- => "Zeisler"
172
-
173
- dustin.save
174
- => true
175
-
176
- ### Additional ActiveHash extensions for matching ActiveRecord
177
-
178
-
179
- #### #update method
180
-
181
- person = PersonMock.create(first_name: 'Justin')
182
- person.update(first_name: 'Dustin')
183
-
184
- person.first_name
185
- => 'Dustin'
186
-
187
-
188
- #### ::destroy_all
189
-
190
- PersonMock.create
191
- PersonMock.count
192
- => 1
193
-
194
- PersonMock.destroy_all
195
- PersonMock.count
196
- => 0
197
-
198
-
199
- #### ::find_by
200
-
201
- person = PersonMock.create(first_name: 'Dustin')
202
- PersonMock.find_by(first_name: 'Dustin') == person
203
- => true
204
-
149
+ ### ActiveRecord supported methods
150
+ **class methods**
151
+ * new
152
+ * create
153
+ * column_names
154
+ * find
155
+ * find_by
156
+ * find_by!
157
+ * find_or_create_by
158
+ * find_or_initialize_by
159
+ * where - (only supports hash input)
160
+ * delete_all/destroy_all
161
+ * all
162
+ * count
163
+ * first/last
164
+
165
+ **instance methods**
166
+ * attributes
167
+ * update
168
+ * save
169
+ * write_attribute - (private)
170
+ * read_attribute - (private)
205
171
 
206
172
  ### Known Limitations
207
173
 
@@ -20,14 +20,14 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 2.0.0'
22
22
 
23
- spec.add_runtime_dependency "activesupport", "~>4.0"
23
+ spec.add_runtime_dependency "activerecord", "~>4.1"
24
+ spec.add_runtime_dependency "activesupport", "~>4.1"
24
25
  spec.add_runtime_dependency "active_hash", "~>1.3"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 1.5"
27
28
  spec.add_development_dependency "rake", "~>10.1"
28
29
  spec.add_development_dependency "rspec", "~>2.14"
29
30
  spec.add_development_dependency "i18n", "~>0.6"
30
- spec.add_development_dependency "activerecord", "~>4.0"
31
31
  spec.add_development_dependency "sqlite3", "~>1.3"
32
32
 
33
33
  # if ENV['DEBUG'] == '1'
@@ -1,6 +1,7 @@
1
1
  module ActiveHash
2
2
 
3
3
  module ARApi
4
+ require 'active_record/errors'
4
5
 
5
6
  module FindBy
6
7
 
@@ -8,6 +9,12 @@ module ActiveHash
8
9
  send(:where, options).first
9
10
  end
10
11
 
12
+ def find_by!(options={})
13
+ result = find_by(options)
14
+ raise ActiveRecord::RecordNotFound if result.blank?
15
+ result
16
+ end
17
+
11
18
  end
12
19
 
13
20
  end
@@ -5,21 +5,19 @@ module ActiveMocker
5
5
  @@_self = self
6
6
  def_delegators :@@_self,
7
7
  :mass_assignment,
8
- :model_relationships,
9
8
  :schema_attributes,
10
- :model_methods,
11
- :active_hash_as_base,
9
+ :model_attributes,
12
10
  :model_dir,
13
11
  :schema_file,
14
12
  :model_file_reader,
15
- :schema_file_reader
13
+ :schema_file_reader,
14
+ :clear_cache
16
15
 
17
16
  attr_reader :model_name, :klass
18
17
 
19
18
  def initialize(model_name)
20
19
  @model_name = model_name
21
- plain_mock_class unless active_hash_as_base
22
- active_hash_mock_class if active_hash_as_base
20
+ active_hash_mock_class
23
21
  end
24
22
 
25
23
  def self.configure(&block)
@@ -40,10 +38,11 @@ module ActiveMocker
40
38
  end
41
39
 
42
40
  def table_definition
41
+ return @table_definition unless @table_definition.nil?
43
42
  table_name = model_name.tableize
44
- table = SchemaReader.new({schema_file: schema_file, file_reader: schema_file_reader}).search(table_name)
43
+ table = SchemaReader.new({schema_file: schema_file, file_reader: schema_file_reader, clear_cache: clear_cache}).search(table_name)
45
44
  raise "#{table_name} table not found." if table.nil?
46
- return table
45
+ @table_definition = table
47
46
  end
48
47
 
49
48
  def active_hash_mock_class
@@ -57,25 +56,12 @@ module ActiveMocker
57
56
  add_relationships_methods
58
57
  add_column_names_method
59
58
  add_method_mock_of
60
- if model_methods
59
+ if model_attributes
61
60
  add_class_methods
62
61
  add_instance_methods
63
62
  end
64
63
  end
65
64
 
66
- def plain_mock_class
67
- fill_templates
68
- add_method_mock_of
69
- if model_methods
70
- add_class_methods
71
- add_instance_methods
72
- end
73
- add_table_attributes if schema_attributes
74
- add_relationships_methods if model_relationships
75
- add_column_names_method if schema_attributes
76
- create_initializer if mass_assignment
77
- end
78
-
79
65
  def create_initializer
80
66
  klass = create_klass
81
67
  klass.class_eval <<-'eos', __FILE__, __LINE__+1
@@ -120,39 +106,18 @@ module ActiveMocker
120
106
  end
121
107
  end
122
108
 
123
- def add_table_attributes
124
- klass = create_klass
125
- table_definition.column_names.each do |m|
126
-
127
- klass.send(:schema_attributes_template)[m] = nil
128
- begin
129
- klass.class_eval <<-eos, __FILE__, __LINE__+1
130
- def #{m}
131
- read_attribute(#{m.inspect})
132
- end
133
-
134
- def #{m}=(value)
135
- write_attribute(#{m.inspect}, value)
136
- end
137
- eos
138
- rescue SyntaxError
139
- Logger_.debug "ActiveMocker :: Can't create accessor methods for #{m}.\n #{caller}"
140
- end
141
- end
142
- end
143
-
144
109
  def add_relationships_methods
145
110
  klass = create_klass
146
111
  model_definition.relationships.each do |m|
147
112
  klass.send(:schema_attributes_template)[m] = nil
148
113
  begin
149
114
  klass.class_eval <<-eos, __FILE__, __LINE__+1
150
- def #{m}
151
- read_attribute(#{m.inspect})
115
+ def #{m}
116
+ read_association(#{m.inspect})
152
117
  end
153
118
 
154
119
  def #{m}=(value)
155
- write_attribute(#{m.inspect}, value)
120
+ write_association(#{m.inspect}, value)
156
121
  end
157
122
  eos
158
123
  rescue SyntaxError
@@ -216,11 +181,10 @@ module ActiveMocker
216
181
 
217
182
  def const_class
218
183
  remove_const(mock_class_name) if class_exists? mock_class_name
219
- klass = Object.const_set(mock_class_name ,Class.new(::ActiveHash::Base)) if active_hash_as_base
220
- klass.send(:include, ActiveHash::ARApi) if active_hash_as_base
221
- klass = Object.const_set(mock_class_name ,Class.new()) unless active_hash_as_base
184
+ klass = Object.const_set(mock_class_name, Class.new(::ActiveHash::Base))
185
+ klass.send(:include, ActiveHash::ARApi)
186
+ klass.send(:prepend, ModelInstanceMethods) # is a private method for ruby 2.0.0
222
187
  klass.extend ModelClassMethods
223
- klass.send(:include, ModelInstanceMethods) # is a private method for ruby 2.0.0
224
188
  klass
225
189
  end
226
190
 
@@ -247,15 +211,57 @@ module ActiveMocker
247
211
  model_instance_methods[method] = block
248
212
  end
249
213
 
214
+ def inspect
215
+ inspection = self.class.column_names.map { |name|
216
+ "#{name}: #{attribute_for_inspect(name)}"
217
+ }.compact.join(", ")
218
+
219
+ "#<#{self.class} #{inspection}>"
220
+ end
221
+
222
+ def attribute_for_inspect(attr_name)
223
+ value = self.attributes[attr_name]
224
+ if value.is_a?(String) && value.length > 50
225
+ "#{value[0, 50]}...".inspect
226
+ elsif value.is_a?(Date) || value.is_a?(Time)
227
+ %("#{value.to_s(:db)}")
228
+ elsif value.is_a?(Array) && value.size > 10
229
+ inspected = value.first(10).inspect
230
+ %(#{inspected[0...-1]}, ...])
231
+ else
232
+ value.inspect
233
+ end
234
+ end
235
+
236
+ def hash
237
+ attributes.hash
238
+ end
239
+
240
+ def ==(obj)
241
+ hash == obj.attributes.hash
242
+ end
243
+
244
+ private
245
+
250
246
  def read_attribute(attr)
251
- schema_attributes[attr]
247
+ attributes[attr]
252
248
  end
253
249
 
254
250
  def write_attribute(attr, value)
255
- schema_attributes[attr] = value
251
+ attributes[attr] = value
256
252
  end
257
253
 
258
- private
254
+ def read_association(attr)
255
+ @associations[attr]
256
+ end
257
+
258
+ def write_association(attr, value)
259
+ @associations[attr] = value
260
+ end
261
+
262
+ def attribute_to_string
263
+ attributes.map {|k, v| "#{k.to_s}: #{v.inspect}"}.join(', ')
264
+ end
259
265
 
260
266
  def delegate_to_model_instance(method, *args)
261
267
  self.class.send(:delegate_to_model_instance, method, *args)
@@ -5,45 +5,57 @@ module ActiveMocker
5
5
 
6
6
  attr_accessor :schema_file,
7
7
  :model_dir,
8
- :active_hash_as_base,
9
8
  :schema_attributes,
10
- :model_relationships,
11
- :model_methods,
12
- :mass_assignment,
9
+ :model_attributes,
13
10
  :schema_file_reader,
14
- :model_file_reader
11
+ :model_file_reader,
12
+ :clear_cache
15
13
 
16
14
  def config
17
15
  @@first_load ||= reload_default
18
16
  yield self
19
17
  check_required_settings
18
+ require_active_hash
20
19
  end
21
20
 
22
21
  def reload_default
22
+ @log_level = Logger::WARN
23
23
  @schema_file = nil
24
24
  @model_dir = nil
25
- @active_hash_as_base = false
26
25
  @schema_attributes = true
27
- @model_relationships = true
28
- @model_methods = true
29
- @mass_assignment = true
30
- @log_level = Logger::WARN
26
+ @model_attributes = true
27
+ @clear_cache = false
28
+ @schema_file_reader = nil
29
+ @model_file_reader = nil
31
30
  end
32
31
 
33
32
  def check_required_settings
34
- raise 'schema_file must be specified'if schema_file.nil?
35
- raise 'model_dir must be specified'if model_dir.nil?
33
+ raise 'schema_file must be specified' if schema_file.nil?
34
+ raise 'model_dir must be specified' if model_dir.nil?
35
+ end
36
+
37
+ def require_active_hash
38
+ require 'active_hash' if schema_attributes
36
39
  end
37
40
 
38
41
  def log_level=(level)
39
42
  Logger_.level = level
40
43
  end
41
44
 
42
- def active_hash_as_base=(bool)
43
- if bool
44
- require 'active_hash'
45
- end
46
- @active_hash_as_base = bool
45
+ def active_hash_as_base=(arg)
46
+ Logger_.warn('Deprecation Warning: config option `active_hash_as_base` is now model_attributes')
47
+ end
48
+
49
+ def model_relationships=(arg)
50
+ Logger_.warn('Deprecation Warning: config option `model_relationships` is now model_attributes')
51
+ end
52
+
53
+ def model_methods=(arg)
54
+ Logger_.warn('Deprecation Warning: config option `model_methods` is now model_attributes')
55
+ end
56
+
57
+ def mass_assignment=(arg)
58
+ Logger_.warn('Deprecation Warning: config option `mass_assignment` is now model_attributes')
47
59
  end
48
60
 
49
61
  end
@@ -2,11 +2,12 @@ module ActiveMocker
2
2
 
3
3
  class SchemaReader
4
4
 
5
- attr_reader :model_name, :schema_file, :file_reader, :table
5
+ attr_reader :model_name, :schema_file, :file_reader, :table, :clear_cache
6
6
 
7
7
  def initialize(options={})
8
8
  @file_reader = options[:file_reader] ||= FileReader
9
9
  @schema_file = options[:schema_file]
10
+ @clear_cache = options[:clear_cache]
10
11
  end
11
12
 
12
13
  def search(model_name)
@@ -27,6 +28,7 @@ module ActiveMocker
27
28
  end
28
29
 
29
30
  def search_schema_file
31
+ ActiveMocker::ActiveRecord::Schema.clear_cache if clear_cache
30
32
  ActiveMocker::ActiveRecord::Schema.search(table_name)
31
33
  @schema_result = eval_file
32
34
  not_found
@@ -1,3 +1,3 @@
1
1
  module ActiveMocker
2
- VERSION = "1.1.9"
2
+ VERSION = "1.1.10"
3
3
  end
@@ -28,11 +28,9 @@ describe ActiveMocker::Base do
28
28
  config.schema_file_reader = schema_file
29
29
  config.model_file_reader = model_file
30
30
  # Additional Options
31
- #config.active_hash_as_base = false #default
32
- #config.schema_attributes = true #default
33
- #config.model_relationships = true #default
34
- #config.model_methods = true #default
35
- #config.mass_assignment = true #default
31
+ config.schema_attributes = true #default
32
+ config.model_attributes = true #default
33
+ config.clear_cache = true #default
36
34
  # Logging
37
35
  config.log_level = Logger::WARN #default
38
36
  end
@@ -43,10 +41,6 @@ describe ActiveMocker::Base do
43
41
  ActiveMocker.mock('Person')
44
42
  }
45
43
 
46
- after(:each) do
47
- ActiveMocker::Base.reload_default
48
- end
49
-
50
44
  let(:model_file){
51
45
  StringReader.new <<-eos
52
46
  class Person < ActiveRecord::Base
@@ -79,24 +73,6 @@ describe ActiveMocker::Base do
79
73
 
80
74
  end
81
75
 
82
- describe '#read_attribute' do
83
-
84
- it 'will access attributes' do
85
- mock_class.new.read_attribute("800_number")
86
- end
87
-
88
- end
89
-
90
- describe '#write_attribute' do
91
-
92
- it 'will access attributes' do
93
- person = mock_class.new
94
- person.write_attribute("800_number", 100)
95
- expect(person.read_attribute("800_number")).to eq 100
96
- end
97
-
98
- end
99
-
100
76
  describe 'mass_assignment' do
101
77
 
102
78
  it "can pass any or all attributes from schema in initializer" do
@@ -319,18 +295,7 @@ describe ActiveMocker::Base do
319
295
 
320
296
  end
321
297
 
322
- context 'option active_hash_as_base' do
323
-
324
- describe 'true' do
325
-
326
- before(:each) do
327
-
328
- ActiveMocker::Base.configure do |config|
329
- config.active_hash_as_base = true
330
- end
331
-
332
- end
333
- require 'active_hash'
298
+ context 'active_hash' do
334
299
 
335
300
  let(:model_file){
336
301
  StringReader.new <<-eos
@@ -374,20 +339,6 @@ describe ActiveMocker::Base do
374
339
  expect{mock_class.new.bar}.to raise_error '#bar is not Implemented for Class: PersonMock'
375
340
  end
376
341
 
377
- end
378
-
379
- describe 'option active_hash_ext' do
380
-
381
- before(:each) do
382
-
383
- ActiveMocker::Base.configure do |config|
384
- config.active_hash_as_base = true
385
- end
386
-
387
- end
388
-
389
- require 'active_hash'
390
-
391
342
  let(:model_file){
392
343
  StringReader.new <<-eos
393
344
  class Person < ActiveRecord::Base
@@ -404,10 +355,13 @@ describe ActiveMocker::Base do
404
355
 
405
356
  person = mock_class.create(first_name: 'Justin')
406
357
 
358
+ expect(PersonMock.first.first_name).to eq 'Justin'
407
359
  person.update(first_name: 'Dustin')
360
+ expect(PersonMock.first.first_name).to eq 'Dustin'
408
361
 
409
362
  expect(person.first_name).to eq 'Dustin'
410
363
 
364
+
411
365
  end
412
366
 
413
367
  it '::destroy_all' do
@@ -434,6 +388,14 @@ describe ActiveMocker::Base do
434
388
  expect(mock_class.count).to eq 1
435
389
  end
436
390
 
391
+ it '::find_or_create_by with update' do
392
+ mock_class.create(first_name: 'dustin')
393
+ person = mock_class.find_or_create_by(first_name: 'dustin')
394
+ person.update(last_name: 'Zeisler')
395
+ expect(mock_class.first.attributes).to eq person.attributes
396
+ expect(mock_class.count).to eq 1
397
+ end
398
+
437
399
  it '::find_or_initialize_by' do
438
400
  person = mock_class.find_or_initialize_by(first_name: 'dustin')
439
401
  expect(person.persisted?).to eq false
@@ -446,17 +408,6 @@ describe ActiveMocker::Base do
446
408
  mock_class.delete_all
447
409
  end
448
410
 
449
- end
450
-
451
- describe 'false' do
452
- let(:base_options){{active_hash_as_base: false}}
453
-
454
- it 'has object as supper class' do
455
- expect(mock_class.superclass.name).to eq 'Object'
456
-
457
- end
458
-
459
- end
460
411
 
461
412
  end
462
413
 
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_mocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.9
4
+ version: 1.1.10
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-04-12 00:00:00.000000000 Z
11
+ date: 2014-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.1'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activesupport
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '4.0'
33
+ version: '4.1'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '4.0'
40
+ version: '4.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: active_hash
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +108,6 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0.6'
97
- - !ruby/object:Gem::Dependency
98
- name: activerecord
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '4.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '4.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: sqlite3
113
113
  requirement: !ruby/object:Gem::Requirement