jr-cli 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc2ffde2cd8c8ed240f2c6ac95280989f832c9d2
4
- data.tar.gz: ce5baad0960ed09d2b9d40522bb8310bf6e9e2a2
3
+ metadata.gz: 7fbe53abe97c6501e6e1d78f1bfdded7ef8cfd97
4
+ data.tar.gz: 3cd6173a84e84c40e856c56a7638197f3764d9f9
5
5
  SHA512:
6
- metadata.gz: 985ebad8fec41d956073bdd22858aa04d271ed22889a5b7dbf882bb995adcfb960783feac2bde3a607c796993dd06a15184b87b7f4d3ba1c411671f42e931ce5
7
- data.tar.gz: 62b23da2e0d80609da765e17c03c12da04437f06cd26730eb7cff57e2ed1d386d6fdbd648cc293148f35344b9eeea4f6c1100ec439e408b05a9132fbc7bf9ffd
6
+ metadata.gz: 23149a324db87a7cc6dee03e34bdde6f30d679c69fd77c73ec9f37f7cb93205e2a01bf8a1c6c65640ea3f8e5f9a7a6584f8ed6c30d734ae59d9ca27e58b99396
7
+ data.tar.gz: a3e3aebf4c2ae87f9e80dc4bd4ff76127ba27c8bfb34ea67386af1c2c6ca21c7fe9651badaa6b275ad19f3d959fcf3d7413eccf704ffe533a148c2b82281ca1c
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2.2
7
+ - ruby-head
8
+ branches:
9
+ only:
10
+ - master
11
+ before_install: gem install bundler -v 1.10.6
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: ruby-head
data/CHANGELOG.md CHANGED
@@ -1,10 +1,25 @@
1
- 0.0.2 (2014-10-06)
2
- ------------------
1
+ ## 0.2.0 (2015-08-19)
2
+
3
+ * [BREAKING CHANGE] Now `-r` is alias for `--raw-output` and use `--require` to require library
4
+ * Colorize output by default
5
+ * Add core\_ext modules for `Hash`, `Enumerable` and `Enumerator`
6
+ * Add `--compact-output` option
7
+ * Add `--color-output` option
8
+ * Add `--monochrome-output` option
9
+
10
+ ## 0.1.0 (2014-11-06)
11
+
12
+ * Add `-r` option to require library
13
+
14
+ ## 0.0.3 (2014-11-05)
15
+
16
+ * Handle SIGINT
17
+
18
+ ## 0.0.2 (2014-10-06)
3
19
 
4
20
  * JSON Enumerator is returned as Enumerator::Lazy by default
5
21
  * Add Kernel#itself method for Ruby 2.1 or earlier
6
22
 
7
- 0.0.1 (2014-10-03)
8
- ------------------
23
+ ## 0.0.1 (2014-10-03)
9
24
 
10
25
  * Initial release
data/Guardfile ADDED
@@ -0,0 +1,35 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard :test do
19
+ watch(%r{^test/.+_test\.rb$})
20
+ watch('test/test_helper.rb') { 'test' }
21
+
22
+ # Non-rails
23
+ watch(%r{^lib/jr/cli/(.+)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
24
+ end
25
+
26
+ guard "cucumber" do
27
+ watch(%r{^lib/.+\.rb$}) { "features" }
28
+
29
+ watch(%r{^features/.+\.feature$})
30
+ watch(%r{^features/support/.+$}) { "features" }
31
+
32
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) do |m|
33
+ Dir[File.join("**/#{m[1]}.feature")][0] || "features"
34
+ end
35
+ end
data/README.md CHANGED
@@ -31,7 +31,13 @@ You can also read JSON not from files but from STDIN.
31
31
 
32
32
  ### options
33
33
 
34
- * -r FILE: require the FILE before execution
34
+ ```
35
+ --require FILE require the FILE before execution
36
+ -c, --compact-output output each JSON in single line
37
+ -r, --raw-output output strings as raw output
38
+ -C, --color-output output with colors even if writing to a pipe or a file
39
+ -M, --monochrome-output output without colors
40
+ ```
35
41
 
36
42
  ## jr filter tutorial
37
43
 
@@ -40,67 +46,69 @@ Let's process JSON of GitHub API!
40
46
  At first, download JSON of repos into your local to avoid API rate limit.
41
47
 
42
48
  ```
43
- $ curl -s 'https://api.github.com/users/yuya-takeyama/repos' > repos.json
49
+ $ curl -s 'https://api.github.com/users/yuya-takeyama/repos?per_page=100' > repos.json
44
50
  ```
45
51
 
46
- ### show repositories
52
+ ### Unwrap Array with `Enumerable#unwrap`
47
53
 
48
- Because response from `GET /users/:username/repos` is wrapped with `Array`, flatten it by `#flat_map`.
54
+ Because response from `GET /users/:username/repos` is wrapped with `Array`, unwrap it using `Enumerable#unwrap`.
55
+ It's a built-in method of jr.
49
56
  You'll get stream of JSON reperesents repositories.
50
57
 
51
58
  ```
52
- $ jr 'flat_map(&:itself)' repos.json
59
+ $ jr 'unwrap' repos.json
53
60
  ```
54
61
 
55
- Pro Tip: `Kernel#itself` is an identity function implemented in Ruby 2.2.0, but `jr` provides it for Ruby 2.1.0 or earlier versions.
56
-
57
- ### map to reduce data
62
+ ### Aggregate data with methods of `Enumerable`
58
63
 
59
- Default response has too much informations.
60
- So reduce data using `#map` method.
64
+ `Enumerable` has many useful methods and you can transform data with them.
61
65
 
62
66
  ```
63
- $ jr 'flat_map(&:itself).map{|j| {name: j[:name], desc: j[:description], lang: j[:language]} }' repos.json
64
- {
65
- "name": "acne",
66
- "desc": "Simple DI container for PHP < 5.3",
67
- "lang": "PHP"
68
- }
69
- {
70
- "name": "akb48_recognizer",
71
- "desc": "AKB48 recognition using Face.com API",
72
- "lang": "Ruby"
73
- }
67
+ $j r 'unwrap.group_by(&:language).map{|k, v| [k, v.size] }.sort_by{|k, v| -v }' repos.json
68
+ [
69
+ "Ruby",
70
+ 28
71
+ ]
72
+ [
73
+ "PHP",
74
+ 22
75
+ ]
76
+ [
77
+ "Go",
78
+ 17
79
+ ]
74
80
  (...omitted...)
75
- {
76
- "name": "disco-dance.tv",
77
- "desc": "For Socket.IO learning.",
78
- "lang": "JavaScript"
79
- }
80
- {
81
- "name": "docker-plenv-vanilla",
82
- "desc": null,
83
- "lang": "Shell"
84
- }
81
+ [
82
+ "VimL",
83
+ 1
84
+ ]
85
+ [
86
+ "CoffeeScript",
87
+ 1
88
+ ]
89
+ [
90
+ "Perl",
91
+ 1
92
+ ]
85
93
  ```
86
94
 
87
- ### aggregate by language
95
+ ### Output as text
88
96
 
89
- Repositories have its primary language which is detected automatically.
90
- Let's aggregate it and count by languages.
97
+ You can transform JSONs into String and output as raw text using `-r` option.
91
98
 
92
99
  ```
93
- $ jr 'flat_map(&:itself).map{|j| {name: j[:name], desc: j[:description], lang: j[:language]} }.group_by{|j| j[:lang] }.map{|l, v| [l, v.size ] }.to_h' repos.json
94
- {
95
- "PHP": 10,
96
- "Ruby": 12,
97
- "": 1,
98
- "JavaScript": 3,
99
- "CoffeeScript": 1,
100
- "CSS": 1,
101
- "Go": 1,
102
- "Shell": 1
103
- }
100
+ $ jr 'unwrap.group_by(&:language).map{|k, v| [k, v.size] }.sort_by{|k, v| -v }.map{|l, s| "#{s}\t#{l}" }' -r repos.json
101
+ 28 Ruby
102
+ 22 PHP
103
+ 17 Go
104
+ 12 JavaScript
105
+ 11
106
+ 3 CSS
107
+ 2 Shell
108
+ 2 C
109
+ 1 VimL
110
+ 1 CoffeeScript
111
+ 1 Perl
104
112
  ```
105
113
 
106
114
  ## Basic mechanism
data/Rakefile CHANGED
@@ -1,2 +1,15 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ require 'cucumber/rake/task'
2
4
 
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << "test"
7
+ t.libs << "lib"
8
+ t.test_files = FileList['test/**/*_test.rb']
9
+ end
10
+
11
+ Cucumber::Rake::Task.new(:features) do |t|
12
+ t.cucumber_opts = "features --format pretty"
13
+ end
14
+
15
+ task :default => [:test, :features]
data/bin/jr CHANGED
@@ -1,27 +1,26 @@
1
1
  #!/usr/bin/env ruby
2
2
  # coding: utf-8
3
3
 
4
- lib = File.expand_path('../../lib', __FILE__)
5
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
-
7
4
  require 'jr/cli/version'
8
5
  require 'optparse'
9
6
  require 'yajl'
7
+ require 'coderay'
10
8
 
11
9
  opt = OptionParser.new
12
10
  opt.banner = "jr - Command-line JSON processor for Rubyists [Ver. #{Jr::Cli::VERSION}]\n\n" +
13
11
  "Usage: jr [options] <jr filter> [file...]"
14
12
  opt.version = Jr::Cli::VERSION
15
- opt.on('-r FILE', 'require the FILE before execution') {|file| require file }
13
+ opt.on('--require FILE', 'require the FILE before execution') {|file| require file }
14
+ pretty = true
15
+ opt.on('-c', '--compact-output', 'output each JSON in single line') { pretty = false }
16
+ raw_output = false
17
+ opt.on('-r', '--raw-output', 'output strings as raw output') { raw_output = true }
18
+ color_output = STDOUT.tty?
19
+ opt.on('--color-output', '-C', 'output with colors even if writing to a pipe or a file') { color_output = true }
20
+ opt.on('--monochrome-output', '-M', 'output without colors') { color_output = false }
16
21
  opt.parse! ARGV
17
22
 
18
- unless Kernel.respond_to? :itself
19
- module Kernel
20
- def itself
21
- self
22
- end
23
- end
24
- end
23
+ require 'jr/cli/core_ext'
25
24
 
26
25
  trap('INT') { exit 130 }
27
26
 
@@ -34,12 +33,23 @@ result = Enumerator.new do |yielder|
34
33
  end
35
34
  end.lazy.instance_eval(ARGV[0])
36
35
 
37
- encoder = Yajl::Encoder.new(pretty: true)
36
+ encoder = Yajl::Encoder.new(pretty: pretty)
37
+ print_json = ->(data) do
38
+ if raw_output and data.is_a? String
39
+ puts data
40
+ else
41
+ if color_output
42
+ puts CodeRay.scan(encoder.encode(data), :json).terminal
43
+ else
44
+ puts encoder.encode(data)
45
+ end
46
+ end
47
+ end
38
48
 
39
49
  if result.is_a? Array or result.kind_of? Enumerator
40
50
  result.each do |data|
41
- puts encoder.encode(data)
51
+ print_json.call data
42
52
  end
43
53
  else
44
- puts encoder.encode(result)
54
+ print_json.call result
45
55
  end
@@ -0,0 +1,72 @@
1
+ Feature: core_ext
2
+
3
+ jr introduce some extended method for basic objects
4
+
5
+ Scenario: attribute reader
6
+ Given a file named "input.json" with:
7
+ """
8
+ {"name":"foo"}
9
+ {"name":"bar"}
10
+ {"name":"baz"}
11
+ """
12
+ When I run `jr 'map(&:name)' input.json`
13
+ Then the output should contain exactly:
14
+ """
15
+ "foo"
16
+ "bar"
17
+ "baz"
18
+
19
+ """
20
+
21
+ Scenario: attribute checker
22
+ Given a file named "input.json" with:
23
+ """
24
+ {"ua":"Chrome"}
25
+ {"ua":"Safari","is_crawler":false}
26
+ {"ua":"Googlebot","is_crawler":true}
27
+ """
28
+ When I run `jr 'select(&:is_crawler?)' input.json`
29
+ Then the output should contain exactly:
30
+ """
31
+ {
32
+ "ua": "Googlebot",
33
+ "is_crawler": true
34
+ }
35
+
36
+ """
37
+
38
+ Scenario: unwrap Array and Hash
39
+ Given a file named "input.json" with:
40
+ """
41
+ ["a","b",["c"]]
42
+ {"a":"A","b":"B","c":{"cc":"CC"}}
43
+ """
44
+ When I run `jr 'unwrap' input.json`
45
+ Then the output should contain exactly:
46
+ """
47
+ "a"
48
+ "b"
49
+ [
50
+ "c"
51
+ ]
52
+ "A"
53
+ "B"
54
+ {
55
+ "cc": "CC"
56
+ }
57
+
58
+ """
59
+
60
+ Scenario: number of JSON
61
+ Given a file named "input.json" with:
62
+ """
63
+ {"name":"foo"}
64
+ {"name":"bar"}
65
+ {"name":"baz"}
66
+ """
67
+ When I run `jr 'size' input.json`
68
+ Then the output should contain exactly:
69
+ """
70
+ 3
71
+
72
+ """
@@ -0,0 +1,247 @@
1
+ Feature: JSON processing
2
+
3
+ jr is jq like JSON processor for Rubyist
4
+
5
+ Scenario: Filter single JSON of Object
6
+ Given a file named "input.json" with:
7
+ """
8
+ {"foo":"bar"}
9
+ """
10
+ When I run `jr 'self' input.json`
11
+ Then the output should contain exactly:
12
+ """
13
+ {
14
+ "foo": "bar"
15
+ }
16
+
17
+ """
18
+
19
+ Scenario: Filter multiple JSONs of Object
20
+ Given a file named "input.json" with:
21
+ """
22
+ {"foo":"bar"}
23
+ {"baz":"foobar"}
24
+ {"qux":"quux"}
25
+ """
26
+ When I run `jr 'self' input.json`
27
+ Then the output should contain exactly:
28
+ """
29
+ {
30
+ "foo": "bar"
31
+ }
32
+ {
33
+ "baz": "foobar"
34
+ }
35
+ {
36
+ "qux": "quux"
37
+ }
38
+
39
+ """
40
+
41
+ Scenario: Filter JSON using Ruby methods
42
+ Given a file named "input.json" with:
43
+ """
44
+ {"id":1,"name":"foo"}
45
+ {"id":2,"name":"bar"}
46
+ {"id":3,"name":"baz"}
47
+ {"id":4,"name":"foobar"}
48
+ {"id":5,"name":"qux"}
49
+ """
50
+ When I run `jr 'select{|j| j[:id].odd? }.map{|j| {name: j[:name]} }' input.json`
51
+ Then the output should contain exactly:
52
+ """
53
+ {
54
+ "name": "foo"
55
+ }
56
+ {
57
+ "name": "baz"
58
+ }
59
+ {
60
+ "name": "qux"
61
+ }
62
+
63
+ """
64
+
65
+ Scenario: Read multiple files
66
+ Given a file named "input1.json" with:
67
+ """
68
+ {"foo":"bar"}
69
+ """
70
+ And a file named "input2.json" with:
71
+ """
72
+ {"baz":"foobar"}
73
+ """
74
+ When I run `jr 'self' input1.json input2.json`
75
+ Then the output should contain exactly:
76
+ """
77
+ {
78
+ "foo": "bar"
79
+ }
80
+ {
81
+ "baz": "foobar"
82
+ }
83
+
84
+ """
85
+
86
+ Scenario: Filter single JSON of Array
87
+ Given a file named "input.json" with:
88
+ """
89
+ [1,2,3]
90
+ """
91
+ When I run `jr 'self' input.json`
92
+ Then the output should contain exactly:
93
+ """
94
+ [
95
+ 1,
96
+ 2,
97
+ 3
98
+ ]
99
+
100
+ """
101
+
102
+ Scenario: Filter multiple JSONs of Array
103
+ Given a file named "input.json" with:
104
+ """
105
+ [1,2,3]
106
+ [4,5,6]
107
+ [7,8,9]
108
+ """
109
+ When I run `jr 'self' input.json`
110
+ Then the output should contain exactly:
111
+ """
112
+ [
113
+ 1,
114
+ 2,
115
+ 3
116
+ ]
117
+ [
118
+ 4,
119
+ 5,
120
+ 6
121
+ ]
122
+ [
123
+ 7,
124
+ 8,
125
+ 9
126
+ ]
127
+
128
+ """
129
+
130
+ Scenario: Filter a string
131
+ Given a file named "input.json" with:
132
+ """
133
+ "foo"
134
+ """
135
+ When I run `jr 'self' input.json`
136
+ Then the output should contain exactly:
137
+ """
138
+ "foo"
139
+
140
+ """
141
+
142
+ Scenario: Filter multiple strings
143
+ Given a file named "input.json" with:
144
+ """
145
+ "foo"
146
+ "bar"
147
+ "baz"
148
+ """
149
+ When I run `jr 'self' input.json`
150
+ Then the output should contain exactly:
151
+ """
152
+ "foo"
153
+ "bar"
154
+ "baz"
155
+
156
+ """
157
+
158
+ Scenario: require rubygems using -r option
159
+ Given a file named "input.json" with:
160
+ """
161
+ {"ua":"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}
162
+ """
163
+ When I run `jr --require woothee 'map{ |j| j.merge({woothee: Woothee.parse(j.ua)}) }' input.json`
164
+ Then the output should contain exactly:
165
+ """
166
+ {
167
+ "ua": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
168
+ "woothee": {
169
+ "name": "Googlebot",
170
+ "category": "crawler",
171
+ "os": "UNKNOWN",
172
+ "os_version": "UNKNOWN",
173
+ "version": "UNKNOWN",
174
+ "vendor": "UNKNOWN"
175
+ }
176
+ }
177
+
178
+ """
179
+
180
+ Scenario: Output each JSON in single line using --compact-output option
181
+ Given a file named "input.json" with:
182
+ """
183
+ {
184
+ "name": "foo"
185
+ }
186
+ {
187
+ "name": "bar"
188
+ }
189
+ {
190
+ "name": "baz"
191
+ }
192
+
193
+ """
194
+ When I run `jr --compact-output 'self' input.json`
195
+ Then the output should contain exactly:
196
+ """
197
+ {"name":"foo"}
198
+ {"name":"bar"}
199
+ {"name":"baz"}
200
+
201
+ """
202
+
203
+ Scenario: Output each JSON in single line using -c option
204
+ Given a file named "input.json" with:
205
+ """
206
+ {
207
+ "name": "foo"
208
+ }
209
+ {
210
+ "name": "bar"
211
+ }
212
+ {
213
+ "name": "baz"
214
+ }
215
+
216
+ """
217
+ When I run `jr -c 'self' input.json`
218
+ Then the output should contain exactly:
219
+ """
220
+ {"name":"foo"}
221
+ {"name":"bar"}
222
+ {"name":"baz"}
223
+
224
+ """
225
+
226
+ Scenario: Output strings as raw output using --raw-output option
227
+ Given a file named "input.json" with:
228
+ """
229
+ {
230
+ "name": "foo"
231
+ }
232
+ {
233
+ "name": "bar"
234
+ }
235
+ {
236
+ "name": "baz"
237
+ }
238
+
239
+ """
240
+ When I run `jr --raw-output 'map(&:name)' input.json`
241
+ Then the output should contain exactly:
242
+ """
243
+ foo
244
+ bar
245
+ baz
246
+
247
+ """
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
data/jr-cli.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["sign.of.the.wolf.pentagram@gmail.com"]
11
11
  spec.summary = %q{jr: command-line JSON processor for Rubyists}
12
12
  spec.description = %q{jr is jq like JSON processor. Its script can be written in Ruby}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/yuya-takeyama/jr"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -19,7 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "yajl-ruby"
22
+ spec.add_runtime_dependency "coderay"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.6"
24
25
  spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "test-unit"
27
+ spec.add_development_dependency "aruba"
28
+ spec.add_development_dependency "guard"
29
+ spec.add_development_dependency "guard-test"
30
+ spec.add_development_dependency "guard-cucumber"
31
+ spec.add_development_dependency "woothee"
25
32
  end
@@ -0,0 +1,17 @@
1
+ module Enumerable
2
+ def unwrap
3
+ Enumerator.new do |yielder|
4
+ each do |element|
5
+ if element.is_a? Hash
6
+ element.each_value do |sub_element|
7
+ yielder.yield sub_element
8
+ end
9
+ else
10
+ element.each do |sub_element|
11
+ yielder.yield sub_element
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ class Enumerator
2
+ # Compute size even if it is infinite list
3
+ def size
4
+ reduce(0) { |acc, x| acc += 1 }
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ class Hash
2
+ def method_missing(method_name, *args)
3
+ return self[method_name] if key? method_name
4
+ name, suffix = split_name_and_suffix(method_name)
5
+ case suffix
6
+ when '?'
7
+ !!self[name.to_sym]
8
+ when '='
9
+ self[name.to_sym] = args[0]
10
+ else
11
+ self[name.to_sym]
12
+ end
13
+ end
14
+
15
+ private
16
+ METHOD_SPLITTER = /(.*?)([\?=]?)$/
17
+
18
+ def split_name_and_suffix(method_name)
19
+ match = method_name.to_s.match(METHOD_SPLITTER)
20
+ [match[1], match[2]]
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Kernel
2
+ unless Kernel.respond_to? :itself
3
+ def itself
4
+ self
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ require 'jr/cli/core_ext/kernel'
2
+ require 'jr/cli/core_ext/hash'
3
+ require 'jr/cli/core_ext/enumerable'
4
+ require 'jr/cli/core_ext/enumerator'
@@ -1,5 +1,5 @@
1
1
  module Jr
2
2
  module Cli
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
data/resources/img/jr.gif CHANGED
Binary file
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ require 'jr/cli/core_ext/enumerable'
3
+
4
+ class EnumerableTest < Test::Unit::TestCase
5
+ sub_test_case '#unwrap' do
6
+ test 'unwrap Array of Arrays' do
7
+ assert do
8
+ input = [
9
+ ['a', 'b', ['c']],
10
+ ['A']
11
+ ]
12
+ expected = ['a', 'b', ['c'], 'A']
13
+
14
+ input.unwrap.to_a == expected
15
+ end
16
+ end
17
+
18
+ test 'unwrap Array of Hashes' do
19
+ assert do
20
+ input = [
21
+ {a: 'A', b: 'B', c: {cc: 'CC'}},
22
+ {aa: 'AA'},
23
+ ]
24
+ expected = ['A', 'B', {cc: 'CC'}, 'AA']
25
+
26
+ input.unwrap.to_a == expected
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ require 'test/unit'
2
+ require 'jr/cli/core_ext/enumerator'
3
+
4
+ class EnumerableTest < Test::Unit::TestCase
5
+ sub_test_case '#size' do
6
+ test 'returns number of elements' do
7
+ enumerator = Enumerator.new do |yielder|
8
+ yielder.yield 1
9
+ yielder.yield 2
10
+ yielder.yield 3
11
+ end
12
+
13
+ assert do
14
+ enumerator.size == 3
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,54 @@
1
+ require 'test/unit'
2
+ require 'jr/cli/core_ext/hash'
3
+
4
+ class HashTest < Test::Unit::TestCase
5
+ sub_test_case 'read propertya' do
6
+ test 'read the value' do
7
+ assert do
8
+ {foo: 'bar'}.foo == 'bar'
9
+ end
10
+ end
11
+
12
+ test 'return nil if the key does not exist' do
13
+ assert do
14
+ {foo: 'bar'}.bar == nil
15
+ end
16
+ end
17
+ end
18
+
19
+ sub_test_case 'check key existence' do
20
+ test 'return true if the key exists and truthy' do
21
+ assert do
22
+ {foo: 'bar'}.foo? == true
23
+ end
24
+ end
25
+
26
+ test 'return false if the key exists but it is false' do
27
+ assert do
28
+ {foo: false}.foo? == false
29
+ end
30
+ end
31
+
32
+ test 'return false if the key exists but it is nil' do
33
+ assert do
34
+ {foo: nil}.foo? == false
35
+ end
36
+ end
37
+
38
+ test 'return false if the key does not exists' do
39
+ assert do
40
+ {foo: 'bar'}.bar? == false
41
+ end
42
+ end
43
+ end
44
+
45
+ sub_test_case 'write property' do
46
+ test 'write value into the property' do
47
+ assert do
48
+ hash = {}
49
+ hash.foo = 'bar'
50
+ hash.foo == 'bar'
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ require 'test/unit'
2
+ require 'jr/cli/core_ext/kernel'
3
+
4
+ class KernelTest < Test::Unit::TestCase
5
+ sub_test_case '#itself' do
6
+ test 'returns the object itself' do
7
+ assert do
8
+ obj = {}
9
+ obj == obj.itself
10
+ end
11
+ end
12
+ end
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jr-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuya Takeyama
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-06 00:00:00.000000000 Z
11
+ date: 2015-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yajl-ruby
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coderay
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,90 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aruba
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-test
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-cucumber
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: woothee
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
55
153
  description: jr is jq like JSON processor. Its script can be written in Ruby
56
154
  email:
57
155
  - sign.of.the.wolf.pentagram@gmail.com
@@ -61,16 +159,30 @@ extensions: []
61
159
  extra_rdoc_files: []
62
160
  files:
63
161
  - ".gitignore"
162
+ - ".travis.yml"
64
163
  - CHANGELOG.md
65
164
  - Gemfile
165
+ - Guardfile
66
166
  - LICENSE.txt
67
167
  - README.md
68
168
  - Rakefile
69
169
  - bin/jr
170
+ - features/core_ext.feature
171
+ - features/json_processing.feature
172
+ - features/support/env.rb
70
173
  - jr-cli.gemspec
174
+ - lib/jr/cli/core_ext.rb
175
+ - lib/jr/cli/core_ext/enumerable.rb
176
+ - lib/jr/cli/core_ext/enumerator.rb
177
+ - lib/jr/cli/core_ext/hash.rb
178
+ - lib/jr/cli/core_ext/kernel.rb
71
179
  - lib/jr/cli/version.rb
72
180
  - resources/img/jr.gif
73
- homepage: ''
181
+ - test/unit/core_ext/enumerable_test.rb
182
+ - test/unit/core_ext/enumerator_test.rb
183
+ - test/unit/core_ext/hash_test.rb
184
+ - test/unit/core_ext/kernel_test.rb
185
+ homepage: https://github.com/yuya-takeyama/jr
74
186
  licenses:
75
187
  - MIT
76
188
  metadata: {}
@@ -90,8 +202,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
202
  version: '0'
91
203
  requirements: []
92
204
  rubyforge_project:
93
- rubygems_version: 2.2.2
205
+ rubygems_version: 2.4.5
94
206
  signing_key:
95
207
  specification_version: 4
96
208
  summary: 'jr: command-line JSON processor for Rubyists'
97
- test_files: []
209
+ test_files:
210
+ - features/core_ext.feature
211
+ - features/json_processing.feature
212
+ - features/support/env.rb
213
+ - test/unit/core_ext/enumerable_test.rb
214
+ - test/unit/core_ext/enumerator_test.rb
215
+ - test/unit/core_ext/hash_test.rb
216
+ - test/unit/core_ext/kernel_test.rb