ki_format 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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