hmap 1.0.1 → 1.1.0

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
  SHA256:
3
- metadata.gz: 6ad321ffc1bab03aa6a94f4e528c10b0c2cdc53a803a422f6327d12ab1abe9d4
4
- data.tar.gz: 8faaec21ec0526bd3ea5fc3189045ec1cf2adcac7740352691e9b8a0a1cc6923
3
+ metadata.gz: 77e9c393f40df641e51a65b9279fc479c5b3e85bb90e74cd6d13a836147c1b56
4
+ data.tar.gz: f1f9f8c51498c80c4de446917dc60462aa020e74a5721684de983d5b2a728211
5
5
  SHA512:
6
- metadata.gz: e6eec1dd98f07ca4d3f4da63bc1c8a31bf95d0edddc0265b8f259cdd84d05ad904c7b5c2bd2df78c44e8d3957492019f31dba6faa038eeaf6b3e8f4836770b14
7
- data.tar.gz: 800788420878ef4950b798bdee053380deeb981638594299ef26bf35b9bbb901fc731c73e734b3292f25f6bdef5ffc9c1f8947ead4ae949817a8f71d23e488af
6
+ metadata.gz: e925a388dcc787b0b5413d894b363e65f09ebdadf3dd3e25f9f33430421f5b350e494b1aed3d896ad11165555b72a711cd4c8488556dc539b82d9b12191684a2
7
+ data.tar.gz: 98b1d1082abf8af745cda978df664ecfd0565d685beb835ed0e4fd2fd68278d47ef969068d566de061c26086e1aef4492a7e7da29520885c232d99edcd3de68c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### 1.1.0 (2026-11-03)
2
+ - require Ruby >= 3.2
3
+ - fix FrozenError from hmap, kmap, and vmap on frozen hashes
4
+ - raise ArgumentError when called without a block
5
+ - hmap and Hash.hmap raise on malformed pairs, e.g. [key], instead of filling in a nil value
6
+ - kmap and vmap pass the key and value to blocks with an optional second param, e.g. |k, v = nil|
7
+
1
8
  ### 1.0.1 (2024-07-12)
2
9
  - fix changelog
3
10
  - rebuild
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
data/Gemfile.lock CHANGED
@@ -1,41 +1,65 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hmap (1.0.1)
4
+ hmap (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- byebug (11.1.3)
10
- diff-lcs (1.5.1)
11
- docile (1.4.0)
12
- rspec (3.13.0)
9
+ debug (1.11.1)
10
+ irb (~> 1.10)
11
+ reline (>= 0.3.8)
12
+ diff-lcs (1.6.2)
13
+ erb (6.0.7)
14
+ io-console (0.9.5)
15
+ irb (1.18.0)
16
+ pp (>= 0.6.0)
17
+ prism (>= 1.3.0)
18
+ rdoc (>= 4.0.0)
19
+ reline (>= 0.4.2)
20
+ logger (1.7.0)
21
+ pp (0.6.4)
22
+ prettyprint
23
+ prettyprint (0.2.1)
24
+ prism (2.1.0)
25
+ rbs (4.2.0)
26
+ logger
27
+ prism (>= 1.6.0)
28
+ tsort
29
+ rdoc (8.1.0)
30
+ erb
31
+ prism (>= 1.6.0)
32
+ rbs (>= 4.0.0)
33
+ tsort
34
+ reline (0.7.0)
35
+ io-console (~> 0.5)
36
+ rspec (3.13.2)
13
37
  rspec-core (~> 3.13.0)
14
38
  rspec-expectations (~> 3.13.0)
15
39
  rspec-mocks (~> 3.13.0)
16
- rspec-core (3.13.0)
40
+ rspec-core (3.13.6)
17
41
  rspec-support (~> 3.13.0)
18
- rspec-expectations (3.13.0)
42
+ rspec-debugging (0.0.5)
43
+ debug (>= 1.10)
44
+ rspec-core (>= 3.10)
45
+ rspec-expectations (3.13.5)
19
46
  diff-lcs (>= 1.2.0, < 2.0)
20
47
  rspec-support (~> 3.13.0)
21
- rspec-mocks (3.13.1)
48
+ rspec-mocks (3.13.8)
22
49
  diff-lcs (>= 1.2.0, < 2.0)
23
50
  rspec-support (~> 3.13.0)
24
- rspec-support (3.13.1)
25
- simplecov (0.22.0)
26
- docile (~> 1.1)
27
- simplecov-html (~> 0.11)
28
- simplecov_json_formatter (~> 0.1)
29
- simplecov-html (0.12.3)
30
- simplecov_json_formatter (0.1.4)
51
+ rspec-support (3.13.7)
52
+ simplecov (1.3.2)
53
+ tsort (0.2.0)
31
54
 
32
55
  PLATFORMS
33
56
  ruby
34
57
 
35
58
  DEPENDENCIES
36
- byebug (>= 11)
59
+ debug (>= 1)
37
60
  hmap!
38
61
  rspec (>= 3.10)
62
+ rspec-debugging
39
63
  simplecov (>= 0.22)
40
64
 
41
65
  BUNDLED WITH
data/README.md CHANGED
@@ -9,7 +9,7 @@ Improved Hash mapping functions
9
9
 
10
10
  ### Usage
11
11
  #### Hash.map
12
- Create a Hash using an Enumerable by mapping it's items into corresponding hash values
12
+ Create a Hash using an Enumerable by mapping its items into corresponding hash values
13
13
  ```ruby
14
14
  Hash.map [:a, :bb, :ccc] {|v| v.length }
15
15
  => { a: 1, bb: 2, ccc: 3 }
@@ -44,7 +44,7 @@ Transform the values of a Hash
44
44
  b: 2,
45
45
  c: 3,
46
46
  }.vmap &:to_s
47
- => { a: '2', b: '4', c: '6' }
47
+ => { a: '1', b: '2', c: '3' }
48
48
  ```
49
49
 
50
50
  #### kmap
data/hmap.gemspec CHANGED
@@ -1,16 +1,19 @@
1
+ require_relative "lib/hmap/version"
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.authors = ["Daniel Pepper"]
3
5
  s.description = "Improved Hash mapping functions"
4
6
  s.files = `git ls-files * ":!:spec"`.split("\n")
5
7
  s.homepage = "https://github.com/dpep/rb_hmap"
6
8
  s.license = "MIT"
7
- s.name = File.basename(__FILE__, ".gemspec")
9
+ s.name = "hmap"
8
10
  s.summary = "Hmap"
9
- s.version = "1.0.1"
11
+ s.version = Hmap::VERSION
10
12
 
11
- s.required_ruby_version = ">= 3"
13
+ s.required_ruby_version = ">= 3.2"
12
14
 
13
- s.add_development_dependency "byebug", ">= 11"
15
+ s.add_development_dependency "debug", ">= 1"
14
16
  s.add_development_dependency "rspec", ">= 3.10"
17
+ s.add_development_dependency "rspec-debugging"
15
18
  s.add_development_dependency "simplecov", ">= 0.22"
16
19
  end
data/lib/hmap/hmap.rb CHANGED
@@ -1,20 +1,22 @@
1
1
  module Hmap
2
2
  # create Hash from given keys and mapped values
3
3
  def map(obj, &block)
4
- res = obj.map do |*args|
5
- block.call(*args)
6
- end
4
+ raise ArgumentError, "no block given" unless block
7
5
 
8
- Hash[obj.zip res]
6
+ obj.zip(obj.map(&block)).to_h
9
7
  end
10
8
 
11
- # map an Enumerable into a Hash, like Hash[obj.map ... ]
9
+ # map an Enumerable into a Hash, like obj.map { ... }.to_h
12
10
  def hmap(obj, &block)
13
- Hash[
14
- obj.map do |*args|
15
- block.call(*args)
16
- end.compact
17
- ]
11
+ raise ArgumentError, "no block given" unless block
12
+
13
+ obj.map(&block).compact.to_h
14
+ end
15
+
16
+ # call with (key, value) if the block takes both, else just the one
17
+ def self.yield_pair(block, one, key, value)
18
+ positional = block.parameters.count { |type, _| type == :req || type == :opt }
19
+ positional >= 2 ? block.call(key, value) : block.call(one)
18
20
  end
19
21
 
20
22
  def self.extended(base)
@@ -24,7 +26,7 @@ module Hmap
24
26
  module InstanceMethods
25
27
  # map the block's results back to a hash
26
28
  def hmap(&block)
27
- clone.hmap!(&block)
29
+ dup.hmap!(&block)
28
30
  end
29
31
 
30
32
  def hmap!(&block)
@@ -36,24 +38,28 @@ module Hmap
36
38
  # map keys, but preserve associated values
37
39
  # ie. http://apidock.com/rails/v4.2.7/Hash/transform_keys
38
40
  def kmap(&block)
39
- clone.kmap!(&block)
41
+ dup.kmap!(&block)
40
42
  end
41
43
 
42
44
  def kmap!(&block)
45
+ raise ArgumentError, "no block given" unless block
46
+
43
47
  hmap! do |k, v|
44
- [ block.arity <= 1 ? block.call(k) : block.call(k, v), v ]
48
+ [ Hmap.yield_pair(block, k, k, v), v ]
45
49
  end
46
50
  end
47
51
 
48
52
  # map values, but preserve associated keys
49
53
  # ie. http://apidock.com/rails/v4.2.7/Hash/transform_values
50
54
  def vmap(&block)
51
- clone.vmap!(&block)
55
+ dup.vmap!(&block)
52
56
  end
53
57
 
54
58
  def vmap!(&block)
59
+ raise ArgumentError, "no block given" unless block
60
+
55
61
  each do |k, v|
56
- self[k] = block.arity <= 1 ? block.call(v) : block.call(k, v)
62
+ self[k] = Hmap.yield_pair(block, v, k, v)
57
63
  end
58
64
  end
59
65
  end
data/lib/hmap/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hmap
2
- VERSION = Gem.loaded_specs["hmap"].version.to_s
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,29 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-07-12 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: byebug
13
+ name: debug
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '11'
18
+ version: '1'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '11'
25
+ version: '1'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: rspec
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +37,20 @@ dependencies:
38
37
  - - ">="
39
38
  - !ruby/object:Gem::Version
40
39
  version: '3.10'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec-debugging
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
41
54
  - !ruby/object:Gem::Dependency
42
55
  name: simplecov
43
56
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +66,6 @@ dependencies:
53
66
  - !ruby/object:Gem::Version
54
67
  version: '0.22'
55
68
  description: Improved Hash mapping functions
56
- email:
57
69
  executables: []
58
70
  extensions: []
59
71
  extra_rdoc_files: []
@@ -71,7 +83,6 @@ homepage: https://github.com/dpep/rb_hmap
71
83
  licenses:
72
84
  - MIT
73
85
  metadata: {}
74
- post_install_message:
75
86
  rdoc_options: []
76
87
  require_paths:
77
88
  - lib
@@ -79,15 +90,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
90
  requirements:
80
91
  - - ">="
81
92
  - !ruby/object:Gem::Version
82
- version: '3'
93
+ version: '3.2'
83
94
  required_rubygems_version: !ruby/object:Gem::Requirement
84
95
  requirements:
85
96
  - - ">="
86
97
  - !ruby/object:Gem::Version
87
98
  version: '0'
88
99
  requirements: []
89
- rubygems_version: 3.5.15
90
- signing_key:
100
+ rubygems_version: 4.0.16
91
101
  specification_version: 4
92
102
  summary: Hmap
93
103
  test_files: []