attribution 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/attribution.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "attribution"
5
- gem.version = "0.3.2"
5
+ gem.version = "0.4.0"
6
6
  gem.authors = ["Paul Barry"]
7
7
  gem.email = ["mail@paulbarry.com"]
8
8
  gem.description = %q{Add attributes to Ruby objects}
@@ -1,3 +1,3 @@
1
1
  module Attribution
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/attribution.rb CHANGED
@@ -9,16 +9,8 @@ module Attribution
9
9
  cls.extend(ClassMethods)
10
10
  end
11
11
 
12
- def initialize(attrs={})
13
- attrs = JSON.parse(attrs) if attrs.is_a?(String)
14
- attrs.each do |k,v|
15
- setter = "#{k}="
16
- if respond_to?(setter)
17
- send(setter, v)
18
- else
19
- instance_variable_set("@#{k}", v)
20
- end
21
- end
12
+ def initialize(attributes={})
13
+ self.attributes = attributes
22
14
  end
23
15
 
24
16
  # TODO: Use associations argument as a way to specify which associations should be included
@@ -29,6 +21,20 @@ module Attribution
29
21
  end
30
22
  end
31
23
 
24
+ def attributes=(attributes)
25
+ if attributes
26
+ attributes = JSON.parse(attributes) if attributes.is_a?(String)
27
+ attributes.each do |k,v|
28
+ setter = "#{k}="
29
+ if respond_to?(setter)
30
+ send(setter, v)
31
+ else
32
+ instance_variable_set("@#{k}", v)
33
+ end
34
+ end
35
+ end
36
+ end
37
+
32
38
  module ClassMethods
33
39
  def cast(obj)
34
40
  case obj
@@ -195,21 +201,26 @@ module Attribution
195
201
 
196
202
  def has_many(association_name)
197
203
  # foos
198
- define_method(association_name) do
199
- ivar = "@#{association_name}"
200
- if instance_variable_defined?(ivar)
201
- instance_variable_get(ivar)
202
- else
203
- # TODO: Support a more generic version of lazy-loading
204
- begin
205
- association_class = association_name.to_s.singularize.classify.constantize
206
- rescue NameError => ex
207
- raise ArgumentError.new("Association #{association_name} in #{self.class} is invalid because #{association_name.to_s.classify} does not exist")
208
- end
204
+ define_method(association_name) do |*query|
209
205
 
210
- if association_class.respond_to?(:all)
206
+ # TODO: Support a more generic version of lazy-loading
207
+ begin
208
+ association_class = association_name.to_s.singularize.classify.constantize
209
+ rescue NameError => ex
210
+ raise ArgumentError.new("Association #{association_name} in #{self.class} is invalid because #{association_name.to_s.classify} does not exist")
211
+ end
212
+
213
+ if query.empty? # Ex: Books.all, so we want to cache it.
214
+ ivar = "@#{association_name}"
215
+ if instance_variable_defined?(ivar)
216
+ instance_variable_get(ivar)
217
+ elsif association_class.respond_to?(:all)
211
218
  instance_variable_set(ivar, Array(association_class.all("#{self.class.name.underscore}_id" => id)))
212
219
  end
220
+ else # Ex: Book.all(:name => "The..."), so we do not want to cache it
221
+ if association_class.respond_to?(:all)
222
+ Array(association_class.all({"#{self.class.name.underscore}_id" => id}.merge(query.first)))
223
+ end
213
224
  end
214
225
  end
215
226
 
@@ -28,6 +28,18 @@ class Book
28
28
 
29
29
  belongs_to :book
30
30
  has_many :chapters
31
+ has_many :readers
32
+ end
33
+
34
+ class Reader
35
+ include Attribution
36
+
37
+ integer :id
38
+
39
+ def self.all(query = {})
40
+ query
41
+ end
42
+
31
43
  end
32
44
 
33
45
  class Chapter
@@ -100,6 +112,10 @@ class AttributionTest < Test::Unit::TestCase
100
112
  assert_equal ActiveSupport::TimeZone["Eastern Time (US & Canada)"], book.time_zone
101
113
  assert_equal 1, book.chapters.first.number
102
114
  assert_equal 3, book.chapters.size
115
+ assert_equal ({}), Reader.all
116
+ assert_equal ([['book_id', 1]]), book.readers
117
+ assert_equal ([['book_id', 1], [:name,"julio"]]), book.readers(:name => 'julio')
118
+ assert_equal ([['book_id', 1]]), book.readers # Instance variable caching
103
119
  assert_equal book, book.chapters.first.book
104
120
  end
105
121
 
@@ -182,4 +198,12 @@ class AttributionTest < Test::Unit::TestCase
182
198
  assert_equal nil, book.created_at
183
199
  assert_equal nil, book.time_zone
184
200
  end
201
+
202
+ def test_attributes_setter
203
+ book = Book.new
204
+ book.attributes = { :title => "Whatever", :price => 50 }
205
+ assert_equal "Whatever", book.title
206
+ assert_equal BigDecimal.new("50"), book.price
207
+ assert_equal nil, book.id
208
+ end
185
209
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-07 00:00:00.000000000 Z
12
+ date: 2013-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport