mini_object 0.0.2 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0aa379aae7d9c42cfcfb360a0ddb6fda0fcecdaa
4
- data.tar.gz: 320b678ed4208c284b00d89d8d9d78fa0de57ae3
3
+ metadata.gz: 2baad867ef2ce55721742c1931bc49e2d2048fcc
4
+ data.tar.gz: cd136dba6c44ea7a742e7ee7a99432ee18d77043
5
5
  SHA512:
6
- metadata.gz: 1b0abff2dcdab9666d1c296e9072171c7b82dea205b469f8752a9dcf062688e9599153d508c0f1dbd61dff41b098e1806dae089d034f91983119b8a86989e03c
7
- data.tar.gz: 6c2fc780b5cceb48245f03a8554f8cbce836e88f185ece9523ed353fbaf53ebbdfe0722546d1aa2dbd47e7185f711d61e662e00d75be73778ca4a14eb9ca3a09
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.0.1)
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:
@@ -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
@@ -10,4 +10,5 @@ module MiniObject
10
10
  autoload :ForwardingDSL, 'forwarding_dsl'
11
11
  autoload :RemarkableInspect, 'remarkable_inspect'
12
12
  autoload :Box, 'box'
13
+ autoload :IndexedList, 'indexed_list'
13
14
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MiniObject
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.2"
3
3
  end
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.0.2
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-02-01 00:00:00.000000000 Z
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