ki_format 0.0.5 → 0.0.6

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.
data/lib/ki_format.rb CHANGED
@@ -5,7 +5,9 @@ require 'terminal-table'
5
5
 
6
6
  module KiFormat
7
7
 
8
- autoload :Command, 'ki_format/command'
8
+ autoload :Command, 'ki_format/command'
9
+ autoload :Json, 'ki_format/json'
10
+ autoload :ObjectSet, 'ki_format/object_set'
9
11
  autoload :TableMaker, 'ki_format/table_maker'
10
12
 
11
13
  end
@@ -11,74 +11,55 @@ module KiFormat
11
11
  end
12
12
 
13
13
  def print_pretty
14
- json_in do |data|
15
- output.puts MultiJson.dump(data, :pretty => true)
14
+ json_in(false) do |data|
15
+ MultiJson.dump(data, :pretty => true)
16
16
  end
17
17
  end
18
18
 
19
19
  def print_keys
20
20
  json_in do |data|
21
- data = wrap(data)
22
- keys = data.inject({}) { |r,e| r.merge(e) }.keys
23
- output.puts keys.join("\n")
21
+ ObjectSet.merged_keys(data).join("\n")
24
22
  end
25
23
  end
26
24
 
27
25
  def print_list
28
26
  json_in do |data|
29
- data = wrap(data)
30
- data.each do |obj|
31
- output.puts MultiJson.dump(obj, :pretty => false)
32
- end
27
+ data.map do |obj|
28
+ MultiJson.dump(obj, :pretty => false)
29
+ end.join("\n")
33
30
  end
34
31
  end
35
32
 
36
33
  def print_table(*keys)
37
34
  json_in do |data|
38
- data = wrap(data)
39
- output.puts(TableMaker.new(data, :only => keys).print)
35
+ TableMaker.new(data, :only => keys).print
40
36
  end
41
37
  end
42
38
 
43
39
  def print_selected(*keys)
44
40
  json_in do |data|
45
- data = wrap(data)
46
- output.puts(TableMaker.new(data, :only => keys).print(:plain => true))
41
+ TableMaker.new(data, :only => keys).print(:plain => true)
47
42
  end
48
43
  end
49
44
 
50
45
  private
51
46
 
52
47
  def wrap(data)
53
- if data.is_a?(Array)
48
+ case data
49
+ when Array
54
50
  data
55
51
  else
56
52
  [data]
57
53
  end
58
54
  end
59
55
 
60
- def json_in
61
- json = input.read
62
- begin
63
- data = MultiJson.load(json)
64
- yield data
65
- rescue MultiJson::DecodeError
66
- begin
67
- data = try_as_array(json)
68
- yield data
69
- rescue MultiJson::DecodeError
70
- error.puts "Invalid JSON"
71
- end
72
- end
73
- end
74
-
75
- def try_as_array(json)
76
- array = []
77
- parts = json.split("\n")
78
- parts.each do |part|
79
- array << MultiJson.load(part)
56
+ def json_in(should_wrap = true)
57
+ result = Json.load_json(input.read) do |data|
58
+ yield should_wrap ? wrap(data) : data
80
59
  end
81
- array
60
+ output.puts result
61
+ rescue MultiJson::DecodeError
62
+ error.puts "Invalid JSON"
82
63
  end
83
64
 
84
65
  end
@@ -0,0 +1,29 @@
1
+ module KiFormat
2
+
3
+ module Json
4
+
5
+ class << self
6
+
7
+ def load_json(json)
8
+ data = MultiJson.load(json)
9
+ yield data
10
+ rescue MultiJson::DecodeError
11
+ begin
12
+ data = try_as_array(json)
13
+ yield data
14
+ end
15
+ end
16
+
17
+ def try_as_array(json)
18
+ array = []
19
+ parts = json.split("\n")
20
+ parts.each do |part|
21
+ array << MultiJson.load(part)
22
+ end
23
+ array
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ module KiFormat
2
+
3
+ module ObjectSet
4
+
5
+ class << self
6
+
7
+ def merged_keys(objects)
8
+ objects.inject({}) { |r,e| r.merge(e) }.keys
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -23,8 +23,7 @@ module KiFormat
23
23
  end
24
24
  str = table.to_s
25
25
  if plain
26
- # hack to remove the first (blank) line
27
- str.split("\n")[1..-1].join("\n")
26
+ remove_first_blank_line(str)
28
27
  else
29
28
  str
30
29
  end
@@ -32,13 +31,21 @@ module KiFormat
32
31
 
33
32
  private
34
33
 
34
+ def remove_first_blank_line(str)
35
+ if str=~/.+\n/
36
+ str.split("\n")[1..-1].join("\n")
37
+ else
38
+ str
39
+ end
40
+ end
41
+
35
42
  def build_headings(keys)
36
43
  all_keys = Set.new
37
44
  @data.each do |obj|
38
45
  all_keys.merge(obj.keys)
39
46
  end
40
47
  if keys && !keys.empty?
41
- all_keys.intersection(keys)
48
+ all_keys.intersection(keys)
42
49
  else
43
50
  all_keys
44
51
  end
@@ -1,3 +1,3 @@
1
1
  module KiFormat
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Json.load_json" do
4
+
5
+ it 'yields json' do
6
+ data = nil
7
+ Json.load_json('{ "a" : 1 }') { |d| data = d}
8
+ data.should == {'a' => 1}
9
+ end
10
+
11
+ it 'yields array if JSON objects are on different lines' do
12
+ data = nil
13
+ Json.load_json(%Q{{"a":1}\n{"b":2}}) { |d| data = d}
14
+ data.should == [{'a'=>1}, {'b' => 2}]
15
+ end
16
+
17
+ it 'raises DecodeError if JSON is completely invalid' do
18
+ lambda do
19
+ Json.load_json("2")
20
+ end.should raise_error(MultiJson::DecodeError)
21
+ end
22
+
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe ObjectSet do
4
+
5
+ describe ".merged_keys" do
6
+
7
+ it 'returns empty array for empty set of objects' do
8
+ ObjectSet.merged_keys([]).should == []
9
+ end
10
+
11
+ it 'returns all keys of object if there is just one object' do
12
+ ObjectSet.merged_keys([{'a'=>1}]).should == ['a']
13
+ end
14
+
15
+ it 'returns union of keys if there are more than one object' do
16
+ objects = [ {:a => 1, :b => 2},
17
+ {:b => 3, :c => 4} ]
18
+ ObjectSet.merged_keys(objects).should == [:a, :b, :c]
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -2,6 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe TableMaker do
4
4
 
5
+ it "returns empty string if data is empty array" do
6
+ maker = TableMaker.new([])
7
+ maker.print(:plain => true).should == "\n"
8
+ end
9
+
5
10
  it "prints table with keys" do
6
11
  data = [{ :name => "Bob", :age => 35 },
7
12
  { :name => "Sam", :age => 40 }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ki_format
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-17 00:00:00.000000000Z
13
+ date: 2013-03-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
17
- requirement: &70155507580720 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: 1.3.6
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70155507580720
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: 1.3.6
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: methadone
28
- requirement: &70155507580220 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ~>
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: 1.2.1
34
39
  type: :runtime
35
40
  prerelease: false
36
- version_requirements: *70155507580220
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 1.2.1
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: map
39
- requirement: &70155507579760 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ~>
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: 4.6.1
45
55
  type: :runtime
46
56
  prerelease: false
47
- version_requirements: *70155507579760
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 4.6.1
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: terminal-table
50
- requirement: &70155507579300 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ~>
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: 1.4.5
56
71
  type: :runtime
57
72
  prerelease: false
58
- version_requirements: *70155507579300
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 1.4.5
59
79
  - !ruby/object:Gem::Dependency
60
80
  name: debugger
61
- requirement: &70155507578840 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
62
82
  none: false
63
83
  requirements:
64
84
  - - ~>
@@ -66,10 +86,15 @@ dependencies:
66
86
  version: 1.2.0
67
87
  type: :development
68
88
  prerelease: false
69
- version_requirements: *70155507578840
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 1.2.0
70
95
  - !ruby/object:Gem::Dependency
71
96
  name: rake
72
- requirement: &70155507578380 !ruby/object:Gem::Requirement
97
+ requirement: !ruby/object:Gem::Requirement
73
98
  none: false
74
99
  requirements:
75
100
  - - ~>
@@ -77,10 +102,15 @@ dependencies:
77
102
  version: 0.9.2
78
103
  type: :development
79
104
  prerelease: false
80
- version_requirements: *70155507578380
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.2
81
111
  - !ruby/object:Gem::Dependency
82
112
  name: rspec
83
- requirement: &70155507577920 !ruby/object:Gem::Requirement
113
+ requirement: !ruby/object:Gem::Requirement
84
114
  none: false
85
115
  requirements:
86
116
  - - ~>
@@ -88,10 +118,15 @@ dependencies:
88
118
  version: 2.11.0
89
119
  type: :development
90
120
  prerelease: false
91
- version_requirements: *70155507577920
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: 2.11.0
92
127
  - !ruby/object:Gem::Dependency
93
128
  name: simplecov
94
- requirement: &70155507577460 !ruby/object:Gem::Requirement
129
+ requirement: !ruby/object:Gem::Requirement
95
130
  none: false
96
131
  requirements:
97
132
  - - ~>
@@ -99,7 +134,12 @@ dependencies:
99
134
  version: 0.6.4
100
135
  type: :development
101
136
  prerelease: false
102
- version_requirements: *70155507577460
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ~>
141
+ - !ruby/object:Gem::Version
142
+ version: 0.6.4
103
143
  description: Formats JSON
104
144
  email:
105
145
  - ben@freeagent.com
@@ -119,10 +159,14 @@ files:
119
159
  - ki_format.gemspec
120
160
  - lib/ki_format.rb
121
161
  - lib/ki_format/command.rb
162
+ - lib/ki_format/json.rb
163
+ - lib/ki_format/object_set.rb
122
164
  - lib/ki_format/table_maker.rb
123
165
  - lib/ki_format/version.rb
124
166
  - spec/integration/commands_spec.rb
125
167
  - spec/spec_helper.rb
168
+ - spec/unit/json_spec.rb
169
+ - spec/unit/object_set_spec.rb
126
170
  - spec/unit/table_maker_spec.rb
127
171
  homepage: ''
128
172
  licenses: []
@@ -136,19 +180,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
180
  - - ! '>='
137
181
  - !ruby/object:Gem::Version
138
182
  version: '0'
183
+ segments:
184
+ - 0
185
+ hash: 3016356244557293053
139
186
  required_rubygems_version: !ruby/object:Gem::Requirement
140
187
  none: false
141
188
  requirements:
142
189
  - - ! '>='
143
190
  - !ruby/object:Gem::Version
144
191
  version: '0'
192
+ segments:
193
+ - 0
194
+ hash: 3016356244557293053
145
195
  requirements: []
146
196
  rubyforge_project:
147
- rubygems_version: 1.8.10
197
+ rubygems_version: 1.8.24
148
198
  signing_key:
149
199
  specification_version: 3
150
200
  summary: Formats JSON
151
201
  test_files:
152
202
  - spec/integration/commands_spec.rb
153
203
  - spec/spec_helper.rb
204
+ - spec/unit/json_spec.rb
205
+ - spec/unit/object_set_spec.rb
154
206
  - spec/unit/table_maker_spec.rb