friendly-attributes 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/VERSION +1 -1
- data/friendly-attributes.gemspec +2 -1
- data/lib/friendly_attributes/class_methods.rb +17 -2
- data/lib/friendly_attributes/details_delegator.rb +1 -1
- data/spec/friendly_attributes/class_methods_spec.rb +45 -3
- data/spec/friendly_attributes/details_delegator_spec.rb +62 -51
- data/spec/friendly_attributes_spec.rb +4 -1
- data/spec/spec_helper.rb +1 -1
- metadata +4 -3
data/CHANGELOG.md
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/friendly-attributes.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{friendly-attributes}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Istvan Hoka"]
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
+
"CHANGELOG.md",
|
21
22
|
"Gemfile",
|
22
23
|
"Gemfile.lock",
|
23
24
|
"LICENSE.txt",
|
@@ -1,7 +1,22 @@
|
|
1
1
|
module FriendlyAttributes
|
2
2
|
module ClassMethods
|
3
|
-
def friendly_details(
|
4
|
-
|
3
|
+
def friendly_details(*args, &block)
|
4
|
+
klass = args.shift
|
5
|
+
options = args.extract_options!
|
6
|
+
|
7
|
+
delegate_options = proc {
|
8
|
+
options.each do |key, value|
|
9
|
+
if Array === value
|
10
|
+
value.each { |v| delegated_attribute v, key }
|
11
|
+
else
|
12
|
+
delegated_attribute value, key
|
13
|
+
end
|
14
|
+
end
|
15
|
+
}
|
16
|
+
|
17
|
+
DetailsDelegator.new(klass, self, &block).tap do |dd|
|
18
|
+
dd.instance_eval(&delegate_options)
|
19
|
+
end
|
5
20
|
end
|
6
21
|
|
7
22
|
def friendly_mount_uploader(name, klass)
|
@@ -14,9 +14,51 @@ describe FriendlyAttributes::ClassMethods do
|
|
14
14
|
class FakeUploader; end
|
15
15
|
|
16
16
|
describe ".friendly_details" do
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
let(:options) do
|
18
|
+
{
|
19
|
+
String => :foo,
|
20
|
+
Integer => [:bar, :baz]
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
before(:each) do
|
25
|
+
details_delegator.stub(:delegated_attribute)
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with an initializer block" do
|
29
|
+
it "instantiates a new DetailsDelegator" do
|
30
|
+
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model, &initializer).and_return(details_delegator)
|
31
|
+
ar_model.friendly_details(friendly_model, &initializer).should == details_delegator
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with an initializer block and options" do
|
36
|
+
before(:each) do
|
37
|
+
FriendlyAttributes::DetailsDelegator.stub(:new => details_delegator)
|
38
|
+
end
|
39
|
+
|
40
|
+
def do_details
|
41
|
+
ar_model.friendly_details(friendly_model, options, &initializer).should == details_delegator
|
42
|
+
end
|
43
|
+
|
44
|
+
it "instantiates a new DetailsDelegator" do
|
45
|
+
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model, &initializer).and_return(details_delegator)
|
46
|
+
do_details
|
47
|
+
end
|
48
|
+
|
49
|
+
it "delegates the attributes passed in the options" do
|
50
|
+
details_delegator.should_receive(:delegated_attribute).with(:foo, String)
|
51
|
+
details_delegator.should_receive(:delegated_attribute).with(:bar, Integer)
|
52
|
+
details_delegator.should_receive(:delegated_attribute).with(:baz, Integer)
|
53
|
+
do_details
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "without a block" do
|
58
|
+
it "instantiates a new DetailsDelegator" do
|
59
|
+
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model).and_return(details_delegator)
|
60
|
+
ar_model.friendly_details(friendly_model, options).should == details_delegator
|
61
|
+
end
|
20
62
|
end
|
21
63
|
end
|
22
64
|
|
@@ -11,68 +11,79 @@ describe FriendlyAttributes::DetailsDelegator do
|
|
11
11
|
let(:friendly_instance) { mock(friendly_model) }
|
12
12
|
|
13
13
|
describe "initialization" do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
it "includes Friendly::Document" do
|
20
|
-
friendly_model.ancestors.should include(Friendly::Document)
|
21
|
-
end
|
14
|
+
shared_examples_for "DetailsDelegator initialization" do
|
15
|
+
context "the Friendly model" do
|
16
|
+
before(:each) do
|
17
|
+
details_delegator
|
18
|
+
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
it "includes Friendly::Document" do
|
21
|
+
friendly_model.ancestors.should include(Friendly::Document)
|
22
|
+
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
ar_model.should_receive(:after_save).with(:update_friendly_details)
|
35
|
-
details_delegator
|
36
|
-
end
|
37
|
-
|
38
|
-
it "installs the destroy_friendly_details callback after_destroy" do
|
39
|
-
ar_model.should_receive(:after_destroy).with(:destroy_friendly_details)
|
40
|
-
details_delegator
|
24
|
+
it "adds the active_record_id attribute" do
|
25
|
+
friendly_model.attributes.should include(:active_record_id)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "adds an index to active_record_id" do
|
29
|
+
friendly_model.storage_proxy.index_for_fields([:active_record_id]).should be_an_instance_of(Friendly::Index)
|
30
|
+
end
|
41
31
|
end
|
42
|
-
|
43
|
-
context "
|
44
|
-
|
32
|
+
|
33
|
+
context "the ActiveRecord model" do
|
34
|
+
it "installs the update_friendly_details callback after_save" do
|
35
|
+
ar_model.should_receive(:after_save).with(:update_friendly_details)
|
45
36
|
details_delegator
|
46
37
|
end
|
47
|
-
|
48
|
-
it "
|
49
|
-
|
38
|
+
|
39
|
+
it "installs the destroy_friendly_details callback after_destroy" do
|
40
|
+
ar_model.should_receive(:after_destroy).with(:destroy_friendly_details)
|
41
|
+
details_delegator
|
50
42
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
43
|
+
|
44
|
+
context ".details" do
|
45
|
+
before(:each) do
|
46
|
+
details_delegator
|
47
|
+
end
|
48
|
+
|
49
|
+
it "is defined" do
|
50
|
+
ar_instance.should respond_to(:details)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "finds and memoizes the associated Friendly model" do
|
54
|
+
friendly_model.should_receive(:find_or_build_by_active_record_id).with(ar_instance.id).once.and_return(friendly_instance)
|
55
|
+
ar_instance.details.should == friendly_instance
|
56
|
+
ar_instance.details.should == friendly_instance
|
57
|
+
end
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
61
|
+
|
62
|
+
context "missing initialization block" do
|
63
|
+
let(:details_delegator) { FriendlyAttributes::DetailsDelegator.new(friendly_model, ar_model) }
|
64
|
+
it_should_behave_like "DetailsDelegator initialization"
|
65
|
+
end
|
59
66
|
|
60
|
-
context "
|
61
|
-
|
62
|
-
@yielded_instance = instance
|
63
|
-
end
|
67
|
+
context "with initialization block" do
|
68
|
+
it_should_behave_like "DetailsDelegator initialization"
|
64
69
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
context "the initialization block" do
|
71
|
+
def yielded_inside(instance)
|
72
|
+
@yielded_instance = instance
|
73
|
+
end
|
74
|
+
|
75
|
+
let(:initializer) do
|
76
|
+
example = self
|
77
|
+
|
78
|
+
proc {
|
79
|
+
example.yielded_inside(self)
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
it "is instance evaled" do
|
84
|
+
details_delegator
|
85
|
+
@yielded_instance.should == details_delegator
|
86
|
+
end
|
76
87
|
end
|
77
88
|
end
|
78
89
|
end
|
@@ -5,7 +5,7 @@ describe FriendlyAttributes do
|
|
5
5
|
|
6
6
|
describe "creating" do
|
7
7
|
context "with Friendly attributes" do
|
8
|
-
let(:user) { User.create(:name => "Stan", :email => "stan@example.com") }
|
8
|
+
let(:user) { User.create(:name => "Stan", :email => "stan@example.com", :birth_year => 1984, :shoe_size => 42, :subscribed => true) }
|
9
9
|
|
10
10
|
it "creates an associated Details model with the AR model" do
|
11
11
|
expect do
|
@@ -14,6 +14,9 @@ describe FriendlyAttributes do
|
|
14
14
|
|
15
15
|
user_detail = user.details
|
16
16
|
user_detail.name.should == "Stan"
|
17
|
+
user_detail.birth_year.should == 1984
|
18
|
+
user_detail.shoe_size.should == 42
|
19
|
+
user_detail.subscribed.should be_true
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
data/spec/spec_helper.rb
CHANGED
@@ -41,7 +41,7 @@ RSpec.configure do |config|
|
|
41
41
|
class ::User < ActiveRecord::Base
|
42
42
|
include FriendlyAttributes
|
43
43
|
|
44
|
-
friendly_details
|
44
|
+
friendly_details(UserDetails, { Integer => [:birth_year, :shoe_size], Friendly::Boolean => :subscribed }) do
|
45
45
|
delegated_attribute :name, String
|
46
46
|
end
|
47
47
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: friendly-attributes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Istvan Hoka
|
@@ -345,6 +345,7 @@ extra_rdoc_files:
|
|
345
345
|
- README.rdoc
|
346
346
|
files:
|
347
347
|
- .document
|
348
|
+
- CHANGELOG.md
|
348
349
|
- Gemfile
|
349
350
|
- Gemfile.lock
|
350
351
|
- LICENSE.txt
|