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