csv2json 0.2.0 → 0.3.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4bd184909e84a50e1c7b8194c9745304cc9452b2
4
+ data.tar.gz: ae813c982d6423683b30966835e6f99cca001576
5
+ SHA512:
6
+ metadata.gz: aec64661bf440449ee161b6d1bb526cb5153e0749154a98507219881dc4b7e20bea9da9df5448590c9dfc714d54fec3ad895608aefa685d50188dacc00a06b7d
7
+ data.tar.gz: e06d877886ecefca9d22f3791ba959ad43cfe2b227243b46826cb51cc45ccbdf9101524a565dcd4349e0d1525a6e49828ea7da1b59ca05c2a03db39e7a878edf
data/README.md CHANGED
@@ -1,17 +1,16 @@
1
1
  # csv2json
2
2
 
3
- Clients were sending me XLS files, but my webs consume JSON. So I needed to convert them to JSON easily from command-line.
4
- Tried to google for solution and surprisingly enough nothing solid existed.
3
+ Clients were sending me XLS files but my webs consume JSONs. So I needed to convert them to JSON easily from command-line...
5
4
 
6
5
  ## Solution
7
6
 
8
7
  - export XLS as a CSV file (I use OpenOffice.org for this)
9
- - run `csv2json file.csv > file.json`
8
+ - run `csv2json file.csv > file.json` (or `json2csv file.json > file.csv`)
10
9
  - there is no step 3
11
10
 
12
11
  ### Sample
13
12
 
14
- note: make sure your XLS table has the first row with column names
13
+ note: make sure your XLS table has the first row with column names, or use the -H option to provide some
15
14
 
16
15
  This CSV file:
17
16
 
@@ -20,44 +19,62 @@ This CSV file:
20
19
  thumbnails/,images/,paris_02.jpg,262,350,paris_02.jpg,75,56
21
20
 
22
21
  gets turned into this JSON:
23
-
24
- [
25
- {
26
- "thumbwidth": 75,
27
- "imgsrc": "paris_01.jpg",
28
- "thumbsrc": "paris_01.jpg",
29
- "height": 262,
30
- "imgpath": "images/",
31
- "thumbheight": 56,
32
- "thumbpath": "thumbnails/",
33
- "width": 350
34
- },
35
- {
36
- "thumbwidth": 75,
37
- "imgsrc": "paris_02.jpg",
38
- "thumbsrc": "paris_02.jpg",
39
- "height": 350,
40
- "imgpath": "images/",
41
- "thumbheight": 56,
42
- "thumbpath": "thumbnails/",
43
- "width": 262
44
- }
45
- ]
22
+ ```json
23
+ [
24
+ {
25
+ "thumbwidth": 75,
26
+ "imgsrc": "paris_01.jpg",
27
+ "thumbsrc": "paris_01.jpg",
28
+ "height": 262,
29
+ "imgpath": "images/",
30
+ "thumbheight": 56,
31
+ "thumbpath": "thumbnails/",
32
+ "width": 350
33
+ },
34
+ {
35
+ "thumbwidth": 75,
36
+ "imgsrc": "paris_02.jpg",
37
+ "thumbsrc": "paris_02.jpg",
38
+ "height": 350,
39
+ "imgpath": "images/",
40
+ "thumbheight": 56,
41
+ "thumbpath": "thumbnails/",
42
+ "width": 262
43
+ }
44
+ ]
45
+ ```
46
46
 
47
47
  ### Installation
48
48
 
49
- `sudo gem install csv2json --source http://rubygems.org`
49
+ `sudo gem install csv2json`
50
50
 
51
51
  ### Usage
52
52
 
53
- Usage: csv2json [INPUT] [OPTIONS]
53
+ Usage: csv2json [INPUT] [OPTIONS]
54
+
55
+ Specific options:
56
+ -s, --separator SEP Set separator character surrounded by single quotes (default is ',')
57
+ -o, --output FILE Write output to a file
58
+ -p, --pretty Pretty-format JSON output
59
+ -k, --skip-headers-from-file Ignore the headers (first line) in the file; use with --headers to set your own
60
+ -H, --headers HEADERS Supply list of headers, where no headers exist in the file, or where you're using -k to ignore them
61
+ -h, --help Show this message
62
+ -v, --version Show version
63
+
64
+ We also provide `json2csv`, which converts in the opposite direction.
65
+
66
+ Usage: json2csv [INPUT] [OPTIONS]
54
67
 
55
68
  Specific options:
56
69
  -s, --separator SEP Set separator character surrounded by single quotes (default is ',')
57
70
  -o, --output FILE Write output to a file
71
+ -H, --headers HEADERS Supply sorted list of headers, by which to order the columns in the CSV. These must match the key names in the JSON.
58
72
  -h, --help Show this message
59
73
  -v, --version Show version
60
74
 
75
+
76
+ Note: JSON field order is explicitly unsorted, so if you want predictable field order for CSV output, use the -H option.
77
+
61
78
  ### Alternative usage
62
79
 
63
80
  common usage is `csv2json file.csv > file.json`
@@ -91,16 +108,4 @@ or in-memory
91
108
 
92
109
  ## Authors
93
110
 
94
- * **Antonin Hildebrand** ([http://binaryage.com](http://binaryage.com))
95
- * **Rafael Souza** ([http://github.com/rafaels](http://github.com/rafaels))
96
-
97
- ---
98
-
99
- ## Want to contribute?
100
-
101
- * Fork the project.
102
- * Make your feature addition or bug fix.
103
- * Add tests for it. This is important so I don't break it in a future version unintentionally.
104
- * Commit, do not mess with rakefile, version, or history.
105
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
106
- * Send me a pull request. Bonus points for topic branches.
111
+ [https://github.com/darwin/csv2json/graphs/contributors](https://github.com/darwin/csv2json/graphs/contributors)
data/Rakefile CHANGED
@@ -13,7 +13,6 @@ begin
13
13
  gem.homepage = "http://github.com/darwin/csv2json"
14
14
  gem.authors = ["Antonin Hildebrand", "Rafael Souza"]
15
15
  gem.add_dependency "json"
16
- gem.add_dependency "fastercsv"
17
16
  gem.add_development_dependency "shoulda", ">= 0"
18
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
18
  end
@@ -46,7 +45,7 @@ task :test => :check_dependencies
46
45
 
47
46
  task :default => :test
48
47
 
49
- require 'rake/rdoctask'
48
+ require 'rdoc/task'
50
49
  Rake::RDocTask.new do |rdoc|
51
50
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
52
51
 
@@ -6,7 +6,7 @@ require 'ostruct'
6
6
  require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'csv2json.rb') # this form is important for local development
7
7
 
8
8
  module CSV2JSONRunner
9
-
9
+
10
10
  # command-line parsing
11
11
  COMMAND = File.basename($0)
12
12
  USAGE = "Usage: #{COMMAND} [INPUT] [OPTIONS]"
@@ -14,6 +14,9 @@ module CSV2JSONRunner
14
14
  options = OpenStruct.new
15
15
  options.output = "-"
16
16
  options.separator = ","
17
+ options.pretty = false
18
+ options.headers = nil
19
+ options.skipFirstRow = false
17
20
 
18
21
  opts = OptionParser.new do |o|
19
22
  o.banner = USAGE
@@ -28,6 +31,22 @@ module CSV2JSONRunner
28
31
  options.output = fn
29
32
  end
30
33
 
34
+ o.on("-p", "--pretty", "Pretty-format JSON output") do
35
+ options.pretty = true
36
+ end
37
+
38
+ o.on("-k", "--skip-headers-from-file", "Ignore the headers (first line) in the file; use with --headers to set your own") do |headers|
39
+ if headers then
40
+ options.skipFirstRow = true
41
+ end
42
+ end
43
+
44
+ o.on("-H", "--headers HEADERS", "Supply list of headers, where no headers exist in the file, or where you're using -k to ignore them") do |headers|
45
+ if headers then
46
+ options.headers = headers.split(",")
47
+ end
48
+ end
49
+
31
50
  o.on_tail("-h", "--help", "Show this message") do
32
51
  puts o
33
52
  exit
@@ -42,7 +61,7 @@ module CSV2JSONRunner
42
61
  begin
43
62
  opts.parse!(ARGV)
44
63
  rescue
45
- die "Unable to parse options: #{$!}"
64
+ raise "Unable to parse options: #{$!}"
46
65
  end
47
66
 
48
67
  # initialize output handle
@@ -55,11 +74,11 @@ module CSV2JSONRunner
55
74
  if ARGV.size > 0
56
75
  IN = File.open(ARGV[0], "r")
57
76
  else
58
- IN = StringIO.new($stdin.read) # cannot be just $stdin.clone because FasterCSV is seeking in file :-(
77
+ IN = StringIO.new($stdin.read) # cannot be just $stdin.clone because CSV is seeking in file :-(
59
78
  end
60
79
 
61
80
  # run the command
62
- CSV2JSON.parse(IN, OUT, nil, :col_sep => options.separator)
81
+ CSV2JSON.parse(IN, OUT, options.headers, {:col_sep => options.separator}, {:pretty => options.pretty, :skipFirstRow => options.skipFirstRow})
63
82
 
64
83
  # leave in peace
65
84
  OUT.flush
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require 'optparse'
5
+ require 'ostruct'
6
+ require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'json2csv.rb') # this form is important for local development
7
+
8
+ module JSON2CSVRunner
9
+
10
+ # command-line parsing
11
+ COMMAND = File.basename($0)
12
+ USAGE = "Usage: #{COMMAND} [INPUT] [OPTIONS]"
13
+
14
+ options = OpenStruct.new
15
+ options.output = "-"
16
+ options.separator = ","
17
+ options.headers = nil
18
+
19
+ opts = OptionParser.new do |o|
20
+ o.banner = USAGE
21
+ o.separator ""
22
+ o.separator "Specific options:"
23
+
24
+ o.on("-s", "--separator SEP", "Set separator character surrounded by single quotes (default is ',')") do |sep|
25
+ options.separator = sep
26
+ end
27
+
28
+ o.on("-o", "--output FILE", "Write output to a file") do |fn|
29
+ options.output = fn
30
+ end
31
+
32
+ o.on("-H", "--headers HEADERS", "Supply sorted list of headers, by which to order the columns in the CSV. These must match the key names in the JSON.") do |headers|
33
+ if headers then
34
+ options.headers = headers.split(",")
35
+ end
36
+ end
37
+
38
+ o.on_tail("-h", "--help", "Show this message") do
39
+ puts o
40
+ exit
41
+ end
42
+
43
+ o.on_tail("-v", "--version", "Show version") do
44
+ puts CSV2JSON::VERSION
45
+ exit
46
+ end
47
+ end
48
+
49
+ begin
50
+ opts.parse!(ARGV)
51
+ rescue
52
+ raise "Unable to parse options: #{$!}"
53
+ end
54
+
55
+ # initialize output handle
56
+ if options.output == "-"
57
+ OUT = $stdout.clone
58
+ else
59
+ OUT = File.open(options.output, "w")
60
+ end
61
+
62
+ if ARGV.size > 0
63
+ IN = File.read(ARGV[0])
64
+ else
65
+ IN = STDIN.read
66
+ end
67
+
68
+ # run the command
69
+ JSON2CSV.parse(IN, OUT, options.headers, {:col_sep => options.separator})
70
+
71
+ # leave in peace
72
+ OUT.flush
73
+ end
@@ -1,74 +1,71 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: csv2json 0.3.0 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
- s.name = %q{csv2json}
8
- s.version = "0.2.0"
8
+ s.name = "csv2json"
9
+ s.version = "0.3.0"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
12
  s.authors = ["Antonin Hildebrand", "Rafael Souza"]
12
- s.date = %q{2010-03-14}
13
- s.default_executable = %q{csv2json}
14
- s.description = %q{handy for converting xls files to json}
15
- s.email = %q{antonin@hildebrand.cz}
16
- s.executables = ["csv2json"]
13
+ s.date = "2014-03-19"
14
+ s.description = "handy for converting xls files to json"
15
+ s.email = "antonin@hildebrand.cz"
16
+ s.executables = ["csv2json", "json2csv"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
- "README.md"
19
+ "README.md"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
- ".gitignore",
24
- "LICENSE",
25
- "README.md",
26
- "Rakefile",
27
- "bin/csv2json",
28
- "csv2json.gemspec",
29
- "lib/csv2json-version.rb",
30
- "lib/csv2json.rb",
31
- "test/fixtures/addresses.json",
32
- "test/fixtures/addresses_comma.csv",
33
- "test/fixtures/addresses_pipe.csv",
34
- "test/fixtures/addresses_semicolon.csv",
35
- "test/fixtures/photos.json",
36
- "test/fixtures/photos_comma.csv",
37
- "test/fixtures/photos_pipe.csv",
38
- "test/fixtures/photos_semicolon.csv",
39
- "test/fixtures/population.json",
40
- "test/fixtures/population_comma.csv",
41
- "test/fixtures/population_pipe.csv",
42
- "test/fixtures/population_semicolon.csv",
43
- "test/helper.rb",
44
- "test/test_csv2json.rb"
45
- ]
46
- s.homepage = %q{http://github.com/darwin/csv2json}
47
- s.rdoc_options = ["--charset=UTF-8"]
48
- s.require_paths = ["lib"]
49
- s.rubygems_version = %q{1.3.6}
50
- s.summary = %q{.csv to .json converter}
51
- s.test_files = [
23
+ "LICENSE",
24
+ "README.md",
25
+ "Rakefile",
26
+ "bin/csv2json",
27
+ "bin/json2csv",
28
+ "csv2json.gemspec",
29
+ "lib/csv2json-version.rb",
30
+ "lib/csv2json.rb",
31
+ "lib/json2csv.rb",
32
+ "test/fixtures/addresses.json",
33
+ "test/fixtures/addresses_comma.csv",
34
+ "test/fixtures/addresses_pipe.csv",
35
+ "test/fixtures/addresses_semicolon.csv",
36
+ "test/fixtures/photos.json",
37
+ "test/fixtures/photos_comma.csv",
38
+ "test/fixtures/photos_pipe.csv",
39
+ "test/fixtures/photos_semicolon.csv",
40
+ "test/fixtures/population.json",
41
+ "test/fixtures/population_comma.csv",
42
+ "test/fixtures/population_pipe.csv",
43
+ "test/fixtures/population_semicolon.csv",
52
44
  "test/helper.rb",
53
- "test/test_csv2json.rb"
45
+ "test/json2csv-fixtures/photos.json",
46
+ "test/json2csv-fixtures/photos_comma.csv",
47
+ "test/json2csv-fixtures/photos_pipe.csv",
48
+ "test/json2csv-fixtures/photos_semicolon.csv",
49
+ "test/test_csv2json.rb",
50
+ "test/test_json2csv.rb"
54
51
  ]
52
+ s.homepage = "http://github.com/darwin/csv2json"
53
+ s.require_paths = ["lib"]
54
+ s.rubygems_version = "2.1.11"
55
+ s.summary = ".csv to .json converter"
55
56
 
56
57
  if s.respond_to? :specification_version then
57
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
- s.specification_version = 3
58
+ s.specification_version = 4
59
59
 
60
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
61
  s.add_runtime_dependency(%q<json>, [">= 0"])
62
- s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
63
62
  s.add_development_dependency(%q<shoulda>, [">= 0"])
64
63
  else
65
64
  s.add_dependency(%q<json>, [">= 0"])
66
- s.add_dependency(%q<fastercsv>, [">= 0"])
67
65
  s.add_dependency(%q<shoulda>, [">= 0"])
68
66
  end
69
67
  else
70
68
  s.add_dependency(%q<json>, [">= 0"])
71
- s.add_dependency(%q<fastercsv>, [">= 0"])
72
69
  s.add_dependency(%q<shoulda>, [">= 0"])
73
70
  end
74
71
  end
@@ -1,3 +1,3 @@
1
1
  module CSV2JSON
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,6 +1,8 @@
1
- require 'fastercsv'
1
+ require 'rubygems'
2
+ require 'csv'
2
3
  require 'json'
3
- require 'csv2json-version.rb'
4
+ require 'orderedhash'
5
+ require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'csv2json-version.rb')
4
6
 
5
7
  module CSV2JSON
6
8
 
@@ -11,23 +13,33 @@ module CSV2JSON
11
13
  end
12
14
 
13
15
  # input and output are file objects, you can use StringIO if you want to work in memory
14
- def parse(input, output, headers=nil, options={})
16
+ def parse(input, output, headers=nil, csvOptions={}, gemOptions={})
15
17
  result = Array.new
16
18
 
17
- FasterCSV.new(input, options).each do |row|
19
+ CSV.new(input, csvOptions).each do |row|
18
20
  # treat first row as headers if the caller didn't provide them
19
21
  unless headers
20
22
  headers = row
21
23
  next
22
24
  end
25
+
26
+ if gemOptions[:skipFirstRow] then
27
+ gemOptions[:skipFirstRow] = false
28
+ next
29
+ end
23
30
 
24
31
  # build JSON snippet and append it to the result
25
- snippet = Hash.new
32
+ snippet = OrderedHash.new
26
33
  headers.each_index { |i| snippet[headers[i]] = self.convert(row[i]) }
27
34
  result << snippet
28
35
  end
29
36
 
30
- output << JSON.pretty_generate(result)
37
+ if gemOptions[:pretty] == true then
38
+ output << JSON.pretty_generate(result)
39
+ else
40
+ output << JSON.generate(result)
41
+ end
42
+
31
43
  end
32
44
 
33
45
  module_function :parse
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'csv'
3
+ require 'json'
4
+ require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'csv2json-version.rb')
5
+
6
+ module JSON2CSV
7
+
8
+ def parse(input, output, headers=nil, csvOptions=nil)
9
+ json = JSON.parse(input)
10
+
11
+ unless headers
12
+ headers = json[0].keys
13
+ end
14
+
15
+ outputCSV = CSV.generate(csvOptions) do |csv|
16
+ csv << headers
17
+
18
+ json.each do |obj|
19
+ sortedValues = Array.new(headers.length)
20
+
21
+ obj.each do |key, val|
22
+ headers.each_index { |i|
23
+ sortedValues[i] = val if headers[i] == key
24
+ }
25
+ end
26
+
27
+ csv << sortedValues
28
+ end
29
+ end
30
+
31
+ output << outputCSV
32
+ end
33
+
34
+ module_function :parse
35
+
36
+ end
@@ -5,6 +5,7 @@ require 'shoulda'
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
7
  require 'csv2json'
8
+ require 'json2csv'
8
9
 
9
10
  class Test::Unit::TestCase
10
11
  end
@@ -0,0 +1,122 @@
1
+ [
2
+ {
3
+ "thumbwidth": 75,
4
+ "imgsrc": "paris_01.jpg",
5
+ "thumbsrc": "paris_01.jpg",
6
+ "height": 262,
7
+ "imgpath": "images/",
8
+ "thumbheight": 56,
9
+ "thumbpath": "thumbnails/",
10
+ "width": 350
11
+ },
12
+ {
13
+ "thumbwidth": 75,
14
+ "imgsrc": "paris_02.jpg",
15
+ "thumbsrc": "paris_02.jpg",
16
+ "height": 350,
17
+ "imgpath": "images/",
18
+ "thumbheight": 56,
19
+ "thumbpath": "thumbnails/",
20
+ "width": 262
21
+ },
22
+ {
23
+ "thumbwidth": 75,
24
+ "imgsrc": "paris_03.jpg",
25
+ "thumbsrc": "paris_03.jpg",
26
+ "height": 262,
27
+ "imgpath": "images/",
28
+ "thumbheight": 56,
29
+ "thumbpath": "thumbnails/",
30
+ "width": 350
31
+ },
32
+ {
33
+ "thumbwidth": 56,
34
+ "imgsrc": "paris_04.jpg",
35
+ "thumbsrc": "paris_04.jpg",
36
+ "height": 350,
37
+ "imgpath": "images/",
38
+ "thumbheight": 75,
39
+ "thumbpath": "thumbnails/",
40
+ "width": 262
41
+ },
42
+ {
43
+ "thumbwidth": 56,
44
+ "imgsrc": "paris_05.jpg",
45
+ "thumbsrc": "paris_05.jpg",
46
+ "height": 350,
47
+ "imgpath": "images/",
48
+ "thumbheight": 75,
49
+ "thumbpath": "thumbnails/",
50
+ "width": 262
51
+ },
52
+ {
53
+ "thumbwidth": 75,
54
+ "imgsrc": "paris_06.jpg",
55
+ "thumbsrc": "paris_06.jpg",
56
+ "height": 262,
57
+ "imgpath": "images/",
58
+ "thumbheight": 56,
59
+ "thumbpath": "thumbnails/",
60
+ "width": 350
61
+ },
62
+ {
63
+ "thumbwidth": 56,
64
+ "imgsrc": "paris_07.jpg",
65
+ "thumbsrc": "paris_07.jpg",
66
+ "height": 350,
67
+ "imgpath": "images/",
68
+ "thumbheight": 75,
69
+ "thumbpath": "thumbnails/",
70
+ "width": 262
71
+ },
72
+ {
73
+ "thumbwidth": 56,
74
+ "imgsrc": "paris_08.jpg",
75
+ "thumbsrc": "paris_08.jpg",
76
+ "height": 350,
77
+ "imgpath": "images/",
78
+ "thumbheight": 75,
79
+ "thumbpath": "thumbnails/",
80
+ "width": 262
81
+ },
82
+ {
83
+ "thumbwidth": 56,
84
+ "imgsrc": "paris_09.jpg",
85
+ "thumbsrc": "paris_09.jpg",
86
+ "height": 350,
87
+ "imgpath": "images/",
88
+ "thumbheight": 75,
89
+ "thumbpath": "thumbnails/",
90
+ "width": 262
91
+ },
92
+ {
93
+ "thumbwidth": 75,
94
+ "imgsrc": "paris_10.jpg",
95
+ "thumbsrc": "paris_10.jpg",
96
+ "height": 262,
97
+ "imgpath": "images/",
98
+ "thumbheight": 56,
99
+ "thumbpath": "thumbnails/",
100
+ "width": 350
101
+ },
102
+ {
103
+ "thumbwidth": 75,
104
+ "imgsrc": "paris_11.jpg",
105
+ "thumbsrc": "paris_11.jpg",
106
+ "height": 262,
107
+ "imgpath": "images/",
108
+ "thumbheight": 56,
109
+ "thumbpath": "thumbnails/",
110
+ "width": 350
111
+ },
112
+ {
113
+ "thumbwidth": 75,
114
+ "imgsrc": "paris_12.jpg",
115
+ "thumbsrc": "paris_12.jpg",
116
+ "height": 262,
117
+ "imgpath": "images/",
118
+ "thumbheight": 56,
119
+ "thumbpath": "thumbnails/",
120
+ "width": 350
121
+ }
122
+ ]
@@ -0,0 +1,13 @@
1
+ thumbpath,imgpath,imgsrc,width,height,thumbsrc,thumbwidth,thumbheight
2
+ thumbnails/,images/,paris_01.jpg,350,262,paris_01.jpg,75,56
3
+ thumbnails/,images/,paris_02.jpg,262,350,paris_02.jpg,75,56
4
+ thumbnails/,images/,paris_03.jpg,350,262,paris_03.jpg,75,56
5
+ thumbnails/,images/,paris_04.jpg,262,350,paris_04.jpg,56,75
6
+ thumbnails/,images/,paris_05.jpg,262,350,paris_05.jpg,56,75
7
+ thumbnails/,images/,paris_06.jpg,350,262,paris_06.jpg,75,56
8
+ thumbnails/,images/,paris_07.jpg,262,350,paris_07.jpg,56,75
9
+ thumbnails/,images/,paris_08.jpg,262,350,paris_08.jpg,56,75
10
+ thumbnails/,images/,paris_09.jpg,262,350,paris_09.jpg,56,75
11
+ thumbnails/,images/,paris_10.jpg,350,262,paris_10.jpg,75,56
12
+ thumbnails/,images/,paris_11.jpg,350,262,paris_11.jpg,75,56
13
+ thumbnails/,images/,paris_12.jpg,350,262,paris_12.jpg,75,56
@@ -0,0 +1,13 @@
1
+ thumbpath|imgpath|imgsrc|width|height|thumbsrc|thumbwidth|thumbheight
2
+ thumbnails/|images/|paris_01.jpg|350|262|paris_01.jpg|75|56
3
+ thumbnails/|images/|paris_02.jpg|262|350|paris_02.jpg|75|56
4
+ thumbnails/|images/|paris_03.jpg|350|262|paris_03.jpg|75|56
5
+ thumbnails/|images/|paris_04.jpg|262|350|paris_04.jpg|56|75
6
+ thumbnails/|images/|paris_05.jpg|262|350|paris_05.jpg|56|75
7
+ thumbnails/|images/|paris_06.jpg|350|262|paris_06.jpg|75|56
8
+ thumbnails/|images/|paris_07.jpg|262|350|paris_07.jpg|56|75
9
+ thumbnails/|images/|paris_08.jpg|262|350|paris_08.jpg|56|75
10
+ thumbnails/|images/|paris_09.jpg|262|350|paris_09.jpg|56|75
11
+ thumbnails/|images/|paris_10.jpg|350|262|paris_10.jpg|75|56
12
+ thumbnails/|images/|paris_11.jpg|350|262|paris_11.jpg|75|56
13
+ thumbnails/|images/|paris_12.jpg|350|262|paris_12.jpg|75|56
@@ -0,0 +1,13 @@
1
+ thumbpath;imgpath;imgsrc;width;height;thumbsrc;thumbwidth;thumbheight
2
+ thumbnails/;images/;paris_01.jpg;350;262;paris_01.jpg;75;56
3
+ thumbnails/;images/;paris_02.jpg;262;350;paris_02.jpg;75;56
4
+ thumbnails/;images/;paris_03.jpg;350;262;paris_03.jpg;75;56
5
+ thumbnails/;images/;paris_04.jpg;262;350;paris_04.jpg;56;75
6
+ thumbnails/;images/;paris_05.jpg;262;350;paris_05.jpg;56;75
7
+ thumbnails/;images/;paris_06.jpg;350;262;paris_06.jpg;75;56
8
+ thumbnails/;images/;paris_07.jpg;262;350;paris_07.jpg;56;75
9
+ thumbnails/;images/;paris_08.jpg;262;350;paris_08.jpg;56;75
10
+ thumbnails/;images/;paris_09.jpg;262;350;paris_09.jpg;56;75
11
+ thumbnails/;images/;paris_10.jpg;350;262;paris_10.jpg;75;56
12
+ thumbnails/;images/;paris_11.jpg;350;262;paris_11.jpg;75;56
13
+ thumbnails/;images/;paris_12.jpg;350;262;paris_12.jpg;75;56
@@ -1,20 +1,25 @@
1
1
  require 'helper'
2
- require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'csv2json.rb') # this form is important for local development
3
2
 
4
3
  class TestCsv2json < Test::Unit::TestCase
5
4
  SEPS = {:comma => ',', :pipe => '|', :semicolon => ';'}
5
+
6
6
  should "parse some test files" do
7
7
  fixtures_dir = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
8
+
8
9
  Dir.chdir(fixtures_dir) do
9
10
  Dir.glob('*.csv') do |filename|
10
11
  filename_parts = File.basename(filename, ".csv").split('_')
11
12
  json_template = filename_parts[0] + '.json'
13
+
14
+ print "Testing csv2json against #{filename}\n"
15
+
12
16
  File.open(filename, "r") do |input|
13
17
  output = StringIO.new()
14
- CSV2JSON.parse(input, output, nil, :col_sep => SEPS[filename_parts[1].to_sym] )
18
+ CSV2JSON.parse(input, output, nil, {:col_sep => SEPS[filename_parts[1].to_sym]}, {:pretty => true} )
15
19
  template = File.read(json_template)
20
+
16
21
  output.pos = 0
17
- assert template == output.read
22
+ assert JSON.parse(template) == JSON.parse(output.read), "Content doesn't match"
18
23
  end
19
24
  end
20
25
  end
@@ -0,0 +1,32 @@
1
+ require 'helper'
2
+
3
+ class TestJson2Csv < Test::Unit::TestCase
4
+ SEPS = {:comma => ',', :pipe => '|', :semicolon => ';'}
5
+
6
+ should "parse some test files" do
7
+ fixtures_dir = File.expand_path(File.join(File.dirname(__FILE__), 'json2csv-fixtures'))
8
+
9
+ Dir.chdir(fixtures_dir) do
10
+ Dir.glob('*.json') do |filename|
11
+ basename = File.basename(filename, ".json")
12
+
13
+ print "Testing json2csv against #{filename}\n"
14
+
15
+ SEPS.each do |key, val|
16
+ template = "#{basename}_#{key.to_sym}.csv"
17
+ print " ... for comparison with #{template} "
18
+ headers = ['thumbpath','imgpath','imgsrc','width','height','thumbsrc','thumbwidth','thumbheight']
19
+
20
+ input = File.read(filename)
21
+ output = StringIO.new()
22
+ JSON2CSV.parse(input, output, headers, {:col_sep => val} )
23
+
24
+ output.pos = 0
25
+ fileToCompareTo = File.read(template)
26
+ assert_equal output.read.strip, fileToCompareTo.strip
27
+ print "OK\n"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -1,78 +1,64 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: csv2json
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 2
8
- - 0
9
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Antonin Hildebrand
13
8
  - Rafael Souza
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-03-14 00:00:00 +01:00
19
- default_executable: csv2json
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2014-03-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: json
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
31
21
  type: :runtime
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: fastercsv
35
22
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 0
42
- version: "0"
43
- type: :runtime
44
- version_requirements: *id002
45
- - !ruby/object:Gem::Dependency
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
46
29
  name: shoulda
47
- prerelease: false
48
- requirement: &id003 !ruby/object:Gem::Requirement
49
- requirements:
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- segments:
53
- - 0
54
- version: "0"
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
55
35
  type: :development
56
- version_requirements: *id003
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
57
42
  description: handy for converting xls files to json
58
43
  email: antonin@hildebrand.cz
59
- executables:
44
+ executables:
60
45
  - csv2json
46
+ - json2csv
61
47
  extensions: []
62
-
63
- extra_rdoc_files:
48
+ extra_rdoc_files:
64
49
  - LICENSE
65
50
  - README.md
66
- files:
51
+ files:
67
52
  - .document
68
- - .gitignore
69
53
  - LICENSE
70
54
  - README.md
71
55
  - Rakefile
72
56
  - bin/csv2json
57
+ - bin/json2csv
73
58
  - csv2json.gemspec
74
59
  - lib/csv2json-version.rb
75
60
  - lib/csv2json.rb
61
+ - lib/json2csv.rb
76
62
  - test/fixtures/addresses.json
77
63
  - test/fixtures/addresses_comma.csv
78
64
  - test/fixtures/addresses_pipe.csv
@@ -86,37 +72,33 @@ files:
86
72
  - test/fixtures/population_pipe.csv
87
73
  - test/fixtures/population_semicolon.csv
88
74
  - test/helper.rb
75
+ - test/json2csv-fixtures/photos.json
76
+ - test/json2csv-fixtures/photos_comma.csv
77
+ - test/json2csv-fixtures/photos_pipe.csv
78
+ - test/json2csv-fixtures/photos_semicolon.csv
89
79
  - test/test_csv2json.rb
90
- has_rdoc: true
80
+ - test/test_json2csv.rb
91
81
  homepage: http://github.com/darwin/csv2json
92
82
  licenses: []
93
-
83
+ metadata: {}
94
84
  post_install_message:
95
- rdoc_options:
96
- - --charset=UTF-8
97
- require_paths:
85
+ rdoc_options: []
86
+ require_paths:
98
87
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- segments:
104
- - 0
105
- version: "0"
106
- required_rubygems_version: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- segments:
111
- - 0
112
- version: "0"
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
113
98
  requirements: []
114
-
115
99
  rubyforge_project:
116
- rubygems_version: 1.3.6
100
+ rubygems_version: 2.1.11
117
101
  signing_key:
118
- specification_version: 3
102
+ specification_version: 4
119
103
  summary: .csv to .json converter
120
- test_files:
121
- - test/helper.rb
122
- - test/test_csv2json.rb
104
+ test_files: []
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC