active_mocker 1.1.9 → 1.1.10

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 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