iteraptor 0.8.2 → 0.10.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
  SHA1:
3
- metadata.gz: 195bc8d3aa981fe3a07eb7b9fd8b5ed90cad61f4
4
- data.tar.gz: 1a41e0a2733f5f515b9d4e1d88c58a22bac2b489
3
+ metadata.gz: 850485a23254567575960edcb3d1d6cc1a35ac68
4
+ data.tar.gz: 7a960bb2c35962b03eb30831dcb277e03a66ba4e
5
5
  SHA512:
6
- metadata.gz: 5807c5d3f97ec4f3624a42657fcd3afc7fd151b6ed2c90552c4ecfc74c729c0151caac590bb0dd0973655683034e2a16cd9f9577dd966846fd74fcd4c0914707
7
- data.tar.gz: c6c16010e9f3468ec60971c07af8a209c0c3569b22d8dfdd610898eea758a2be7949016adaddd58cd295daf9fdb1d50caaf01e83facdb21d47aa9d9313334abe
6
+ metadata.gz: '004919dd612bde265edeaeaa1c7989aee61817d0d44ac7daea19daa82ecb92ac8b1b0553d8bf6a796bda0892c094e128503ea0567429a1a6413b56dde238f0f7'
7
+ data.tar.gz: baa763e6b9e34733fe60d98f43d99be43b5f9be8f40a58aa3d39d4cbb9f396977444663755d6142e87ab101b60ce7c1f2729559bc0f94fed9d02c39cb0b11c1d
data/.travis.yml CHANGED
@@ -1,11 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.8
4
- - 2.2.3
5
3
  - 2.3.2
6
4
  - 2.4.1
7
5
  - 2.5.0
8
- before_install: gem install bundler -v 1.11.2
6
+ - 2.6.0
7
+ - 2.7.0
8
+ before_install: gem install bundler -v 2.1.2
9
9
  addons:
10
10
  code_climate:
11
11
  repo_token: 1afbd216b9257514ff1afcaa7b8a121bc83e5238b4c3c6f4dad80107c4ea487d
data/iteraptor.gemspec CHANGED
@@ -24,8 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
- spec.add_development_dependency 'bundler', '~> 1'
28
- spec.add_development_dependency 'rake', '~> 10'
27
+ spec.add_development_dependency 'bundler', '~> 2'
28
+ spec.add_development_dependency 'rake', '~> 13'
29
29
  spec.add_development_dependency 'rspec', '~> 3'
30
30
  spec.add_development_dependency 'pry'
31
31
  spec .add_development_dependency 'awesome_print'
@@ -10,7 +10,9 @@ module Iteraptor
10
10
 
11
11
  flatten: :aplanar,
12
12
  collect: :recoger,
13
- flat_map: :plana_mapa
13
+ flat_map: :plana_mapa,
14
+
15
+ bury!: :enterrar!
14
16
  }.freeze
15
17
 
16
18
  def initialize(receiver)
@@ -1,3 +1,3 @@
1
1
  module Iteraptor
2
- VERSION = '0.8.2'
2
+ VERSION = '0.10.0'
3
3
  end
data/lib/iteraptor.rb CHANGED
@@ -3,7 +3,6 @@ require "iteraptor/version"
3
3
  # rubocop:disable Style/VariableNumber
4
4
  # rubocop:disable Metrics/ModuleLength
5
5
  module Iteraptor
6
-
7
6
  def self.included base
8
7
  raise "This module might be included into Enumerables only" unless base.ancestors.include? Enumerable
9
8
  end
@@ -12,6 +11,30 @@ module Iteraptor
12
11
  @__iteraptor__ ||= Iteraptor::Delegator.new(self)
13
12
  end
14
13
 
14
+ def get_in path
15
+ hash =
16
+ cada(full_parent: true, yield_all: true).with_object({}) do |(key, value), memo|
17
+ next unless path.length == key.length
18
+ next unless H.path_matcher(path).(key, value)
19
+
20
+ memo.enterrar!(key, value)
21
+ end.compactar
22
+
23
+ Iteraptor.apretar(hash)
24
+ end
25
+
26
+ def put_in path, value
27
+ update_in(path) { |_| value }
28
+ end
29
+
30
+ def update_in path, &λ
31
+ match_path = ->(key) { H.path_matcher(path, key, value) }
32
+
33
+ mapa(full_parent: true, yield_all: false) do |key, (k, value)|
34
+ H.path_matcher(path).(key, value) ? [k, λ.(value)] : [k, value]
35
+ end
36
+ end
37
+
15
38
  %i[cada mapa].each do |m|
16
39
  define_method m do |key = nil, value = nil, **params, &λ|
17
40
  return enum_for(m, key, value, **params) unless λ
@@ -44,6 +67,16 @@ module Iteraptor
44
67
  end
45
68
  end
46
69
 
70
+ def self.apretar(object)
71
+ case object
72
+ when Enumerable
73
+ object.
74
+ map { |*maybe_kv| apretar(maybe_kv.flatten(1).last) }.
75
+ tap { |e| break e.first if !object.is_a?(Array) && e.is_a?(Array) && e.size == 1 }
76
+ else object
77
+ end
78
+ end
79
+
47
80
  # rubocop:disable Style/Alias
48
81
  alias_method :segar, :escoger
49
82
  # rubocop:enable Style/Alias
@@ -84,6 +117,16 @@ module Iteraptor
84
117
  end
85
118
  end
86
119
 
120
+ def enterrar! key, value
121
+ key = [key] unless key.is_a?(Array)
122
+
123
+ if key.size == 1
124
+ self.tap { |this| this[key.first] = value }
125
+ else
126
+ (self[key.first] ||= key[1].is_a?(Integer) ? [] : {}).enterrar!(key[1..-1], value)
127
+ end
128
+ end
129
+
87
130
  private
88
131
 
89
132
  ##############################################################################
@@ -233,6 +276,24 @@ module Iteraptor
233
276
  def enumerable_parent?(receiver)
234
277
  [Hash, Array, Enumerable].detect(&receiver.method(:is_a?))
235
278
  end
279
+
280
+ def path_matcher path
281
+ pm =
282
+ path.map do |kind, value|
283
+ case kind
284
+ when :key, :elem, :at then ->(k, _) { value == k }
285
+ when :value then ->(_, v) { value == v }
286
+ when :filter then ->(_, v) { value.to_proc.(v) }
287
+ when :slice then ->(k, _) { value.cover?(k) }
288
+ when :filter_key
289
+ case value
290
+ when :all then ->(_, _) { true }
291
+ when ->(p) { p.respond_to?(:to_proc) } then ->(k, _) { value.to_proc.(k) }
292
+ end
293
+ end
294
+ end
295
+ ->(key, value) { path.length == key.length && pm.zip(key).all? { |m, k| m.(k, value) } }
296
+ end
236
297
  end
237
298
  end
238
299
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iteraptor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksei Matiushkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-01 00:00:00.000000000 Z
11
+ date: 2023-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1'
19
+ version: '2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1'
26
+ version: '2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10'
33
+ version: '13'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10'
40
+ version: '13'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  version: '0'
129
129
  requirements: []
130
130
  rubyforge_project:
131
- rubygems_version: 2.4.8
131
+ rubygems_version: 2.6.14.4
132
132
  signing_key:
133
133
  specification_version: 4
134
134
  summary: 'Iterator on steroids: allows thorough iteration through nested Enumerables'