qig 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/qig.svg)](https://badge.fury.io/rb/qig)
|
4
4
|
[![CircleCI](https://circleci.com/gh/NAR8789/qig-ruby/tree/main.svg?style=shield)](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
|