lego 0.0.3

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.
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lego::Value::Integer do
4
+
5
+ describe '#parse' do
6
+ subject { Lego::Value::Integer.new(opts) }
7
+
8
+ let(:opts){ {} }
9
+
10
+ context 'nil' do
11
+ specify { subject.parse(nil).should be_nothing }
12
+ specify { subject.parse('').should be_nothing }
13
+ end
14
+
15
+ context 'invalid integer' do
16
+ specify { subject.parse(' ').should be_error("invalid integer: ' '") }
17
+ specify { subject.parse(123.456).should be_error("invalid integer: '123.456'") }
18
+ specify { subject.parse('2012-02').should be_error("invalid integer: '2012-02'") }
19
+ specify { subject.parse('invalid').should be_error("invalid integer: 'invalid'") }
20
+ end
21
+
22
+ it 'parses integer' do
23
+ subject.parse(123).should be_just(123)
24
+ end
25
+
26
+ it 'parses string integer' do
27
+ subject.parse('-134').should be_just(-134)
28
+ end
29
+
30
+ context 'minimum' do
31
+ let(:opts){ { min: 4 } }
32
+ specify { subject.parse(4).should be_just(4) }
33
+ specify { subject.parse(3).should be_error("less than minimum of 4: '3'") }
34
+ end
35
+
36
+ context 'maximum' do
37
+ let(:opts){ { max: 4 } }
38
+ specify { subject.parse(4).should be_just(4) }
39
+ specify { subject.parse(5).should be_error("more than maximum of 4: '5'") }
40
+ end
41
+
42
+ context 'minimium and maximum' do
43
+ let(:opts){ { min: 0, max: 4 } }
44
+ specify { subject.parse(1).should be_just(1) }
45
+ specify { subject.parse(-1).should be_error("less than minimum of 0: '-1'") }
46
+ specify { subject.parse(5).should be_error("more than maximum of 4: '5'") }
47
+ end
48
+ end
49
+
50
+ describe '#coerce' do
51
+ context 'nothing' do
52
+ context 'default' do
53
+ it 'raises error' do
54
+ expect{ subject.coerce(nil) }.to raise_error(Lego::CoerceError, 'missing value')
55
+ expect{ subject.coerce('') }.to raise_error(Lego::CoerceError, 'missing value')
56
+ end
57
+ end
58
+
59
+ context 'with :default handler' do
60
+ subject { Lego::Value::Integer.new(default: handler) }
61
+
62
+ context 'nil handler' do
63
+ let(:handler) { ->{ nil } }
64
+ specify { subject.coerce(nil).should be_nil }
65
+ end
66
+
67
+ context 'lambda handler' do
68
+ let(:handler) { ->{ 42 } }
69
+ specify { subject.coerce('').should == 42 }
70
+ end
71
+ end
72
+ end
73
+
74
+ context 'failure' do
75
+ it 'raises error' do
76
+ expect{ subject.coerce('foo') }.to raise_error(Lego::CoerceError, "invalid integer: 'foo'")
77
+ end
78
+ end
79
+
80
+ context 'success' do
81
+ it 'returns integer' do
82
+ subject.coerce('42').should == 42
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lego::Value::Set do
4
+
5
+ def set(elem)
6
+ Array(elem).to_set
7
+ end
8
+
9
+ subject { Lego::Value::Set.new(:string) }
10
+
11
+ describe '#parse' do
12
+ context 'nil' do
13
+ specify { subject.parse(nil).should be_nothing }
14
+ end
15
+
16
+ context 'invalid set or item' do
17
+ specify { subject.parse('').should be_error("invalid set: ''") }
18
+ specify { subject.parse('2012-02').should be_error("invalid set: '2012-02'") }
19
+ specify { subject.parse(['one', 123, 'two']).should be_error("invalid string: '123'") }
20
+ end
21
+
22
+ it 'parses array' do
23
+ subject.parse(['one']).should be_just(set('one'))
24
+ end
25
+
26
+ it 'parses set' do
27
+ subject.parse(set('one')).should be_just(set('one'))
28
+ end
29
+
30
+ context 'allow empty' do
31
+ subject { Lego::Value::Set.new(:string, allow_empty: true) }
32
+ specify { subject.parse([]).should be_just(set([])) }
33
+ end
34
+
35
+ context 'disallow empty' do
36
+ subject { Lego::Value::Set.new(:string, allow_empty: false) }
37
+ specify { subject.parse([]).should be_nothing }
38
+ end
39
+ end
40
+
41
+ describe '#coerce' do
42
+ context 'missing' do
43
+ it 'raises error' do
44
+ expect{ subject.coerce(nil) }.to raise_error(Lego::CoerceError, 'missing value')
45
+ expect{ subject.coerce([]) }.to raise_error(Lego::CoerceError, 'missing value')
46
+ expect{ subject.coerce([].to_set) }.to raise_error(Lego::CoerceError, 'missing value')
47
+ end
48
+
49
+ context 'with :default handler' do
50
+ subject { Lego::Value::String.new(default: handler) }
51
+
52
+ context 'nil handler' do
53
+ let(:handler) { ->{ nil } }
54
+ specify { subject.coerce(nil).should be_nil }
55
+ end
56
+
57
+ context 'lambda handler' do
58
+ let(:handler) { proc{ Set.new } }
59
+ specify { subject.coerce('').should == [].to_set }
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'failure' do
65
+ it 'raises error' do
66
+ expect{ subject.coerce([123]) }.to raise_error(Lego::CoerceError, "invalid string: '123'")
67
+ end
68
+ end
69
+
70
+ context 'success' do
71
+ it 'returns set' do
72
+ subject.coerce(['foo']).should == set('foo')
73
+ end
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lego::Value::String do
4
+
5
+ describe '#parse' do
6
+ subject { Lego::Value::String.new(opts) }
7
+
8
+ let(:allow_blank) { true }
9
+ let(:strip) { true }
10
+
11
+ let(:opts) do
12
+ {
13
+ allow_blank: allow_blank,
14
+ strip: strip
15
+ }
16
+ end
17
+
18
+ context 'nil' do
19
+ specify { subject.parse(nil).should be_nothing }
20
+ end
21
+
22
+ context 'not a string' do
23
+ specify { subject.parse(Date.new(2012, 12, 26)).should be_error("invalid string: '2012-12-26'") }
24
+ specify { subject.parse(123).should be_error("invalid string: '123'") }
25
+ end
26
+
27
+ context 'allow blank' do
28
+ let(:allow_blank) { true }
29
+
30
+ context 'strip' do
31
+ let(:strip) { true }
32
+ specify { subject.parse('').should be_just('') }
33
+ specify { subject.parse(' ').should be_just('') }
34
+ specify { subject.parse(' foo ').should be_just('foo') }
35
+ end
36
+
37
+ context 'no strip' do
38
+ let(:strip) { false }
39
+ specify { subject.parse('').should be_just('') }
40
+ specify { subject.parse(' ').should be_just(' ') }
41
+ end
42
+ end
43
+
44
+ context 'disallow blank' do
45
+ let(:allow_blank) { false }
46
+
47
+ context 'strip' do
48
+ let(:strip) { true }
49
+ specify { subject.parse('').should be_nothing }
50
+ specify { subject.parse(' ').should be_nothing }
51
+ end
52
+
53
+ context 'no strip' do
54
+ let(:strip) { false }
55
+ specify { subject.parse('').should be_nothing }
56
+ specify { subject.parse(' ').should be_nothing }
57
+ end
58
+ end
59
+
60
+ context 'defaults' do
61
+ subject { Lego::Value::String.new }
62
+
63
+ its(:allow_blank?){ should == false }
64
+ its(:strip?){ should == true }
65
+ end
66
+ end
67
+
68
+
69
+ describe '#coerce' do
70
+ context 'nothing' do
71
+ context 'default' do
72
+ it 'raises error' do
73
+ expect{ subject.coerce(nil) }.to raise_error(Lego::CoerceError, 'missing value')
74
+ expect{ subject.coerce('') }.to raise_error(Lego::CoerceError, 'missing value')
75
+ expect{ subject.coerce(' ') }.to raise_error(Lego::CoerceError, 'missing value')
76
+ end
77
+ end
78
+
79
+ context 'with :default handler' do
80
+ subject { Lego::Value::String.new(default: handler) }
81
+
82
+ context 'nil handler' do
83
+ let(:handler) { ->{ nil } }
84
+ specify { subject.coerce(nil).should be_nil }
85
+ end
86
+
87
+ context 'lambda handler' do
88
+ let(:handler) { ->{ 'missing' } }
89
+ specify { subject.coerce(' ').should == 'missing' }
90
+ end
91
+ end
92
+ end
93
+
94
+ context 'failure' do
95
+ it 'raises error' do
96
+ expect{ subject.coerce(123) }.to raise_error(Lego::CoerceError, "invalid string: '123'")
97
+ end
98
+ end
99
+
100
+ context 'success' do
101
+ it 'returns string' do
102
+ subject.coerce('foo bar').should == 'foo bar'
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../lib/lego'
2
+
3
+ RSpec::Matchers.define :be_nothing do
4
+ match do |actual|
5
+ actual.kind_of?(Lego::Either::None)
6
+ end
7
+
8
+ failure_message_for_should do |actual|
9
+ "Expected <Lego::None>, not #{actual.inspect}"
10
+ end
11
+ end
12
+
13
+ RSpec::Matchers.define :be_error do |expected|
14
+ match do |actual|
15
+ actual.kind_of?(Lego::Either::Fail) and actual.error == expected
16
+ end
17
+
18
+ failure_message_for_should do |actual|
19
+ "Expected <Lego::Either::Fail #{expected.inspect}>, not #{actual.inspect}"
20
+ end
21
+ end
22
+
23
+ RSpec::Matchers.define :be_just do |expected|
24
+ match do |actual|
25
+ actual.kind_of?(Lego::Either::Just) and actual.value == expected
26
+ end
27
+
28
+ failure_message_for_should do |actual|
29
+ "Expected <Lego::Either::Just #{expected.inspect}>, not #{actual.inspect}"
30
+ end
31
+ end
32
+
33
+
34
+ RSpec.configure do |config|
35
+ config.treat_symbols_as_metadata_keys_with_true_values = true
36
+ config.run_all_when_everything_filtered = true
37
+ config.filter_run :focus
38
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lego
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Norbert Wojtowicz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Data building blocks for you app.
63
+ email:
64
+ - wojtowicz.norbert@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - .rspec
71
+ - Gemfile
72
+ - Guardfile
73
+ - LICENSE
74
+ - README.md
75
+ - Rakefile
76
+ - lego.gemspec
77
+ - lib/lego.rb
78
+ - lib/lego/either.rb
79
+ - lib/lego/model.rb
80
+ - lib/lego/value.rb
81
+ - lib/lego/value/base.rb
82
+ - lib/lego/value/boolean.rb
83
+ - lib/lego/value/date.rb
84
+ - lib/lego/value/float.rb
85
+ - lib/lego/value/integer.rb
86
+ - lib/lego/value/set.rb
87
+ - lib/lego/value/string.rb
88
+ - spec/lego/either/fail_spec.rb
89
+ - spec/lego/either/just_spec.rb
90
+ - spec/lego/either/none_spec.rb
91
+ - spec/lego/model_spec.rb
92
+ - spec/lego/value/base_spec.rb
93
+ - spec/lego/value/boolean_spec.rb
94
+ - spec/lego/value/date_spec.rb
95
+ - spec/lego/value/float_spec.rb
96
+ - spec/lego/value/integer_spec.rb
97
+ - spec/lego/value/set_spec.rb
98
+ - spec/lego/value/string_spec.rb
99
+ - spec/spec_helper.rb
100
+ homepage: https://github.com/pithyless/lego
101
+ licenses: []
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ segments:
113
+ - 0
114
+ hash: 179225649257381862
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ segments:
122
+ - 0
123
+ hash: 179225649257381862
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 1.8.23
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: Data building blocks for you app.
130
+ test_files:
131
+ - spec/lego/either/fail_spec.rb
132
+ - spec/lego/either/just_spec.rb
133
+ - spec/lego/either/none_spec.rb
134
+ - spec/lego/model_spec.rb
135
+ - spec/lego/value/base_spec.rb
136
+ - spec/lego/value/boolean_spec.rb
137
+ - spec/lego/value/date_spec.rb
138
+ - spec/lego/value/float_spec.rb
139
+ - spec/lego/value/integer_spec.rb
140
+ - spec/lego/value/set_spec.rb
141
+ - spec/lego/value/string_spec.rb
142
+ - spec/spec_helper.rb