zn 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +17 -0
- data/README.md +94 -16
- data/bin/install +5 -0
- data/bin/release +5 -0
- data/bin/rspec-test +5 -0
- data/bin/smoke-test +140 -0
- data/bin/test +1 -1
- data/lib/zn/cli.rb +4 -3
- data/lib/zn/dataset.rb +1 -0
- data/lib/zn/repos/json_repo.rb +17 -12
- data/lib/zn/version.rb +1 -1
- data/zn.gemspec +1 -1
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 169966541807052462e0dcc386a5a2946ee19c27
|
4
|
+
data.tar.gz: a9c201bb92ec31de84a59bcf20a552a839feb014
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55f9ee7f95c5be03460fe30bd20ddac9677188200f6b41aec2b6f8ca17715119e3847c109f933eddb0b4bf5f4f3b1097408b75676ad7c68ab848096706e0cbbd
|
7
|
+
data.tar.gz: 82dd515ec234cffc7a43f7a49577c9975c0fb53e699906a3e2da4005c68ad1ff9e495d7a3083789b7640fa6d3e220508ef96833d34932ae011a2c1467f01ef9d
|
data/Dockerfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
FROM ruby:2.4
|
2
|
+
|
3
|
+
MAINTAINER Latheesh <latheeshp@gmail.com>
|
4
|
+
|
5
|
+
RUN apt-get update && apt-get install -yqq git bash make gcc vim
|
6
|
+
|
7
|
+
RUN { echo 'install: --no-document'; echo 'update: --no-document'; } >> /etc/gemrc
|
8
|
+
|
9
|
+
WORKDIR /app
|
10
|
+
|
11
|
+
COPY . /app
|
12
|
+
|
13
|
+
RUN bin/setup
|
14
|
+
RUN bin/install
|
15
|
+
|
16
|
+
WORKDIR /app
|
17
|
+
ENTRYPOINT ["bash"]
|
data/README.md
CHANGED
@@ -1,39 +1,117 @@
|
|
1
1
|
# Zn
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Zn is a tool to search and correlate data sources (JSON files for now).
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
9
|
-
|
7
|
+
### Local
|
10
8
|
|
11
|
-
```
|
12
|
-
|
9
|
+
```
|
10
|
+
$ git clone https://github.com/lpadukana/zn
|
11
|
+
$ bin/setup
|
12
|
+
$ bin/install
|
13
13
|
```
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
$ bundle
|
15
|
+
### Docker
|
18
16
|
|
19
|
-
|
17
|
+
```
|
18
|
+
$ docker run -it latheeshp/zn:latest
|
19
|
+
```
|
20
20
|
|
21
|
-
|
21
|
+
Note: For latest changes, please use `exe/zn` instead of depending on the installed version.
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
This tool depends on an index to understand the relationship between datasets. An example is available at `spec/fixtures/starwars/index.yml`. In this case, this file defines how `people.json`, `planets.json` and `robots.json` are related.
|
26
|
+
|
27
|
+
### Search Examples
|
28
|
+
|
29
|
+
```sh
|
30
|
+
$ zn search \
|
31
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
32
|
+
--dataset robots \
|
33
|
+
--key id \
|
34
|
+
--value r2
|
35
|
+
{"id":"r2","name":"R2-D2","owner_id":"obi"}
|
36
|
+
|
37
|
+
# config file can be set using environment variables
|
38
|
+
$ export ZN_CONFIG_FILE=spec/fixtures/starwars/index.yml
|
39
|
+
|
40
|
+
$ zn search --dataset people --key name --value Kenobi
|
41
|
+
{"id":"obi","name":"Obi Wan Kenobi","planet_id":"ste"}
|
42
|
+
```
|
43
|
+
|
44
|
+
### Search and Associate Example
|
45
|
+
|
46
|
+
```sh
|
47
|
+
$ export ZN_CONFIG_FILE=spec/fixtures/starwars/index.yml
|
48
|
+
|
49
|
+
$ zn search --dataset robots --key id --value r2 | zn associate --dataset robots
|
50
|
+
{"id":"r2","name":"R2-D2","owner_id":"obi","owner":{"id":"obi","name":"Obi Wan Kenobi","planet_id":"ste"}}
|
51
|
+
|
52
|
+
$ zn search --dataset people --key name --value Kenobi | zn associate --dataset people
|
53
|
+
{"id":"obi","name":"Obi Wan Kenobi","planet_id":"ste","robots":[{"id":"r2","name":"R2-D2","owner_id":"obi"},{"id":"c3po","name":"C-3PO","owner_id":"obi"}],"home_planet":{"id":"ste","name":"Stewjon"}}
|
54
|
+
```
|
55
|
+
|
56
|
+
### Search, Associate and Pretty-print Example
|
57
|
+
|
58
|
+
```sh
|
59
|
+
$ export ZN_CONFIG_FILE=spec/fixtures/starwars/index.yml
|
60
|
+
|
61
|
+
$ zn search --dataset people --key name --value Kenobi | zn associate --dataset people | zn prettify-json
|
62
|
+
{
|
63
|
+
"id": "obi",
|
64
|
+
"name": "Obi Wan Kenobi",
|
65
|
+
"planet_id": "ste",
|
66
|
+
"robots": [
|
67
|
+
{
|
68
|
+
"id": "r2",
|
69
|
+
"name": "R2-D2",
|
70
|
+
"owner_id": "obi"
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"id": "c3po",
|
74
|
+
"name": "C-3PO",
|
75
|
+
"owner_id": "obi"
|
76
|
+
}
|
77
|
+
],
|
78
|
+
"home_planet": {
|
79
|
+
"id": "ste",
|
80
|
+
"name": "Stewjon"
|
81
|
+
}
|
82
|
+
}
|
83
|
+
```
|
84
|
+
|
85
|
+
## Tests
|
86
|
+
|
87
|
+
### Rspec
|
88
|
+
|
89
|
+
```sh
|
90
|
+
$ bin/rspec-test
|
91
|
+
```
|
92
|
+
|
93
|
+
### Style Checks
|
94
|
+
|
95
|
+
```sh
|
96
|
+
$ bin/style-check
|
97
|
+
```
|
98
|
+
|
99
|
+
### Smoke Tests
|
100
|
+
|
101
|
+
```sh
|
102
|
+
$ bin/smoke-test
|
103
|
+
```
|
26
104
|
|
27
105
|
## Development
|
28
106
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `
|
107
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
108
|
|
31
|
-
To install this gem onto your local machine, run `
|
109
|
+
To install this gem onto your local machine, run `bin/install`. To release a new version, update the version number in `version.rb`, and then run `bin/release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
110
|
|
33
111
|
## Contributing
|
34
112
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/lpadukana/zn
|
113
|
+
Bug reports and pull requests are welcome on GitHub at <https://github.com/lpadukana/zn>.
|
36
114
|
|
37
115
|
## License
|
38
116
|
|
39
|
-
|
117
|
+
Available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/bin/install
ADDED
data/bin/release
ADDED
data/bin/rspec-test
ADDED
data/bin/smoke-test
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -euo pipefail
|
4
|
+
|
5
|
+
# Smoke-tests
|
6
|
+
|
7
|
+
mkdir -p /tmp/zn
|
8
|
+
|
9
|
+
fail() {
|
10
|
+
echo -e "\\033[31mFAIL: $*\\033[0m"
|
11
|
+
exit 1
|
12
|
+
}
|
13
|
+
|
14
|
+
run () {
|
15
|
+
echo -e ">>> \\033[1m$*\\033[0m"
|
16
|
+
sh -c "$@" > >(tee /tmp/zn/stdout) 2> >(tee /tmp/zn/stderr >&2)
|
17
|
+
echo ""
|
18
|
+
}
|
19
|
+
|
20
|
+
check_output() {
|
21
|
+
if ! grep -q "${*?}" /tmp/zn/stdout; then
|
22
|
+
fail "Expected output: $*"
|
23
|
+
fi
|
24
|
+
}
|
25
|
+
|
26
|
+
# Exercise help
|
27
|
+
run "exe/zn --help"
|
28
|
+
check_output "Search the text in values of the given key"
|
29
|
+
check_output "Find associated entities"
|
30
|
+
check_output "List keys in a dataset"
|
31
|
+
check_output "List known datasets"
|
32
|
+
check_output "Pretty print JSON"
|
33
|
+
check_output "Usage:"
|
34
|
+
check_output "Parameters:"
|
35
|
+
check_output "Subcommands:"
|
36
|
+
check_output "Options:"
|
37
|
+
|
38
|
+
run "exe/zn search \
|
39
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
40
|
+
--dataset robots \
|
41
|
+
--key id \
|
42
|
+
--value r2"
|
43
|
+
check_output '{"id":"r2","name":"R2-D2","owner_id":"obi"}'
|
44
|
+
|
45
|
+
run "exe/zn search \
|
46
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
47
|
+
--dataset robots \
|
48
|
+
--key id \
|
49
|
+
--value r2 |\
|
50
|
+
exe/zn associate \
|
51
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
52
|
+
--dataset robots"
|
53
|
+
check_output '{"id":"r2","name":"R2-D2","owner_id":"obi","owner":{"id":"obi","name":"Obi Wan Kenobi","planet_id":"ste"}}'
|
54
|
+
|
55
|
+
run "exe/zn search \
|
56
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
57
|
+
--dataset robots \
|
58
|
+
--key id \
|
59
|
+
--value r2 |\
|
60
|
+
exe/zn associate \
|
61
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
62
|
+
--dataset robots |\
|
63
|
+
exe/zn prettify-json"
|
64
|
+
check_output '{
|
65
|
+
"id": "r2",
|
66
|
+
"name": "R2-D2",
|
67
|
+
"owner_id": "obi",
|
68
|
+
"owner": {
|
69
|
+
"id": "obi",
|
70
|
+
"name": "Obi Wan Kenobi",
|
71
|
+
"planet_id": "ste"
|
72
|
+
}
|
73
|
+
}'
|
74
|
+
|
75
|
+
run "exe/zn search \
|
76
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
77
|
+
--dataset people \
|
78
|
+
--key name \
|
79
|
+
--value Obi |\
|
80
|
+
exe/zn associate \
|
81
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
82
|
+
--dataset people |\
|
83
|
+
exe/zn prettify-json"
|
84
|
+
check_output '{
|
85
|
+
"id": "obi",
|
86
|
+
"name": "Obi Wan Kenobi",
|
87
|
+
"planet_id": "ste",
|
88
|
+
"robots": \[
|
89
|
+
{
|
90
|
+
"id": "r2",
|
91
|
+
"name": "R2-D2",
|
92
|
+
"owner_id": "obi"
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"id": "c3po",
|
96
|
+
"name": "C-3PO",
|
97
|
+
"owner_id": "obi"
|
98
|
+
}
|
99
|
+
\],
|
100
|
+
"home_planet": {
|
101
|
+
"id": "ste",
|
102
|
+
"name": "Stewjon"
|
103
|
+
}
|
104
|
+
}'
|
105
|
+
|
106
|
+
run 'exe/zn search \
|
107
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
108
|
+
--dataset planets \
|
109
|
+
--key name \
|
110
|
+
--value "Outer Rim" |\
|
111
|
+
exe/zn associate \
|
112
|
+
--config-file=spec/fixtures/starwars/index.yml \
|
113
|
+
--dataset planets |\
|
114
|
+
exe/zn prettify-json'
|
115
|
+
check_output '{
|
116
|
+
"id": "ou-3453",
|
117
|
+
"name": "Outer Rim 3453",
|
118
|
+
"residents": \[
|
119
|
+
{
|
120
|
+
"id": "rev",
|
121
|
+
"name": "Darth Revan",
|
122
|
+
"planet_id": "ou-3453"
|
123
|
+
}
|
124
|
+
\]
|
125
|
+
}'
|
126
|
+
|
127
|
+
run 'zn list-keys \
|
128
|
+
--config-file spec/fixtures/starwars/index.yml \
|
129
|
+
--dataset robots'
|
130
|
+
check_output 'id
|
131
|
+
name
|
132
|
+
owner_id'
|
133
|
+
|
134
|
+
run 'zn list-datasets \
|
135
|
+
--config-file spec/fixtures/starwars/index.yml'
|
136
|
+
check_output 'people
|
137
|
+
planets
|
138
|
+
robots'
|
139
|
+
|
140
|
+
echo -e "\\033[32mSUCCESS\\033[0m"
|
data/bin/test
CHANGED
data/lib/zn/cli.rb
CHANGED
@@ -59,15 +59,16 @@ module Zn
|
|
59
59
|
required: true, environment_variable: 'ZN_CONFIG_FILE'
|
60
60
|
|
61
61
|
def execute
|
62
|
-
puts search_assembly(config_file).
|
62
|
+
puts search_assembly(config_file).dataset_keys(dataset: dataset)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
subcommand 'list-datasets', 'List known datasets' do
|
67
|
-
option ['--config-file', '-c'], 'CONFIG_FILE', 'Config that defines datasets',
|
67
|
+
option ['--config-file', '-c'], 'CONFIG_FILE', 'Config that defines datasets',
|
68
|
+
required: true, environment_variable: 'ZN_CONFIG_FILE'
|
68
69
|
|
69
70
|
def execute
|
70
|
-
puts search_assembly(config_file).
|
71
|
+
puts search_assembly(config_file).dataset_names
|
71
72
|
end
|
72
73
|
end
|
73
74
|
|
data/lib/zn/dataset.rb
CHANGED
data/lib/zn/repos/json_repo.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'multi_json'
|
4
|
-
require 'jq/extend'
|
5
4
|
|
6
5
|
module Zn
|
7
6
|
module Repos
|
@@ -29,25 +28,31 @@ module Zn
|
|
29
28
|
value = params.fetch(:value)
|
30
29
|
exact = params.fetch(:exact)
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
yield result
|
31
|
+
if exact
|
32
|
+
search_exact(key, value) { |result| yield result }
|
33
|
+
else
|
34
|
+
search_for_inclusion(key, value) { |result| yield result }
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
private
|
40
39
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
def search_exact(key, value)
|
41
|
+
return enum_for(:search_exact, key, value) unless block_given?
|
42
|
+
|
43
|
+
all.each do |element|
|
44
|
+
yield element if element[key].to_s == value.to_s
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
def
|
50
|
-
|
48
|
+
def search_for_inclusion(key, value)
|
49
|
+
return enum_for(:search_for_inclusion, key, value) unless block_given?
|
50
|
+
|
51
|
+
return [].each if value.empty?
|
52
|
+
|
53
|
+
all.each do |element|
|
54
|
+
yield element if element[key].to_s.include?(value.to_s)
|
55
|
+
end
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|
data/lib/zn/version.rb
CHANGED
data/zn.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.require_paths = ['lib']
|
29
29
|
|
30
30
|
spec.add_dependency 'multi_json', '~> 1.12'
|
31
|
-
spec.add_dependency '
|
31
|
+
spec.add_dependency 'clamp', '~> 1.1'
|
32
32
|
|
33
33
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
34
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Latheesh Padukana
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.12'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: clamp
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.1'
|
34
34
|
type: :runtime
|
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: '
|
40
|
+
version: '1.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,12 +163,17 @@ files:
|
|
163
163
|
- ".rubocop.yml"
|
164
164
|
- ".ruby-version"
|
165
165
|
- ".travis.yml"
|
166
|
+
- Dockerfile
|
166
167
|
- Gemfile
|
167
168
|
- LICENSE.txt
|
168
169
|
- README.md
|
169
170
|
- Rakefile
|
170
171
|
- bin/console
|
172
|
+
- bin/install
|
173
|
+
- bin/release
|
174
|
+
- bin/rspec-test
|
171
175
|
- bin/setup
|
176
|
+
- bin/smoke-test
|
172
177
|
- bin/style-check
|
173
178
|
- bin/test
|
174
179
|
- exe/zn
|