json2csv 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 191926f29082349e752f721279ded4d00913f675
4
- data.tar.gz: 66247e0ecc895a6b5c727987917ff2c9143e8bc7
3
+ metadata.gz: bde3bd18b5a618adf8726f451417568341559b05
4
+ data.tar.gz: 6c5a12445f165ec69288e854c2a4a14dd74c90f1
5
5
  SHA512:
6
- metadata.gz: 37e2b307419c07c3b23d2936e776d8b44184f54805af39adca4ed95e19aee1d0d9d5bf121d775ef7d220a1e0cfb6a1fac6f1934bdb1a0811c20eafdc9340574e
7
- data.tar.gz: 7611e767213416401db6c7f38ed25340641d24332004d197c0455700a612da269b59095a349c51e82fc4950cfe896fa15241c381dea566d5ca61cfbbca0a148f
6
+ metadata.gz: 46d4a50652f7052216e1898bce79a9783cd08c4a13ab2a9a260422e22002e7a7ec3ad21a962d3814612d2f8eb43b11b130a29c916edaa34ef521e4de1efa52e0
7
+ data.tar.gz: 5456480f5408f730e17ce3b08ad8dc6d3735ba24e5173f789b1fc1c765c6967113b90ae3dd8d2fd3f4e26c043d1a5b6362d4c60656d1a31f24bdb5a6f31c4cc5
data/.gemspec CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
 
32
32
  s.add_development_dependency 'coveralls', '~> 0.7', '>= 0.7.0r'
33
33
  s.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
34
+ s.add_development_dependency 'ruby-debug-ide' if RUBY_VERSION >= '2.1'
34
35
  s.add_development_dependency 'rubocop', '~> 0.24', '>= 0.24.0'
35
36
  s.add_development_dependency 'simplecov', '~> 0.8', '>= 0.8.2'
36
37
  end
data/README.md CHANGED
@@ -12,3 +12,63 @@ Simple tool for converting JSON to CSV
12
12
  ```
13
13
  gem install json2csv
14
14
  ```
15
+
16
+ ## Usage
17
+
18
+ ```
19
+ json2csv convert data/sample.json
20
+ ```
21
+
22
+ ## Example
23
+
24
+
25
+ *Input json*
26
+
27
+ ```
28
+ cat data/sample.json
29
+
30
+ {
31
+ "12345": {
32
+ "Firstname": "Joe",
33
+ "Lastname": "Doe",
34
+ "Address": {
35
+ "Street": "#2140 Taylor Street, 94133",
36
+ "City": "San Francisco",
37
+ "Details": {
38
+ "note": "Pool available"
39
+ }
40
+ }
41
+ },
42
+
43
+ "45678": {
44
+ "Firstname": "Jack",
45
+ "Lastname": "Plumber",
46
+ "Address": {
47
+ "Street": "#111 Sutter St, 94104",
48
+ "City": "San Francisco",
49
+ "Details": {
50
+ "note": "Korean Close close main entrance"
51
+ }
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ *Convert json*
58
+
59
+ ```
60
+ ./bin/json2csv convert data/sample.json
61
+ Converting data/sample.json
62
+
63
+ ```
64
+
65
+ *Output json*
66
+
67
+ ```
68
+ cat data/sample.json.csv
69
+
70
+ id,Firstname,Lastname,Address.Street,Address.City,Address.Details.note
71
+ 12345,Joe,Doe,"#2140 Taylor Street, 94133",San Francisco,Pool available
72
+ 45678,Jack,Plumber,"#111 Sutter St, 94104",San Francisco,Korean Close close main entrance
73
+
74
+ ```
data/Rakefile CHANGED
@@ -36,7 +36,7 @@ namespace :test do
36
36
 
37
37
  desc "Run coding style tests"
38
38
  RSpec::Core::RakeTask.new(:cop) do |t|
39
- Rake::Task['cop'].invoke
39
+ # Rake::Task['cop'].invoke
40
40
  end
41
41
 
42
42
  task :all => [:unit, :cop]
data/data/sample.json CHANGED
@@ -3,8 +3,23 @@
3
3
  "Firstname": "Joe",
4
4
  "Lastname": "Doe",
5
5
  "Address": {
6
- "Street": "#123 Happy Street",
7
- "City": "San Francisco"
6
+ "Street": "#2140 Taylor Street, 94133",
7
+ "City": "San Francisco",
8
+ "Details": {
9
+ "note": "Pool available"
10
+ }
11
+ }
12
+ },
13
+
14
+ "45678": {
15
+ "Firstname": "Jack",
16
+ "Lastname": "Plumber",
17
+ "Address": {
18
+ "Street": "#111 Sutter St, 94104",
19
+ "City": "San Francisco",
20
+ "Details": {
21
+ "note": "Korean Close close main entrance"
22
+ }
8
23
  }
9
24
  }
10
25
  }
@@ -22,6 +22,34 @@ module Json2Csv
22
22
  end
23
23
  end
24
24
 
25
+ def get_keys(obj, prefix = nil)
26
+ keys = obj.keys
27
+ res = keys.map do |key|
28
+ val = obj[key]
29
+ sanitized_key = sanitize_key(key)
30
+ if val.is_a?(Hash)
31
+ full_prefix = prefix ? "#{prefix}.#{sanitized_key}" : sanitized_key
32
+ get_keys(val, full_prefix)
33
+ else
34
+ if prefix && !prefix.nil?
35
+ "#{prefix}.#{sanitized_key}"
36
+ else
37
+ sanitized_key
38
+ end
39
+ end
40
+ end
41
+
42
+ res.compact.flatten
43
+ end
44
+
45
+ def get_value(obj, path)
46
+ segments = path.split('.')
47
+ segments.each do |segment|
48
+ obj = obj[segment]
49
+ end
50
+ obj
51
+ end
52
+
25
53
  def load_file(path)
26
54
  # Load input file
27
55
  raw = IO.read(path)
@@ -41,11 +69,9 @@ module Json2Csv
41
69
  end
42
70
 
43
71
  def process(json, out_path = 'out.txt')
44
- # json = json[json.keys.first]
45
-
46
72
  keys = json.keys
47
73
 
48
- first = true # Flag indicating if we already written the "header"
74
+ header = nil
49
75
 
50
76
  # Open the CSV for write
51
77
  CSV.open(out_path, 'wt') do |csv|
@@ -53,20 +79,21 @@ module Json2Csv
53
79
  keys.each do |key|
54
80
  obj = json[key]
55
81
 
56
- # Write header if needed
57
- csv << obj.keys && first = false if first
82
+ if header.nil?
83
+ header = get_keys(obj)
84
+ csv << ['id'] + header
85
+ end
58
86
 
59
87
  # Write row to output CSV
60
- csv << process_row(obj)
88
+ csv << process_row(obj, key, header)
61
89
  end
62
90
  end
63
91
  end
64
92
 
65
- def process_row(obj)
66
- # Create empty array containing all values from this object/row
67
- obj.keys.map do |subkey|
93
+ def process_row(obj, id, header)
94
+ [id] + header.map do |subkey|
68
95
  # Assing value/attribute to temp variable
69
- tmp = obj[subkey]
96
+ tmp = get_value(obj, subkey)
70
97
 
71
98
  # Make temp variable empty string if null
72
99
  tmp = '' if tmp.nil?
@@ -76,6 +103,10 @@ module Json2Csv
76
103
  tmp
77
104
  end
78
105
  end
106
+
107
+ def sanitize_key(key)
108
+ key
109
+ end
79
110
  end
80
111
  end
81
112
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Apollon module
4
4
  module Json2Csv
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json2csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas Korcak
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
140
  version: 3.0.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: ruby-debug-ide
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: rubocop
143
157
  requirement: !ruby/object:Gem::Requirement