mini_object 0.0.2 → 0.1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -2
- data/README.md +34 -0
- data/lib/indexed_list.rb +72 -0
- data/lib/mini_object.rb +1 -0
- data/lib/version.rb +1 -1
- data/mini_object.gemspec +1 -0
- data/spec/indexed_list_spec.rb +100 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2baad867ef2ce55721742c1931bc49e2d2048fcc
|
4
|
+
data.tar.gz: cd136dba6c44ea7a742e7ee7a99432ee18d77043
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91908461951fa69f42d323e4b6c12529406465e92184d40f4bc0bf54799ef55743919c278227117d74af433187430645c43686c63d0c9df251a60b53e36ce6b1
|
7
|
+
data.tar.gz: c0d0edfff3ae6dd9db5e1c05f4316d681a4e0310d606efcea03388b1a31ab8d429ec5badef612a1a3ca39628a6339b80824ac0225661b5b1fd05a9c6ddeb1235
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mini_object (0.
|
4
|
+
mini_object (0.1.2)
|
5
|
+
forwarding_dsl (~> 1.0)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
@@ -11,6 +12,7 @@ GEM
|
|
11
12
|
coderay (1.1.0)
|
12
13
|
diff-lcs (1.2.5)
|
13
14
|
docile (1.1.5)
|
15
|
+
forwarding_dsl (1.0.1)
|
14
16
|
method_source (0.8.2)
|
15
17
|
multi_json (1.10.1)
|
16
18
|
pry (0.10.1)
|
@@ -45,5 +47,5 @@ DEPENDENCIES
|
|
45
47
|
codeclimate-test-reporter
|
46
48
|
mini_object!
|
47
49
|
pry
|
48
|
-
rake
|
50
|
+
rake (~> 10.4)
|
49
51
|
rspec
|
data/README.md
CHANGED
@@ -99,6 +99,40 @@ In the example, if `app.stores.redis`, the repository
|
|
99
99
|
will inmediately see the new store.
|
100
100
|
|
101
101
|
|
102
|
+
## IndexedList
|
103
|
+
|
104
|
+
An enumerable of objects that makes it easy to create custom collections.
|
105
|
+
It allows to find items by a custom key, similar to a Hash.
|
106
|
+
When iterating through the items it only passes just the object, not the keys.
|
107
|
+
Allows to define a build proc, so you can add new items with the `add_new` method.
|
108
|
+
Plays well with `ForwardingDsl::Getsetter`:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
require 'forwarding_dsl'
|
112
|
+
require 'mini_object'
|
113
|
+
|
114
|
+
class User
|
115
|
+
include ForwardingDsl::Getsetter
|
116
|
+
getsetter :name
|
117
|
+
getsetter :surname
|
118
|
+
end
|
119
|
+
|
120
|
+
users = MiniObject::IndexedList.new.tap do |l|
|
121
|
+
l.key {|user| user.name }
|
122
|
+
l.build { User.new }
|
123
|
+
end
|
124
|
+
|
125
|
+
users.add_new do
|
126
|
+
name 'John'
|
127
|
+
surname 'Smith'
|
128
|
+
end
|
129
|
+
|
130
|
+
users['John'] # => #<User:0x007fd91e05deb8 @name="John", @surname="Smith">
|
131
|
+
|
132
|
+
users.each {|user| puts "#{user.name} #{user.surname}" }
|
133
|
+
# => John Smith
|
134
|
+
```
|
135
|
+
|
102
136
|
## Contributing
|
103
137
|
|
104
138
|
Do not forget to run the tests with:
|
data/lib/indexed_list.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'forwarding_dsl'
|
2
|
+
|
3
|
+
module MiniObject
|
4
|
+
class IndexedList
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@store = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def key &block
|
12
|
+
@key_proc = block
|
13
|
+
end
|
14
|
+
|
15
|
+
def build &block
|
16
|
+
@build_proc = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def << e
|
20
|
+
store[key_for(e)] = e
|
21
|
+
end
|
22
|
+
|
23
|
+
alias add <<
|
24
|
+
|
25
|
+
def add_new &block
|
26
|
+
e = build_new
|
27
|
+
ForwardingDsl.run e, &block
|
28
|
+
add e
|
29
|
+
end
|
30
|
+
|
31
|
+
def [] key
|
32
|
+
store.values.detect {|e| key_for(e) == key }
|
33
|
+
end
|
34
|
+
|
35
|
+
def each &block
|
36
|
+
store.values.each &block
|
37
|
+
end
|
38
|
+
|
39
|
+
def clear
|
40
|
+
store.clear
|
41
|
+
end
|
42
|
+
|
43
|
+
def merge other
|
44
|
+
new = dup
|
45
|
+
|
46
|
+
other.each do |v|
|
47
|
+
new << v
|
48
|
+
end
|
49
|
+
|
50
|
+
new
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize_dup(source)
|
54
|
+
@store = store.dup
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def store
|
61
|
+
@store
|
62
|
+
end
|
63
|
+
|
64
|
+
def key_for e
|
65
|
+
@key_proc.call e
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_new *args
|
69
|
+
@build_proc.call *args
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/mini_object.rb
CHANGED
data/lib/version.rb
CHANGED
data/mini_object.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
+
spec.add_runtime_dependency "forwarding_dsl", "~> 1.0"
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
25
|
spec.add_development_dependency "rake", '~> 10.4'
|
25
26
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'IndexedList' do
|
4
|
+
let(:subject_class) { MiniObject::IndexedList }
|
5
|
+
|
6
|
+
let(:subject_instance) do
|
7
|
+
subject_class.new.tap do |l|
|
8
|
+
l.key {|e| e.name }
|
9
|
+
l.build { OpenStruct.new }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { subject_instance }
|
14
|
+
|
15
|
+
it 'accumulates values with <<' do
|
16
|
+
value = double('value', name: 'Value 1')
|
17
|
+
subject << value
|
18
|
+
expect(subject['Value 1']).to be value
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'accumulates values with add' do
|
22
|
+
value = double('value', name: 'Value 1')
|
23
|
+
subject.add value
|
24
|
+
expect(subject['Value 1']).to be value
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'adds new values' do
|
28
|
+
value = subject.add_new do |e|
|
29
|
+
e.name = 'Value 1'
|
30
|
+
end
|
31
|
+
|
32
|
+
expect(subject['Value 1']).to be value
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'iterates through values' do
|
36
|
+
has_run = false
|
37
|
+
|
38
|
+
value = subject.add_new do |e|
|
39
|
+
e.name = 'Value 1'
|
40
|
+
end
|
41
|
+
|
42
|
+
subject.each do |e|
|
43
|
+
has_run = true
|
44
|
+
expect(e).to be value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'converts to array' do
|
49
|
+
value = subject.add_new do |e|
|
50
|
+
e.name = 'Value 1'
|
51
|
+
end
|
52
|
+
|
53
|
+
expect(subject.to_a).to eq [value]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'clears' do
|
57
|
+
value = subject.add_new do |e|
|
58
|
+
e.name = 'Value 1'
|
59
|
+
end
|
60
|
+
|
61
|
+
subject.clear
|
62
|
+
|
63
|
+
expect(subject.to_a).to eq []
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'merges' do
|
67
|
+
subject_2 = subject_class.new.tap do |l|
|
68
|
+
l.key {|e| e.name }
|
69
|
+
l.build { OpenStruct.new }
|
70
|
+
end
|
71
|
+
|
72
|
+
value_1 = subject.add_new do |v|
|
73
|
+
v.name = 1
|
74
|
+
end
|
75
|
+
|
76
|
+
value_2 = subject_2.add_new do |v|
|
77
|
+
v.name = 2
|
78
|
+
end
|
79
|
+
|
80
|
+
expect(subject.merge(subject_2).to_a).to eq [value_1, value_2]
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'merges without altering the original' do
|
84
|
+
subject_2 = subject_class.new.tap do |l|
|
85
|
+
l.key {|e| e.name }
|
86
|
+
l.build { OpenStruct.new }
|
87
|
+
end
|
88
|
+
|
89
|
+
value_1 = subject.add_new do |v|
|
90
|
+
v.name = 1
|
91
|
+
end
|
92
|
+
|
93
|
+
value_2 = subject_2.add_new do |v|
|
94
|
+
v.name = 2
|
95
|
+
end
|
96
|
+
|
97
|
+
subject.merge(subject_2).to_a
|
98
|
+
expect(subject.to_a).to eq [value_1]
|
99
|
+
end
|
100
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Morales
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: forwarding_dsl
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,6 +72,7 @@ files:
|
|
58
72
|
- README.md
|
59
73
|
- Rakefile
|
60
74
|
- lib/box.rb
|
75
|
+
- lib/indexed_list.rb
|
61
76
|
- lib/injectable.rb
|
62
77
|
- lib/inline.rb
|
63
78
|
- lib/lazy.rb
|
@@ -68,6 +83,7 @@ files:
|
|
68
83
|
- mini_object-0.0.1.gem
|
69
84
|
- mini_object.gemspec
|
70
85
|
- spec/box_spec.rb
|
86
|
+
- spec/indexed_list_spec.rb
|
71
87
|
- spec/injectable_spec.rb
|
72
88
|
- spec/inline_spec.rb
|
73
89
|
- spec/lazy_spec.rb
|
@@ -101,6 +117,7 @@ specification_version: 4
|
|
101
117
|
summary: Easier working with instances instead of classes and dependency injection
|
102
118
|
test_files:
|
103
119
|
- spec/box_spec.rb
|
120
|
+
- spec/indexed_list_spec.rb
|
104
121
|
- spec/injectable_spec.rb
|
105
122
|
- spec/inline_spec.rb
|
106
123
|
- spec/lazy_spec.rb
|