dupe 0.4.4 → 0.4.5

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/README.rdoc CHANGED
@@ -192,7 +192,7 @@ Now, every time we create a book, it will get assigned a random ISBN number:
192
192
  irb# b = Dupe.create :book
193
193
  ==> <#Duped::Book author=nil title="Untitled" id=2 isbn=606472>
194
194
 
195
- Another common use of this feature is for associations. Lets suppose we'd like to make sure that a book always has a genre, but a genre should be it's own resource. We can accomplish that by taking advantage of Dupe's "find_or_create" method:
195
+ Another common use of this feature is for associations. Lets suppose we'd like to make sure that a book always has a genre, but a genre should be its own resource. We can accomplish that by taking advantage of Dupe's "find_or_create" method:
196
196
 
197
197
  irb# Dupe.define :book do |attrs|
198
198
  --# attrs.title 'Untitled'
@@ -260,6 +260,26 @@ Now, let's create a book:
260
260
  irb# b.publish_date.class
261
261
  ==> Date
262
262
 
263
+
264
+ === Uniquify attributes
265
+
266
+ If you'd just like to make sure that some attributes get a unique value (probably), then you can use the uniquify
267
+ method:
268
+
269
+ irb# Dupe.define :book do |attrs|
270
+ --# attrs.uniquify :title, :genre, :author
271
+ --# end
272
+
273
+ Now, Dupe will do its best to assign unique values to the :title, :genre, and :author attributes on
274
+ any records it creates:
275
+
276
+ irb# b = Dupe.create :book
277
+ ==> <#Duped::Book author="book 1 author" title="book 1 title" genre="book 1 genre" id=1>
278
+
279
+ irb# b2 = Dupe.create :book, :title => 'Rooby'
280
+ ==> <#Duped::Book author="book 2 author" title="Rooby" genre="book 2 genre" id=2>
281
+
282
+
263
283
  === Callbacks
264
284
 
265
285
  Suppose we'd like to make sure that our books get a unique label. We can accomplish that with an after_create callback:
data/lib/dupe/dupe.rb CHANGED
@@ -51,7 +51,7 @@ class Dupe
51
51
  # irb# b = Dupe.create :book
52
52
  # ==> <#Duped::Book author=nil title="Untitled" id=2 isbn=606472>
53
53
  #
54
- # Another common use of this feature is for associations. Lets suppose we'd like to make sure that a book always has a genre, but a genre should be it's own resource. We can accomplish that by taking advantage of Dupe's "find_or_create" method:
54
+ # Another common use of this feature is for associations. Lets suppose we'd like to make sure that a book always has a genre, but a genre should be its own resource. We can accomplish that by taking advantage of Dupe's "find_or_create" method:
55
55
  #
56
56
  # irb# Dupe.define :book do |attrs|
57
57
  # --# attrs.title 'Untitled'
@@ -118,7 +118,29 @@ class Dupe
118
118
  #
119
119
  # irb# b.publish_date.class
120
120
  # ==> Date
121
+ #
122
+ #
123
+ #
124
+ # === Uniquify attributes
125
+ #
126
+ # If you'd just like to make sure that some attributes get a unique value, then you can use the uniquify
127
+ # method:
128
+ #
129
+ # irb# Dupe.define :book do |attrs|
130
+ # --# attrs.uniquify :title, :genre, :author
131
+ # --# end
121
132
  #
133
+ # Now, Dupe will do its best to assign unique values to the :title, :genre, and :author attributes on
134
+ # any records it creates:
135
+ #
136
+ # irb# b = Dupe.create :book
137
+ # ==> <#Duped::Book author="book 1 author" title="book 1 title" genre="book 1 genre" id=1>
138
+ #
139
+ # irb# b2 = Dupe.create :book, :title => 'Rooby'
140
+ # ==> <#Duped::Book author="book 2 author" title="Rooby" genre="book 2 genre" id=2>
141
+ #
142
+ #
143
+ #
122
144
  # === Callbacks
123
145
  #
124
146
  # Suppose we'd like to make sure that our books get a unique label. We can accomplish that with an after_create callback:
data/lib/dupe/schema.rb CHANGED
@@ -31,6 +31,22 @@ class Dupe
31
31
 
32
32
  @after_create_callbacks << block
33
33
  end
34
+
35
+ def uniquify(*args)
36
+ raise ArgumentError, "You must pass at least one attribute to uniquify." if args.empty?
37
+ raise ArgumentError, "You may only pass symbols to uniquify." unless all_members_of_class(args, Symbol)
38
+
39
+ args.each do |attribute|
40
+ after_create do |record|
41
+ record[attribute] = "#{record.__model__.name} #{record.id} #{attribute}" unless record[attribute]
42
+ end
43
+ end
44
+ end
45
+
46
+ private
47
+ def all_members_of_class(ary, klass)
48
+ ary.inject(true) {|bool, v| bool && v.kind_of?(klass)}
49
+ end
34
50
  end
35
51
  end
36
- end
52
+ end
@@ -213,6 +213,27 @@ describe Dupe do
213
213
  bs.last['test'].should == nil
214
214
  end
215
215
  end
216
+
217
+ describe "create resources with unique attributes" do
218
+ before do
219
+ Dupe.define :book do |book|
220
+ book.uniquify :title, :author, :genre
221
+ end
222
+ end
223
+
224
+ it "should uniquify the appropriate columns if they don't already have values" do
225
+ b = Dupe.create :book
226
+ b.title.should == "book 1 title"
227
+ b.author.should == "book 1 author"
228
+ b.genre.should == "book 1 genre"
229
+
230
+ b = Dupe.create :book, :title => 'Rooby Rocks', :isbn => 1
231
+ b.title.should == 'Rooby Rocks'
232
+ b.author.should == "book 2 author"
233
+ b.genre.should == "book 2 genre"
234
+ b.isbn.should == 1
235
+ end
236
+ end
216
237
 
217
238
  describe "find" do
218
239
  before do
@@ -340,4 +361,4 @@ describe Dupe do
340
361
  end
341
362
 
342
363
  end
343
- end
364
+ end
@@ -87,4 +87,23 @@ describe Dupe::Model::Schema do
87
87
  end
88
88
 
89
89
  end
90
- end
90
+
91
+ describe "#uniquify" do
92
+ before do
93
+ @schema = Dupe::Model::Schema.new
94
+ end
95
+
96
+ it "should only accept a list of symbols" do
97
+ proc { @schema.uniquify }.should raise_error(ArgumentError, "You must pass at least one attribute to uniquify.")
98
+ proc { @schema.uniquify :hash => 'value' }.should raise_error(ArgumentError, "You may only pass symbols to uniquify.")
99
+ proc { @schema.uniquify :one, :two}.should_not raise_error
100
+ end
101
+
102
+ it "should create after_create_callbacks for each symbol passed to it" do
103
+ @schema.after_create_callbacks.should be_empty
104
+ @schema.uniquify :title, :label
105
+ @schema.after_create_callbacks.length.should == 2
106
+ @schema.after_create_callbacks.first.should be_kind_of(Proc)
107
+ end
108
+ end
109
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dupe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Parker
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-03 00:00:00 -05:00
12
+ date: 2010-01-25 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency