supermodel 0.0.2 → 0.0.4

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.4
@@ -5,6 +5,14 @@ module SuperModel
5
5
  class << self
6
6
  attr_accessor_with_default(:primary_key, 'id') #:nodoc:
7
7
 
8
+ def attributes(*attributes)
9
+ @known_attributes = attributes.map(&:to_s)
10
+ end
11
+
12
+ def known_attributes
13
+ @known_attributes ||= []
14
+ end
15
+
8
16
  def records
9
17
  @records ||= []
10
18
  end
@@ -26,7 +34,7 @@ module SuperModel
26
34
  end
27
35
 
28
36
  def last
29
- item = records[1]
37
+ item = records[-1]
30
38
  item && item.dup
31
39
  end
32
40
 
@@ -66,13 +74,15 @@ module SuperModel
66
74
  rec.save && rec
67
75
  end
68
76
 
69
- def method_missing(method_symbol, *arguments) #:nodoc:
77
+ def method_missing(method_symbol, *args) #:nodoc:
70
78
  method_name = method_symbol.to_s
71
79
 
72
80
  if method_name =~ /^find_by_(\w+)!/
73
- send("find_by_#{$1}", *arguments) || raise(UnknownRecord)
81
+ send("find_by_#{$1}", *args) || raise(UnknownRecord)
74
82
  elsif method_name =~ /^find_by_(\w+)/
75
- records.find {|r| r.send($1) == arguments.first }
83
+ records.find {|r| r.send($1) == args.first }
84
+ elsif method_name =~ /^find_or_create_by_(\w+)/
85
+ send("find_by_#{$1}", *args) || create($1 => args.first)
76
86
  else
77
87
  super
78
88
  end
@@ -81,6 +91,10 @@ module SuperModel
81
91
 
82
92
  attr_accessor :attributes
83
93
 
94
+ def known_attributes
95
+ self.class.known_attributes + self.attributes.keys.map(&:to_s)
96
+ end
97
+
84
98
  def initialize(attributes = {})
85
99
  @attributes = {}.with_indifferent_access
86
100
  load(attributes)
@@ -164,6 +178,8 @@ module SuperModel
164
178
  method_name = method.to_s
165
179
  if attributes.nil?
166
180
  super
181
+ elsif known_attributes.include?(method_name)
182
+ true
167
183
  elsif method_name =~ /(?:=|\?)$/ && attributes.include?($`)
168
184
  true
169
185
  else
@@ -221,6 +237,7 @@ module SuperModel
221
237
  end
222
238
  else
223
239
  return attributes[method_name] if attributes.include?(method_name)
240
+ return nil if known_attributes.include?(method_name)
224
241
  super
225
242
  end
226
243
  end
@@ -229,6 +246,8 @@ module SuperModel
229
246
  class Base
230
247
  extend ActiveModel::Naming
231
248
  include ActiveModel::Conversion
249
+ include ActiveModel::Serializers::JSON
250
+ include ActiveModel::Serializers::Xml
232
251
  include Observing, Validations, Callbacks
233
252
  end
234
253
  end
@@ -1,15 +1,20 @@
1
1
  module SuperModel
2
- module Scriber
3
- def klasses
4
- @klasses ||= []
5
- end
6
- module_function :klasses
7
-
8
- class Observer < ActiveModel::Observer
9
- def self.observed_classes
10
- Scriber.klasses
11
- end
2
+ module Scriber
3
+ class Observer
4
+ include Singleton
12
5
 
6
+ class << self
7
+ def disabled?
8
+ @disabled
9
+ end
10
+
11
+ def disable(&block)
12
+ @disabled = true
13
+ yield
14
+ @disabled = false
15
+ end
16
+ end
17
+
13
18
  def after_create(rec)
14
19
  rec.class.record(:create, rec.attributes)
15
20
  end
@@ -24,28 +29,45 @@ module SuperModel
24
29
 
25
30
  def after_destroy
26
31
  rec.class.record(:destroy, rec.id)
27
- end
32
+ end
33
+
34
+ def update(observed_method, object) #:nodoc:
35
+ return if self.class.disabled?
36
+ send(observed_method, object) if respond_to?(observed_method)
37
+ end
38
+
39
+ def observed_class_inherited(subclass) #:nodoc:
40
+ subclass.add_observer(self)
41
+ end
28
42
  end
29
43
 
44
+ def klasses
45
+ @klasses ||= []
46
+ end
47
+ module_function :klasses
48
+
30
49
  module Model
31
50
  def self.included(base)
32
51
  Scriber.klasses << base
33
52
  base.extend ClassMethods
53
+ base.add_observer(Observer.instance)
34
54
  end
35
55
 
36
56
  module ClassMethods
37
57
  def scribe_play(type, data) #:nodoc:
38
- case type
39
- when :create then create(data)
40
- when :destroy then destroy(data)
41
- when :update then update(data)
42
- else
43
- method = "scribe_play_#{type}"
44
- send(method) if respond_to?(method)
58
+ Observer.disable do
59
+ case type
60
+ when :create then create(data)
61
+ when :destroy then destroy(data)
62
+ when :update then update(data)
63
+ else
64
+ method = "scribe_play_#{type}"
65
+ send(method) if respond_to?(method)
66
+ end
45
67
  end
46
68
  end
47
69
 
48
- def record(type, data)
70
+ def record(type, data = nil)
49
71
  ::Scriber.record(self, type, data)
50
72
  end
51
73
  end
data/supermodel.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{supermodel}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex MacCaw"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: supermodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex MacCaw