qig 0.3.0 → 0.4.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +1 -1
- data/README.md +26 -23
- data/lib/qig/qiggable.rb +24 -0
- data/lib/qig/version.rb +1 -1
- data/lib/qig.rb +15 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56ef9b278c456d21a26c5aa5c4af9c3fd44ac5c5b8ebc6f680d528c2380e1af3
|
4
|
+
data.tar.gz: c5bee04e6937170225b362ae777a7456c488b85afec37695fd5167530d0eaa13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f01814583296ea94b8839b6fb057b27880c92dc23870d533c192d1ed36a34a6d9650a58390f1c5e85cc2a6d92ed3356678f7bb069419015416087df208890d19
|
7
|
+
data.tar.gz: c4b2a0d910a66ba27e2b6f24963e015b404759c092f1915126d3c7aebccdf50205d6ab96e6ee480ef20709e361e475bf27b9702f0918b7fded24762e12766526
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# 0.4.0 (Jan 27, 2022)
|
2
|
+
|
3
|
+
## Features
|
4
|
+
|
5
|
+
- `Qig::Qiggable` mixin for adding chainable `.qig` syntax to subject classes.
|
6
|
+
- Allow stepping into enumerables.
|
7
|
+
|
8
|
+
## Fixes
|
9
|
+
|
10
|
+
- make unboxing (`[]`) compatible with `Enumerable`. Previously in collection-context this used `flatten(1)`, which
|
11
|
+
`Enumerable` does not support. Now uses `flat_map(&:itself)` instead
|
12
|
+
|
13
|
+
## Documentation
|
14
|
+
|
15
|
+
- Literate spec covering compatibility with lazy enumerators.
|
16
|
+
|
1
17
|
# 0.3.0 (January 24, 2022)
|
2
18
|
|
3
19
|
## BREAKING CHANGES
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,22 +3,37 @@
|
|
3
3
|
[](https://badge.fury.io/rb/qig)
|
4
4
|
[](https://circleci.com/gh/NAR8789/qig-ruby/tree/main)
|
5
5
|
|
6
|
-
qig is dig extended with jq's "value iterator" `[]` operator.
|
6
|
+
qig is dig extended with jq's "value iterator" `[]` operator and some other goodies.
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
Qig.qig(subject, *path) # => contents of subject at path
|
12
|
+
```
|
13
|
+
|
14
|
+
examples:
|
15
|
+
```ruby
|
16
|
+
# dig-like usage
|
17
|
+
Qig.qig({a: { b: { c: 1 } } }, :a, :b, :c) # => 1
|
18
|
+
|
19
|
+
# dig-like usage augmented with jq's [] operator
|
20
|
+
Qig.qig({a: { b: [ { c: 1 }, { c: 2 } ] } }, :a, :b, [], :c) # => [1, 2]
|
21
|
+
|
22
|
+
# after expanding values, collect them back into an array for indexing into with `[[]]`
|
23
|
+
Qig.qig({ a: { b: [{ c: 1 }, { c: 2 }] } }, :a, :b, [], :c, [[]], 1) # => 2
|
24
|
+
```
|
25
|
+
|
26
|
+
More documentation in the [literate specs](spec/literate)
|
7
27
|
|
8
28
|
## Features
|
9
29
|
|
10
|
-
- [x] compatible with dig
|
11
|
-
|
12
|
-
- [x] qig into structs
|
13
|
-
- [x] qig into OpenStructs
|
14
|
-
- [x] qig into CSV::Tables
|
15
|
-
- [x] qig into CSV::Rows
|
16
|
-
- [x] nifty jq extensions
|
17
|
-
- [x] value iteration over arrays
|
18
|
-
- [x] value iteration over hashes
|
30
|
+
- [x] compatible with dig (see (dig conformance specs)[spec/literate/qig/02_conformance/dig_conformance_spec.rb])
|
31
|
+
- [x] jq-like value iteration (`[]` operator)
|
19
32
|
- [x] invoke ruby methods during inside the filter chain
|
20
33
|
- [x] value collect: `[[]]`, inverse of the `[]` operator. Collect streamed values back into an array
|
21
|
-
- [
|
34
|
+
- [x] `Qig::Qiggable` mixin for more dig-like `subject.qig(*path)` syntax
|
35
|
+
- [ ] extensive literate specs
|
36
|
+
- [ ] works with lazy collections
|
22
37
|
|
23
38
|
## Installation
|
24
39
|
|
@@ -36,18 +51,6 @@ Or install it yourself as:
|
|
36
51
|
|
37
52
|
$ gem install qig
|
38
53
|
|
39
|
-
## Usage
|
40
|
-
|
41
|
-
```ruby
|
42
|
-
Qig.qig(subject, *path) # => contents of subject at path
|
43
|
-
```
|
44
|
-
|
45
|
-
examples:
|
46
|
-
```ruby
|
47
|
-
Qig.qig({a: { b: { c: 1 } } }, :a, :b, :c) # => 1
|
48
|
-
Qig.qig({a: { b: [ { c: 1 }, { c: 2 } ] } }, :a, :b, [], :c) # => [1, 2]
|
49
|
-
```
|
50
|
-
|
51
54
|
## Development
|
52
55
|
|
53
56
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/qig/qiggable.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Qig
|
4
|
+
# mix-in to add a `.qig` method to any class.
|
5
|
+
# NOTE: Target class should support `#[]`, `#map`, and either `#flat_map` or `#values` for full qig functionality
|
6
|
+
# - `#[]`: used for stepping in unit context
|
7
|
+
# - `#map`: used for stepping in collection context
|
8
|
+
# - `#flat_map` or `#values`: used for unboxing in collection context
|
9
|
+
module Qiggable
|
10
|
+
# @param path [Array<String, Symbol, Array, Object>] retrieval path to apply to `subject`
|
11
|
+
#
|
12
|
+
# @return [Object, Array<Object>] the value(s) of `self` located at `path`
|
13
|
+
def qig(*path)
|
14
|
+
Qig.qig(self, *path)
|
15
|
+
end
|
16
|
+
|
17
|
+
# see Enumerable#lazy
|
18
|
+
#
|
19
|
+
# This version extends the underlying lazy enumerable with Qig::Qiggable
|
20
|
+
def lazy
|
21
|
+
super.extend(Qig::Qiggable)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/qig/version.rb
CHANGED
data/lib/qig.rb
CHANGED
@@ -5,6 +5,8 @@ require_relative 'qig/version'
|
|
5
5
|
# Combining the powers of `dig` and `jq`.
|
6
6
|
# Qig is dig extended with jq's value iteration `[]` operator.
|
7
7
|
module Qig
|
8
|
+
autoload :Qiggable, 'qig/qiggable.rb'
|
9
|
+
|
8
10
|
class << self
|
9
11
|
# @param subject [Array, Hash, #[]] `subject` to be qug into.
|
10
12
|
# @param path [Array<String, Symbol, Array, Object>] retrieval path to apply to `subject`
|
@@ -50,13 +52,13 @@ module Qig
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
|
-
def collection_qig(subjects, *path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
55
|
+
def collection_qig(subjects, *path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
54
56
|
head, *rest = path
|
55
57
|
case head
|
56
58
|
in nil
|
57
59
|
subjects
|
58
60
|
in []
|
59
|
-
collection_qig(subjects.map(&method(:values)).
|
61
|
+
collection_qig(subjects.map(&method(:values)).flat_map(&:itself), *rest)
|
60
62
|
in [[]]
|
61
63
|
unit_qig(subjects, *rest)
|
62
64
|
in ['', key]
|
@@ -79,7 +81,17 @@ module Qig
|
|
79
81
|
end
|
80
82
|
|
81
83
|
def step(subject, key)
|
82
|
-
subject
|
84
|
+
case subject
|
85
|
+
in Enumerable unless subject.respond_to?(:[])
|
86
|
+
case key
|
87
|
+
in Integer
|
88
|
+
subject.drop(key).first
|
89
|
+
in Range
|
90
|
+
subject.drop(key.begin).take(key.count)
|
91
|
+
end
|
92
|
+
else
|
93
|
+
subject&.[](key)
|
94
|
+
end
|
83
95
|
rescue NameError, IndexError
|
84
96
|
# Struct's [] is strict and raises on missing key.
|
85
97
|
# TODO: more efficient / prettier way of doing this. How does struct itself implement dig?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xiao Fan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -30,6 +30,7 @@ files:
|
|
30
30
|
- bin/console
|
31
31
|
- bin/setup
|
32
32
|
- lib/qig.rb
|
33
|
+
- lib/qig/qiggable.rb
|
33
34
|
- lib/qig/version.rb
|
34
35
|
- qig.gemspec
|
35
36
|
- sig/qig.rbs
|