typed 0.2.9 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,6 +29,15 @@ module Typed
29
29
  raise Typed::NotDefined, "#{key} is not a member of #{self.class}"
30
30
  end
31
31
  end
32
+
33
+ def ==(other)
34
+ return false unless other.is_a?(self.class)
35
+ return __attrs__ == other.__attrs__
36
+ end
37
+
38
+ def to_s
39
+ __attrs__.inspect
40
+ end
32
41
  end
33
42
  end
34
43
  end
@@ -1,16 +1,33 @@
1
1
  module Typed
2
2
  module Scala
3
3
 
4
- ######################################################################
5
- ### Builder
6
4
  module Builder
5
+ ######################################################################
6
+ ### Build instances
7
+
8
+ # check hash except arg size. (valid: return hash, invalid: raised)
7
9
  def check(hash)
8
10
  build(hash)
9
11
  return hash
10
12
  end
11
13
 
12
- # Build instance from hash
14
+ # check hash strictly. (valid: return hash, invalid: raised)
15
+ def check!(hash)
16
+ build!(hash)
17
+ return hash
18
+ end
19
+
20
+ # Build instance from hash (check only types)
13
21
  def build(hash)
22
+ obj = new
23
+ hash.each_pair do |k,v|
24
+ obj[k] = v if variables[k]
25
+ end
26
+ return obj
27
+ end
28
+
29
+ # Build instance from hash strictly. (check both arg size and types)
30
+ def build!(hash)
14
31
  hash.must(::Hash) { raise ArgumentError, "#{self} expects Hash, but got #{hash.class}" }
15
32
 
16
33
  if hash.size != variables.size
@@ -23,6 +40,7 @@ module Typed
23
40
  raise Typed::SizeMismatch, msg
24
41
  end
25
42
 
43
+ # 'build' just ignore unknown fields, but 'build!' raise errors
26
44
  obj = new
27
45
  hash.each_pair do |k,v|
28
46
  obj[k] = v
@@ -30,12 +48,8 @@ module Typed
30
48
  return obj
31
49
  end
32
50
 
33
- # Build instance from array
51
+ # Build instance from array. (check only types)
34
52
  def apply(*args)
35
- if args.size > variables.size
36
- raise Typed::SizeMismatch, "#{self}.apply expects #{variables.size} args, but got #{args.size}"
37
- end
38
-
39
53
  obj = new
40
54
  variables.each_key do |name|
41
55
  val = args.shift or next
@@ -44,7 +58,7 @@ module Typed
44
58
  return obj
45
59
  end
46
60
 
47
- # Build instance from array strictly. Raised when args size is differ.
61
+ # Build instance from array strictly. (check both arg size and types)
48
62
  def apply!(*args)
49
63
  if args.size != variables.size
50
64
  raise Typed::SizeMismatch, "#{self} expects #{variables.size} args, but got #{args.size}"
@@ -56,6 +70,29 @@ module Typed
56
70
  end
57
71
  return obj
58
72
  end
73
+
74
+ ######################################################################
75
+ ### Extract attrs
76
+
77
+ def attrs(obj)
78
+ obj.must(self).__attrs__
79
+ end
80
+
81
+ def unbuild(obj)
82
+ raise NotImplementedError
83
+ end
84
+
85
+ def unbuild!(obj)
86
+ raise NotImplementedError
87
+ end
88
+
89
+ def unapply(obj)
90
+ raise NotImplementedError
91
+ end
92
+
93
+ def unapply!(obj)
94
+ raise NotImplementedError
95
+ end
59
96
  end
60
97
 
61
98
  end
@@ -1,3 +1,3 @@
1
1
  module Typed
2
- VERSION = "0.2.9"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -26,9 +26,9 @@ describe Typed::Scala do
26
26
  end
27
27
  end
28
28
 
29
- describe ".build" do
29
+ describe ".build!" do
30
30
  context '(:key=>"x", :attrs=>{:a=>1})' do
31
- subject { A.build(:key=>"x", :attrs=>{:a=>1}) }
31
+ subject { A.build!(:key=>"x", :attrs=>{:a=>1}) }
32
32
  its(:key) { should == "x" }
33
33
  its(:attrs) { should == {:a=>1} }
34
34
  end
@@ -25,97 +25,132 @@ describe Typed::Scala do
25
25
  its(:vars) { should be_kind_of ActiveSupport::OrderedHash }
26
26
  its(:vars) { should == { "name" => String, "age" => Fixnum } }
27
27
 
28
- describe ".apply" do
29
- specify "less args" do
30
- user = User.apply("001", "aya")
31
- user.key .should == "001"
32
- user.name.should == "aya"
33
- lambda { user.age}.should raise_error(Typed::NotDefined)
28
+ def check ; User.check(input) ; end
29
+ def check! ; User.check!(input) ; end
30
+ def build ; User.build(input) ; end
31
+ def build! ; User.build!(input) ; end
32
+ def apply ; User.apply(*input) ; end
33
+ def apply! ; User.apply!(*input) ; end
34
+
35
+ ######################################################################
36
+ ### apply(array)
37
+
38
+ describe "from array" do
39
+ let(:input) { ["001", "aya", 12] }
40
+ subject { apply }
41
+
42
+ its(:key ) { should == "001" }
43
+ its(:name) { should == "aya" }
44
+ its(:age ) { should == 12 }
45
+
46
+ context "(complete)" do
47
+ specify do
48
+ expect( apply ).to be_a_kind_of(User)
49
+ expect( apply! ).to be_a_kind_of(User)
50
+ end
34
51
  end
35
52
 
36
- specify "exact args" do
37
- user = User.apply("001", "aya", 12)
38
- user.key .should == "001"
39
- user.name.should == "aya"
40
- user.age .should == 12
53
+ context "(less)" do
54
+ before { input.pop }
55
+ specify do
56
+ expect( apply ).to be_a_kind_of(User)
57
+ expect{ apply! }.to raise_error(Typed::SizeMismatch)
58
+ end
41
59
  end
42
60
 
43
- specify "more args" do
44
- lambda { User.apply("001", "aya", 12, "!") }.should raise_error(/expects 3 args/)
61
+ context "(more)" do
62
+ before { input << "!!!" }
63
+ specify do
64
+ expect( apply ).to be_a_kind_of(User)
65
+ expect{ apply! }.to raise_error(Typed::SizeMismatch)
66
+ end
45
67
  end
46
68
  end
47
69
 
70
+ # use case
48
71
  describe ".apply!" do
49
- specify "less args" do
50
- lambda { User.apply!("001", "aya") }.should raise_error(/expects 3 args/)
51
- end
52
-
53
- specify "exact args" do
54
- user = User.apply!("001", "aya", 12)
55
- user.key .should == "001"
56
- user.name.should == "aya"
57
- user.age .should == 12
58
- end
72
+ subject { User.apply!("turi", "aya", 12) }
59
73
 
60
- specify "more args" do
61
- lambda { User.apply!("001", "aya", 12, "!") }.should raise_error(/expects 3 args/)
62
- end
74
+ its(:key ) { should == "turi" }
75
+ its(:name) { should == "aya" }
76
+ its(:age ) { should == 12 }
63
77
  end
64
78
 
65
- describe ".check" do
66
- before { @hash = {:key=>"turi", :name=>"aya", :age=>12 } }
67
- subject { User.check(@hash) }
79
+ ######################################################################
80
+ ### build(hash)
81
+
82
+ context "(complete hash)" do
83
+ let(:input) { {:key=>"turi", :name=>"aya", :age=>12 } }
68
84
 
69
- specify "(valid hash) return given hash itself" do
70
- expect( subject ).to eq @hash
85
+ specify do
86
+ expect( check ).to eq(input)
87
+ expect( check! ).to eq(input)
88
+ expect( build ).to be_a_kind_of(User)
89
+ expect( build! ).to be_a_kind_of(User)
71
90
  end
91
+ end
72
92
 
73
- specify "(invalid hash) raise errors" do
74
- @hash.clear
75
- expect { subject }.to raise_error(Typed::SizeMismatch)
93
+ context "(less hash)" do
94
+ let(:input) { {:name => "aya"} }
95
+
96
+ specify do
97
+ expect( check ).to eq(input)
98
+ expect{ check! }.to raise_error(Typed::SizeMismatch)
99
+ expect( build ).to be_a_kind_of(User)
100
+ expect{ build! }.to raise_error(Typed::SizeMismatch)
76
101
  end
77
102
  end
78
103
 
104
+ context "(more hash)" do
105
+ let(:input) { {:key=>"turi", :name=>"aya", :age=>12, :state=>true } }
79
106
 
80
- describe ".build" do
81
- specify "(no args) raise ArgumentError" do
82
- expect { User.build }.to raise_error(ArgumentError)
107
+ specify do
108
+ expect( check ).to eq(input)
109
+ expect{ check! }.to raise_error(Typed::SizeMismatch)
110
+ expect( build ).to be_a_kind_of(User)
111
+ expect{ build! }.to raise_error(Typed::SizeMismatch)
83
112
  end
113
+ end
84
114
 
85
- specify "(non hash args) raise ArgumentError" do
86
- expect { User.build([]) }.to raise_error(ArgumentError)
115
+ context "(no args)" do
116
+ specify do
117
+ expect{ User.check }.to raise_error(ArgumentError)
118
+ expect{ User.check! }.to raise_error(ArgumentError)
119
+ expect{ User.build }.to raise_error(ArgumentError)
120
+ expect{ User.build! }.to raise_error(ArgumentError)
87
121
  end
122
+ end
88
123
 
89
- context "(hash)" do
90
- before { @hash = {:key=>"turi", :name=>"aya", :age=>12 } }
91
- subject { User.build(@hash) }
124
+ # use case
125
+ describe ".build!" do
126
+ before { @hash = {:key=>"turi", :name=>"aya", :age=>12 } }
127
+ subject { User.build!(@hash) }
92
128
 
93
- its(:key ) { should == "turi" }
94
- its(:name) { should == "aya" }
95
- its(:age ) { should == 12 }
129
+ its(:key ) { should == "turi" }
130
+ its(:name) { should == "aya" }
131
+ its(:age ) { should == 12 }
96
132
 
97
- specify "when less args, raise Typed::SizeMismatch" do
98
- @hash.delete(:age)
99
- expect { subject }.to raise_error(Typed::SizeMismatch)
100
- expect { subject }.to raise_error(/age/)
101
- end
133
+ specify "when less args, raise Typed::SizeMismatch" do
134
+ @hash.delete(:age)
135
+ expect { subject }.to raise_error(Typed::SizeMismatch)
136
+ expect { subject }.to raise_error(/age/)
137
+ end
102
138
 
103
- specify "when more args, raise Typed::SizeMismatch" do
104
- @hash[:extra] = 10
105
- expect { subject }.to raise_error(Typed::SizeMismatch)
106
- expect { subject }.to raise_error(/extra/)
107
- end
139
+ specify "when more args, raise Typed::SizeMismatch" do
140
+ @hash[:extra] = 10
141
+ expect { subject }.to raise_error(Typed::SizeMismatch)
142
+ expect { subject }.to raise_error(/extra/)
143
+ end
108
144
 
109
- specify "when unknown field, raise Typed::NotDefined" do
110
- @hash.delete(:age)
111
- @hash[:xxx] = 100
112
- expect { subject }.to raise_error(Typed::NotDefined)
113
- end
145
+ specify "when unknown field, raise Typed::NotDefined" do
146
+ @hash.delete(:age)
147
+ @hash[:xxx] = 100
148
+ expect { subject }.to raise_error(Typed::NotDefined)
149
+ end
114
150
 
115
- specify "when type mismatch, raise TypeError" do
116
- @hash[:age] = "!"
117
- expect { subject }.to raise_error(TypeError)
118
- end
151
+ specify "when type mismatch, raise TypeError" do
152
+ @hash[:age] = "!"
153
+ expect { subject }.to raise_error(TypeError)
119
154
  end
120
155
  end
121
156
  end
@@ -65,9 +65,10 @@ describe Typed::Scala do
65
65
  it { should respond_to(:map) }
66
66
  end
67
67
 
68
- describe "#__attrs__" do
69
- subject { User.apply!("001", "aya", 12).__attrs__ }
68
+ describe "attributes" do
69
+ subject { User.attrs(User.apply!("001", "aya", 12)) }
70
70
 
71
+ its(:class ) { should == Hash }
71
72
  its(:size ) { should == 3 }
72
73
  its(:keys ) { should == %w( key name age ) }
73
74
  its(:values) { should == ["001", "aya", 12] }
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe Typed::Scala do
4
+ include_context "scala_source"
5
+
6
+ ######################################################################
7
+ ### Basic usage
8
+
9
+ describe "Kvs" do
10
+ before { scala_source("Kvs", <<-EOF)
11
+ class Kvs
12
+ include Typed::Scala
13
+
14
+ val key = String
15
+ var val = String
16
+ end
17
+ EOF
18
+ }
19
+
20
+ describe "#==" do
21
+ context "(different class)" do
22
+ specify do
23
+ Kvs.new.should_not == Kvs
24
+ Kvs.new.should_not == {}
25
+ Kvs.new.should_not == []
26
+ end
27
+ end
28
+
29
+ context "(blank)" do
30
+ specify do
31
+ Kvs.new.should == Kvs.new
32
+ end
33
+ end
34
+
35
+ context "(full data)" do
36
+ specify do
37
+ Kvs.apply("x", "1").should == Kvs.apply("x", "1")
38
+ Kvs.apply("x", "1").should_not == Kvs.apply("x", "2")
39
+ end
40
+ end
41
+
42
+ context "less data" do
43
+ specify do
44
+ Kvs.apply("x", "1").should_not == Kvs.apply("x")
45
+ Kvs.apply("x", "1").should_not == Kvs.new
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.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-10-26 00:00:00.000000000 Z
12
+ date: 2013-11-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -93,6 +93,7 @@ files:
93
93
  - spec/scala/attrs_spec.rb
94
94
  - spec/scala/build_spec.rb
95
95
  - spec/scala/core_spec.rb
96
+ - spec/scala/equal_spec.rb
96
97
  - spec/scala/inherit_spec.rb
97
98
  - spec/scala/modifier_spec.rb
98
99
  - spec/scala/todo_spec.rb