lego 0.0.5 → 0.0.6

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,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