curio 0.1.2 → 0.1.3

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: c463ca337476e67d29b326574fc74a24d6d59db7
4
- data.tar.gz: 27f5fc7a322dc4856df2978073fd8fb5c26afeaa
3
+ metadata.gz: 3deec75594c85a9537d56bf024173def85d503ae
4
+ data.tar.gz: a299bfbdf527d20373cdbe3d6770a1e63cb735c9
5
5
  SHA512:
6
- metadata.gz: dd25cca619fef69396c93a0baa7815f3748cf9e95d6c173b29519bd1fafbcdec5c5fde1a6d1435327abd4cde37bba1b5ef665cc2330ef04df678cbeee7522190
7
- data.tar.gz: a284eea87ad452f86bbcafd2eb909bc39877bb96ac71be8acfadb040c3507aebcc9629b6a3991aa43848a6ddb516d70950173ef4ea6b38b33fd8c9589000707d
6
+ metadata.gz: 229f0809fd860285d25f0a69766615d10f51d521c1b7a6b93755e974f0d9659d503474bdd43b2168a17f52e706b1b566c7bd1b0f90a1d84063dd91b4758159a8
7
+ data.tar.gz: ae8f2e8563bc95149350c336bd95d9c512dff8c0eaf3bf859dc6c1e6103e36228b236b2de8c42ccf365d8b5494ed00f2facdefb06da6864565a46e7e0b977b7a
@@ -1,14 +1,18 @@
1
1
  language: ruby
2
+ sudo: false
3
+ cache: bundler
4
+ script:
5
+ - bundle exec rake
2
6
  rvm:
3
- - 1.9.3
4
7
  - 2.0.0
5
- - 2.1.0
6
- - 2.2.2
7
- - jruby-19mode
8
- - rbx-2
9
- before_install:
10
- - gem update --system
11
- - gem update bundler
12
- install: 'bundle install'
13
- script: 'bundle exec rake'
14
- cache: bundler
8
+ - 2.1.10
9
+ - 2.2.5
10
+ - 2.3.1
11
+ - jruby-9.1.5.0
12
+ - rbx-3.60
13
+ env:
14
+ global:
15
+ - JRUBY_OPTS='--dev -J-Xmx1024M'
16
+ matrix:
17
+ allow_failures:
18
+ - rvm: rbx-3.60
data/Rakefile CHANGED
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'bundler/setup'
4
2
  require 'bundler/gem_tasks'
5
3
 
@@ -8,7 +6,7 @@ require 'rubocop/rake_task'
8
6
 
9
7
  RuboCop::RakeTask.new
10
8
 
11
- task default: %w(rubocop test)
9
+ task default: %w(test rubocop)
12
10
  task test: 'test:all'
13
11
 
14
12
  namespace :test do
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'curio/version'
@@ -8,20 +7,22 @@ Gem::Specification.new do |spec|
8
7
  spec.version = Curio::VERSION
9
8
  spec.authors = ['Terje Larsen']
10
9
  spec.email = ['terlar@gmail.com']
10
+ spec.license = 'MIT'
11
+
11
12
  spec.summary = 'Mixin for enumerable maps'
12
13
  spec.description = spec.summary
13
14
  spec.homepage = 'https://github.com/terlar/curio'
14
- spec.license = 'MIT'
15
15
 
16
- spec.files = `git ls-files`.split($RS)
16
+ spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = %w(lib)
19
19
  spec.extra_rdoc_files = %w(LICENSE README.md)
20
20
 
21
- spec.required_ruby_version = '>= 1.9.3'
21
+ spec.required_ruby_version = '>= 2.0.0'
22
22
 
23
+ spec.add_development_dependency 'pry'
23
24
  spec.add_development_dependency 'bundler'
24
- spec.add_development_dependency 'rake', '~> 10.0'
25
- spec.add_development_dependency 'minitest', '~> 5.8'
26
- spec.add_development_dependency 'rubocop', '~> 0.35'
25
+ spec.add_development_dependency 'rake', '~> 11.0'
26
+ spec.add_development_dependency 'minitest', '~> 5.9'
27
+ spec.add_development_dependency 'rubocop', '~> 0.45'
27
28
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'curio/version'
4
2
 
5
3
  require 'forwardable'
@@ -14,6 +12,8 @@ class Curio < Module
14
12
  end
15
13
  end
16
14
 
15
+ ConstraintError = Class.new(TypeError)
16
+
17
17
  # Initialize a collection object with given key and type
18
18
  #
19
19
  # :key will be used to determine which method to call on items to get
@@ -28,12 +28,16 @@ class Curio < Module
28
28
  # @return [undefined]
29
29
  #
30
30
  # @api private
31
- def initialize(key, type = String)
31
+ def initialize(key, type = String, opts = { }.freeze)
32
32
  @key = key
33
33
  @type = type
34
+ @hooks = []
35
+
36
+ add_auto_increment_hook if opts[:auto_increment]
34
37
 
35
38
  define_key_method
36
39
  define_coerce_key_method
40
+ define_hooks_method
37
41
 
38
42
  freeze
39
43
  end
@@ -55,6 +59,38 @@ class Curio < Module
55
59
  end
56
60
  end
57
61
 
62
+ # Add auto increment hook.
63
+ #
64
+ # This adds a hook that sets the item key to the next integer based on
65
+ # the collection count if no item key is available.
66
+ #
67
+ # @return [undefined]
68
+ #
69
+ # @api private
70
+ def add_auto_increment_hook
71
+ unless @type == Integer
72
+ fail ConstraintError,
73
+ 'auto-increment requires a key type of Integer'
74
+ end
75
+
76
+ @hooks << lambda do |collection, item|
77
+ return unless item.send(collection.key_method).nil?
78
+ item.send(:"#{collection.key_method}=", collection.count + 1)
79
+ end
80
+ end
81
+
82
+ # Define #hooks based on @hooks
83
+ #
84
+ # @return [Array]
85
+ #
86
+ # @api private
87
+ def define_hooks_method
88
+ hooks = @hooks
89
+ define_method :hooks do
90
+ hooks
91
+ end
92
+ end
93
+
58
94
  # Define #key_method based on @key
59
95
  #
60
96
  # @return [undefined]
@@ -76,9 +112,9 @@ class Curio < Module
76
112
  type = @type
77
113
  define_method :coerce_key do |value|
78
114
  case type.to_s
79
- when 'String' then "#{value}"
115
+ when 'String' then value.to_s
80
116
  when 'Symbol' then :"#{value}"
81
- when 'Integer' then "#{value}".to_i
117
+ when 'Integer' then value.to_i
82
118
  else value
83
119
  end
84
120
  end
@@ -122,7 +158,7 @@ class Curio < Module
122
158
  def values
123
159
  @map.values
124
160
  end
125
- alias_method :all, :values
161
+ alias all values
126
162
 
127
163
  # Add an item to the collection
128
164
  #
@@ -132,11 +168,12 @@ class Curio < Module
132
168
  #
133
169
  # @api public
134
170
  def add(item)
171
+ call_add_hooks item
135
172
  key = coerce_key item.send(key_method)
136
173
  @map[key.freeze] = item
137
174
  self
138
175
  end
139
- alias_method :<<, :add
176
+ alias << add
140
177
 
141
178
  # Fetch an item from the collection
142
179
  #
@@ -176,7 +213,7 @@ class Curio < Module
176
213
  def key?(key)
177
214
  @map.key? coerce_key(key)
178
215
  end
179
- alias_method :has?, :key?
216
+ alias has? key?
180
217
 
181
218
  # Returns a hash representation of the collection
182
219
  #
@@ -208,5 +245,17 @@ class Curio < Module
208
245
  @map.freeze
209
246
  super
210
247
  end
248
+
249
+ private
250
+
251
+ # Run all attached hooks
252
+ #
253
+ # Currently there is only the hook for auto increment if the
254
+ # collection was configured to use this.
255
+ #
256
+ # @api private
257
+ def call_add_hooks(item)
258
+ hooks.each { |hook| hook.call(self, item) }
259
+ end
211
260
  end
212
261
  end
@@ -1,6 +1,4 @@
1
- # encoding: utf-8
2
-
3
1
  # Version
4
2
  class Curio < Module
5
- VERSION = '0.1.2'
3
+ VERSION = '0.1.3'.freeze
6
4
  end
@@ -0,0 +1,50 @@
1
+ require_relative 'test_helper'
2
+
3
+ class AutoIncrementTest < Minitest::Test
4
+ class Collection
5
+ include Curio.new(:id, Integer, auto_increment: true)
6
+ end
7
+
8
+ Item = Struct.new(:id)
9
+
10
+ attr_reader :collection
11
+
12
+ def setup
13
+ @collection = Collection.new
14
+ end
15
+
16
+ def test_auto_increment_sets_item_key
17
+ item1 = Item.new
18
+ item2 = Item.new
19
+ collection << item1 << item2
20
+
21
+ assert_equal 1, item1.id
22
+ assert_equal 2, item2.id
23
+ end
24
+
25
+ def test_auto_increment_only_activates_with_missing_item_key
26
+ item1 = Item.new 5
27
+ item2 = Item.new
28
+ collection << item1 << item2
29
+
30
+ assert_equal 5, item1.id
31
+ assert_equal 2, item2.id
32
+ end
33
+
34
+ def test_auto_increment_items_can_be_fetched
35
+ item1 = Item.new
36
+ item2 = Item.new
37
+ collection << item1 << item2
38
+
39
+ assert_equal item1, collection[1]
40
+ assert_equal item2, collection[2]
41
+ end
42
+
43
+ def test_auto_increment_with_non_integer_raises_contstraint_error
44
+ assert_raises Curio::ConstraintError do
45
+ Class.new do
46
+ include Curio.new(:id, String, auto_increment: true)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require_relative 'test_helper'
4
2
 
5
3
  # rubocop: disable ClassLength
@@ -38,7 +36,7 @@ class IntegrationTest < Minitest::Test
38
36
  assert_equal [item1, item2], collection.values
39
37
  end
40
38
 
41
- def test_retrieving_item
39
+ def test_retrieving_an_item
42
40
  item = Item.new 'a'
43
41
  collection << item
44
42
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'bundler/setup'
4
2
  require 'curio'
5
3
  require 'minitest/autorun'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Terje Larsen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-04 00:00:00.000000000 Z
11
+ date: 2016-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -30,42 +44,42 @@ dependencies:
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '11.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.0'
54
+ version: '11.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: minitest
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '5.8'
61
+ version: '5.9'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '5.8'
68
+ version: '5.9'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0.35'
75
+ version: '0.45'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0.35'
82
+ version: '0.45'
69
83
  description: Mixin for enumerable maps
70
84
  email:
71
85
  - terlar@gmail.com
@@ -85,6 +99,7 @@ files:
85
99
  - curio.gemspec
86
100
  - lib/curio.rb
87
101
  - lib/curio/version.rb
102
+ - test/auto_increment_test.rb
88
103
  - test/integration_test.rb
89
104
  - test/test_helper.rb
90
105
  homepage: https://github.com/terlar/curio
@@ -99,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
114
  requirements:
100
115
  - - ">="
101
116
  - !ruby/object:Gem::Version
102
- version: 1.9.3
117
+ version: 2.0.0
103
118
  required_rubygems_version: !ruby/object:Gem::Requirement
104
119
  requirements:
105
120
  - - ">="
@@ -107,10 +122,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
122
  version: '0'
108
123
  requirements: []
109
124
  rubyforge_project:
110
- rubygems_version: 2.4.5.1
125
+ rubygems_version: 2.5.1
111
126
  signing_key:
112
127
  specification_version: 4
113
128
  summary: Mixin for enumerable maps
114
129
  test_files:
130
+ - test/auto_increment_test.rb
115
131
  - test/integration_test.rb
116
132
  - test/test_helper.rb