setsumei 0.0.1 → 0.0.2
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/lib/setsumei/build.rb +1 -1
- data/lib/setsumei/describable/boolean_attribute.rb +4 -1
- data/lib/setsumei/describable/float_attribute.rb +2 -1
- data/lib/setsumei/describable/int_attribute.rb +4 -1
- data/lib/setsumei/describable/object_attribute.rb +10 -3
- data/lib/setsumei/describable/string_attribute.rb +2 -1
- data/lib/setsumei/version.rb +1 -1
- data/spec/setsumei/describable/boolean_attribute_spec.rb +2 -0
- data/spec/setsumei/describable/float_attribute_spec.rb +2 -0
- data/spec/setsumei/describable/int_attribute_spec.rb +2 -0
- data/spec/setsumei/describable/object_attribute_spec.rb +18 -0
- data/spec/setsumei/describable/string_attribute_spec.rb +2 -0
- data/spec/support/shared_examples/attribute_options.rb +7 -0
- data/spec/support/shared_examples/attribute_type_creation.rb +6 -0
- metadata +4 -2
data/lib/setsumei/build.rb
CHANGED
@@ -4,7 +4,7 @@ module Setsumei
|
|
4
4
|
module Build
|
5
5
|
def Build.a(klass,options = {})
|
6
6
|
inform_developer "#{klass} should be able to list its attributes" unless klass.respond_to? :defined_attributes
|
7
|
-
inform_developer "wrong number of arguments, options must include from: data }" unless options.keys.include? :from
|
7
|
+
inform_developer "wrong number of arguments, options must include { from: data }" unless options.keys.include? :from
|
8
8
|
|
9
9
|
klass.new.tap do |object|
|
10
10
|
klass.defined_attributes.each do |_,attribute|
|
@@ -3,12 +3,15 @@ module Setsumei
|
|
3
3
|
class BooleanAttribute
|
4
4
|
|
5
5
|
def BooleanAttribute.named(name, options = {})
|
6
|
+
options = options.dup
|
6
7
|
new.tap do |attribute|
|
7
8
|
attribute.name = name
|
9
|
+
options.delete(:as_a)
|
10
|
+
attribute.options = options
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
|
-
attr_accessor :name
|
14
|
+
attr_accessor :name, :options
|
12
15
|
|
13
16
|
def is_an_attribute_of_type?(type)
|
14
17
|
type == :boolean || type == self.class
|
@@ -5,10 +5,11 @@ module Setsumei
|
|
5
5
|
def FloatAttribute.named(name, options = {})
|
6
6
|
new.tap do |attribute|
|
7
7
|
attribute.name = name
|
8
|
+
attribute.options = options.dup.tap { |o| o.delete :as_a }
|
8
9
|
end
|
9
10
|
end
|
10
11
|
|
11
|
-
attr_accessor :name
|
12
|
+
attr_accessor :name, :options
|
12
13
|
|
13
14
|
def is_an_attribute_of_type?(type)
|
14
15
|
type == :float || type == self.class
|
@@ -2,12 +2,15 @@ module Setsumei
|
|
2
2
|
module Describable
|
3
3
|
class IntAttribute
|
4
4
|
def IntAttribute.named(name, options = {})
|
5
|
+
options = options.dup
|
5
6
|
new.tap do |attribute|
|
6
7
|
attribute.name = name
|
8
|
+
options.delete(:as_a)
|
9
|
+
attribute.options = options
|
7
10
|
end
|
8
11
|
end
|
9
12
|
|
10
|
-
attr_accessor :name
|
13
|
+
attr_accessor :name, :options
|
11
14
|
|
12
15
|
def is_an_attribute_of_type?(type)
|
13
16
|
type == :int || type == self.class
|
@@ -3,14 +3,16 @@ module Setsumei
|
|
3
3
|
class ObjectAttribute
|
4
4
|
|
5
5
|
def ObjectAttribute.named(name,options = {})
|
6
|
+
options = options.dup
|
6
7
|
raise ArgumentError.new("you must specify what the object is") unless options.has_key? :as_a
|
7
8
|
new.tap do |attribute|
|
8
9
|
attribute.name = name
|
9
|
-
attribute.klass = options
|
10
|
+
attribute.klass = options.delete(:as_a)
|
11
|
+
attribute.options = options
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
13
|
-
attr_accessor :name, :klass
|
15
|
+
attr_accessor :name, :klass, :options
|
14
16
|
|
15
17
|
def initialize
|
16
18
|
self.klass = Object
|
@@ -18,7 +20,12 @@ module Setsumei
|
|
18
20
|
|
19
21
|
def value_for(data)
|
20
22
|
return nil if data.nil? || data.empty?
|
21
|
-
|
23
|
+
|
24
|
+
begin
|
25
|
+
self.klass.create_from data
|
26
|
+
rescue NoMethodError
|
27
|
+
Build.a self.klass, from: data
|
28
|
+
end
|
22
29
|
end
|
23
30
|
|
24
31
|
def is_an_attribute_of_type?(type)
|
@@ -4,10 +4,11 @@ module Setsumei
|
|
4
4
|
def StringAttribute.named(name,options = {})
|
5
5
|
new.tap do |attribute|
|
6
6
|
attribute.name = name
|
7
|
+
attribute.options = options.dup.tap { |o| o.delete :as_a }
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
|
-
attr_accessor :name
|
11
|
+
attr_accessor :name, :options
|
11
12
|
|
12
13
|
def is_an_attribute_of_type?(type)
|
13
14
|
type == :string || type == self.class
|
data/lib/setsumei/version.rb
CHANGED
@@ -20,6 +20,8 @@ module Setsumei
|
|
20
20
|
subject { ObjectAttribute.named name }
|
21
21
|
specify { expect { subject }.to raise_error ArgumentError }
|
22
22
|
end
|
23
|
+
|
24
|
+
it_should_behave_like "it handles options properly"
|
23
25
|
end
|
24
26
|
|
25
27
|
describe "#value_for(pre_type_cast_value)" do
|
@@ -27,6 +29,10 @@ module Setsumei
|
|
27
29
|
let(:pre_type_cast_value) { { hash: "with_values" } }
|
28
30
|
let(:object_attribute) { ObjectAttribute.named :name, as_a: klass }
|
29
31
|
|
32
|
+
before do
|
33
|
+
klass.stub(:create_from).and_raise(NoMethodError)
|
34
|
+
end
|
35
|
+
|
30
36
|
subject { object_attribute.value_for pre_type_cast_value }
|
31
37
|
|
32
38
|
it "should use the Builder to produce a object with klass" do
|
@@ -44,6 +50,18 @@ module Setsumei
|
|
44
50
|
it { should be_nil }
|
45
51
|
end
|
46
52
|
end
|
53
|
+
context "klass responds to create_from" do
|
54
|
+
let(:pre_fab_object) { mock "pre_fab_object" }
|
55
|
+
|
56
|
+
before do
|
57
|
+
klass.unstub(:create_from)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should build the klass itself" do
|
61
|
+
klass.should_receive(:create_from).with(pre_type_cast_value).and_return(pre_fab_object)
|
62
|
+
subject.should == pre_fab_object
|
63
|
+
end
|
64
|
+
end
|
47
65
|
end
|
48
66
|
|
49
67
|
describe "#is_an_attribute_of_type?" do
|
@@ -0,0 +1,7 @@
|
|
1
|
+
shared_examples_for "it handles options properly" do
|
2
|
+
its(:options) { should == {} }
|
3
|
+
context "when options are specified" do
|
4
|
+
subject { described_class.named name, as_a: described_class.to_s.downcase.gsub(/(.*::|attribute)/,'').to_sym, with_additional: :options }
|
5
|
+
its(:options) { should == { with_additional: :options } }
|
6
|
+
end
|
7
|
+
end
|
@@ -9,5 +9,11 @@ shared_examples "it creates an attribute of type" do |_type,options|
|
|
9
9
|
subject.define :field, as_a: _type
|
10
10
|
subject.defined_attributes[:field].should be_an_attribute_of_type(_type)
|
11
11
|
end
|
12
|
+
context "where options are specified" do
|
13
|
+
it "should set the options upon the attribute" do
|
14
|
+
subject.define :field, as_a: _type, with: :options
|
15
|
+
subject.defined_attributes[:field].options.should == { with: :options }
|
16
|
+
end
|
17
|
+
end
|
12
18
|
end
|
13
19
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: setsumei
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jon Rowe
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05-
|
13
|
+
date: 2011-05-23 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- spec/setsumei/describable_spec.rb
|
96
96
|
- spec/spec_helper.rb
|
97
97
|
- spec/support/be_an_attribute_of_type_matcher.rb
|
98
|
+
- spec/support/shared_examples/attribute_options.rb
|
98
99
|
- spec/support/shared_examples/attribute_type_creation.rb
|
99
100
|
has_rdoc: true
|
100
101
|
homepage: https://github.com/JonRowe/setsumei
|
@@ -136,4 +137,5 @@ test_files:
|
|
136
137
|
- spec/setsumei/describable_spec.rb
|
137
138
|
- spec/spec_helper.rb
|
138
139
|
- spec/support/be_an_attribute_of_type_matcher.rb
|
140
|
+
- spec/support/shared_examples/attribute_options.rb
|
139
141
|
- spec/support/shared_examples/attribute_type_creation.rb
|