lego 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f79015b4662b0c8d1e004410950275e887cab739
4
+ data.tar.gz: 18d9a62cc10a1de37489bd00d660141063728dfe
5
+ SHA512:
6
+ metadata.gz: 2b27fb559b3c0640acd2af7327205b373618b238dc112cc77e4b8a9fd1a2b24da5c849aca075ed83bbc6b4dd50c256784d11c7b0d3cc4a20d5bcade73a2952bb
7
+ data.tar.gz: 451fccb9ad32d000e22a01ff8f7e0aa9678660dabdd0f65507efbb9d9275a30d702c9a968316c97a31fb0242aaea3a99be944552418b24dc7148361a106b26ac
@@ -12,10 +12,10 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "lego"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = '0.0.5'
15
+ gem.version = '0.0.6'
16
16
 
17
17
  gem.add_dependency 'activesupport'
18
18
 
19
19
  gem.add_development_dependency "rake"
20
- gem.add_development_dependency "rspec"
20
+ gem.add_development_dependency "rspec", '~> 2.14.1'
21
21
  end
@@ -18,15 +18,23 @@ module Lego::Value
18
18
  private
19
19
 
20
20
  def parse_items(items)
21
+ errors = []
22
+
21
23
  items = items.map do |item|
22
24
  new_item = @_item_parser.parse(item)
23
25
  if new_item.value?
26
+ errors << nil
24
27
  new_item.value
25
28
  else
26
- return new_item
29
+ errors << new_item.error
27
30
  end
28
31
  end
29
- Lego.just(items)
32
+
33
+ if errors.compact.empty?
34
+ Lego.just(items)
35
+ else
36
+ Lego.fail(errors)
37
+ end
30
38
  end
31
39
 
32
40
  def check_length?
@@ -19,16 +19,24 @@ module Lego::Value
19
19
  private
20
20
 
21
21
  def parse_items(set)
22
+ errors = []
23
+
22
24
  new_set = ::Set.new
23
25
  set.each do |item|
24
26
  new_item = @_item_parser.parse(item)
25
27
  if new_item.value?
28
+ errors << nil
26
29
  new_set << new_item.value
27
30
  else
28
- return new_item
31
+ errors << new_item.error
29
32
  end
30
33
  end
31
- Lego.just(new_set)
34
+
35
+ if errors.compact.empty?
36
+ Lego.just(new_set)
37
+ else
38
+ Lego.fail(errors)
39
+ end
32
40
  end
33
41
 
34
42
  def allow_empty?
@@ -6,7 +6,8 @@ module Lego::Value
6
6
  ->(v) { v.respond_to?(:to_str) ? Lego.just(v.to_str) : Lego.fail("invalid string: '#{v}'") },
7
7
  ->(v) { strip? ? Lego.just(v.strip) : Lego.just(v) },
8
8
  ->(v) { (not allow_blank? and v.blank?) ? Lego.none : Lego.just(v) },
9
- ->(v) { check_regexp? ? assert_regexp(v) : Lego.just(v) }
9
+ ->(v) { check_regexp? ? assert_regexp(v) : Lego.just(v) },
10
+ ->(v) { whitelist? ? assert_whitelist(v) : Lego.just(v) }
10
11
  ]
11
12
  end
12
13
 
@@ -18,6 +19,10 @@ module Lego::Value
18
19
  @opts.fetch(:strip, true)
19
20
  end
20
21
 
22
+ def whitelist?
23
+ !!@opts.fetch(:allow, false)
24
+ end
25
+
21
26
  private
22
27
 
23
28
  def check_regexp?
@@ -33,5 +38,14 @@ module Lego::Value
33
38
  end
34
39
  end
35
40
 
41
+ def assert_whitelist(v)
42
+ whitelist = Array(@opts.fetch(:allow))
43
+ if whitelist.include?(v)
44
+ Lego.just(v)
45
+ else
46
+ Lego.fail("not allowed: '#{v}'")
47
+ end
48
+ end
49
+
36
50
  end
37
51
  end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'date'
3
+ require 'set'
3
4
 
4
5
  describe Lego::Model do
5
6
 
@@ -196,6 +197,39 @@ describe Lego::Model do
196
197
  klass.parse(start: today.to_s, stop: (today + 2).to_s).should be_error(start: 'at least 3 days after')
197
198
  klass.parse(start: today.to_s, stop: (today + 3).to_s).should be_value
198
199
  end
200
+
201
+ it 'validates custom requirements for groups' do
202
+ klass = Class.new(Lego::Model) do
203
+ attribute :people, Array, Person
204
+
205
+ validates :people, :check_unique_names
206
+
207
+ def check_unique_names
208
+ names, errors = Set.new, []
209
+
210
+ people.map do |person|
211
+ if names.include?(person.name)
212
+ errors << {name: 'must be unique'}
213
+ else
214
+ names << person.name
215
+ errors << nil
216
+ end
217
+ end
218
+
219
+ if errors.compact.empty?
220
+ Lego.just(self)
221
+ else
222
+ Lego.fail(errors)
223
+ end
224
+ end
225
+ end
226
+
227
+ alice = Person.coerce(name: 'Alice', age: '10')
228
+ alice2 = Person.coerce(name: 'Alice', age: '50')
229
+ bob = Person.coerce(name: 'Bob', age: '50')
230
+ klass.parse(people: [alice, alice2]).should be_error(people: [nil, {name: 'must be unique'}])
231
+ klass.parse(people: [alice, bob]).should be_value
232
+ end
199
233
  end
200
234
 
201
235
  it 'correctly handles array values' do
@@ -13,7 +13,7 @@ describe Lego::Value::Array do
13
13
  context 'invalid array or item' do
14
14
  specify { subject.parse('').should be_error("invalid array: ''") }
15
15
  specify { subject.parse('2012-02').should be_error("invalid array: '2012-02'") }
16
- specify { subject.parse(['one', 123, 'two']).should be_error("invalid string: '123'") }
16
+ specify { subject.parse(['one', 123, 'two']).should be_error([nil, "invalid string: '123'", nil]) }
17
17
  end
18
18
 
19
19
  it 'parses array' do
@@ -63,7 +63,7 @@ describe Lego::Value::Array do
63
63
 
64
64
  context 'failure' do
65
65
  it 'raises error' do
66
- expect{ subject.coerce([123]) }.to raise_error(Lego::CoerceError, "invalid string: '123'")
66
+ expect{ subject.coerce([123]) }.to raise_error(Lego::CoerceError, ["invalid string: '123'"].inspect)
67
67
  end
68
68
  end
69
69
 
@@ -16,7 +16,7 @@ describe Lego::Value::Set do
16
16
  context 'invalid set or item' do
17
17
  specify { subject.parse('').should be_error("invalid set: ''") }
18
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'") }
19
+ specify { subject.parse(['one', 123, 'two']).should be_error([nil, "invalid string: '123'", nil]) }
20
20
  end
21
21
 
22
22
  it 'parses array' do
@@ -65,7 +65,7 @@ describe Lego::Value::Set do
65
65
 
66
66
  context 'failure' do
67
67
  it 'raises error' do
68
- expect{ subject.coerce([123]) }.to raise_error(Lego::CoerceError, "invalid string: '123'")
68
+ expect{ subject.coerce([123]) }.to raise_error(Lego::CoerceError, ["invalid string: '123'"].inspect)
69
69
  end
70
70
  end
71
71
 
@@ -74,6 +74,17 @@ describe Lego::Value::String do
74
74
  its(:allow_blank?){ should == false }
75
75
  its(:strip?){ should == true }
76
76
  end
77
+
78
+ context 'allow' do
79
+ subject { Lego::Value::String.new(allow: %w{mon tue wed thu fri sat sun}) }
80
+
81
+ specify { subject.parse('mon').should be_just('mon') }
82
+ specify { subject.parse('sat').should be_just('sat') }
83
+
84
+ specify { subject.parse('Mon').should be_error("not allowed: 'Mon'") }
85
+ specify { subject.parse('foo').should be_error("not allowed: 'foo'") }
86
+ end
87
+
77
88
  end
78
89
 
79
90
 
metadata CHANGED
@@ -1,64 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lego
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.0.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Norbert Wojtowicz
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-21 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: 2.14.1
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: 2.14.1
62
55
  description: Data building blocks for you app.
63
56
  email:
64
57
  - wojtowicz.norbert@gmail.com
@@ -66,8 +59,8 @@ executables: []
66
59
  extensions: []
67
60
  extra_rdoc_files: []
68
61
  files:
69
- - .gitignore
70
- - .rspec
62
+ - ".gitignore"
63
+ - ".rspec"
71
64
  - Gemfile
72
65
  - Guardfile
73
66
  - LICENSE
@@ -101,33 +94,26 @@ files:
101
94
  - spec/spec_helper.rb
102
95
  homepage: https://github.com/pithyless/lego
103
96
  licenses: []
97
+ metadata: {}
104
98
  post_install_message:
105
99
  rdoc_options: []
106
100
  require_paths:
107
101
  - lib
108
102
  required_ruby_version: !ruby/object:Gem::Requirement
109
- none: false
110
103
  requirements:
111
- - - ! '>='
104
+ - - ">="
112
105
  - !ruby/object:Gem::Version
113
106
  version: '0'
114
- segments:
115
- - 0
116
- hash: 3624199644753223561
117
107
  required_rubygems_version: !ruby/object:Gem::Requirement
118
- none: false
119
108
  requirements:
120
- - - ! '>='
109
+ - - ">="
121
110
  - !ruby/object:Gem::Version
122
111
  version: '0'
123
- segments:
124
- - 0
125
- hash: 3624199644753223561
126
112
  requirements: []
127
113
  rubyforge_project:
128
- rubygems_version: 1.8.23
114
+ rubygems_version: 2.2.2
129
115
  signing_key:
130
- specification_version: 3
116
+ specification_version: 4
131
117
  summary: Data building blocks for you app.
132
118
  test_files:
133
119
  - spec/lego/either/fail_spec.rb