iteraptor 0.9.0 → 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
- SHA256:
3
- metadata.gz: 876de362915d391498fce9ab321edeaa7316f318c7237532c80825ba0c009879
4
- data.tar.gz: cf8153fe2d90c82684d77e0e4755845adbbb59ceb15a89e9e03c129890332d27
2
+ SHA1:
3
+ metadata.gz: 850485a23254567575960edcb3d1d6cc1a35ac68
4
+ data.tar.gz: 7a960bb2c35962b03eb30831dcb277e03a66ba4e
5
5
  SHA512:
6
- metadata.gz: 9874c196f2bb5ba4738838bdee34f7daa0c5a8b8c0f623ffa389fe3dc884fc3bbc5199d3ed6d52c10ed20d20b3597179e8edd47297d4d601615ccd49ecfbaafa
7
- data.tar.gz: 51655caab9cbd2e6e5225786faf7f7ab217891e60c3a0f93daa89b4ea9ee668581f5fffd4bc2101b0b1807cb688658758fb8654278d9802fefa47e36a7dbb757
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
@@ -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.9.0'
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.9.0
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: 2020-03-15 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
@@ -127,7 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  requirements: []
130
- rubygems_version: 3.1.2
130
+ rubyforge_project:
131
+ rubygems_version: 2.6.14.4
131
132
  signing_key:
132
133
  specification_version: 4
133
134
  summary: 'Iterator on steroids: allows thorough iteration through nested Enumerables'