ss2json 0.3.2 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+
2
+
3
+
4
+
5
+ require 'ss2json/command'
6
+ require 'ss2json/converter'
7
+ require 'optparse'
8
+ require 'terminal-table'
9
+ require 'json'
10
+
11
+ class Ls < SS2JSON::Command
12
+
13
+ def self.name
14
+ "ls"
15
+ end
16
+
17
+ def self.description
18
+ "List SpreadSheet. List the sheets included in the spreadsheet."
19
+ end
20
+
21
+ def initialize(options)
22
+ options = Options.new(options).options
23
+ converter = SS2JSON::Converter.new(options)
24
+ converter = SS2JSON::Converter.new(options)
25
+ puts converter.sheets.join("\n")
26
+ end
27
+
28
+ class Options < ::OptionParser
29
+ attr_reader :options
30
+ DEFAULT_OPTIONS = {
31
+ :sheet => nil,
32
+ :file => nil,
33
+ }
34
+
35
+ def initialize(args)
36
+ @options = DEFAULT_OPTIONS
37
+ @help = nil
38
+ super() do |opts|
39
+ @help = opts
40
+
41
+ opts.banner = "Usage: #{$0} FILENAME"
42
+
43
+ opts.separator "\n"
44
+
45
+ opts.on_tail("-h","--help", "Show this help") do
46
+ puts opts
47
+ exit 0
48
+ end
49
+
50
+ opts.on_tail("--version", "Show the version") do
51
+ require 'ss2json/version'
52
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
53
+ exit 0
54
+ end
55
+ end.parse!(args)
56
+
57
+ if file = args.shift
58
+ @options[:file] = file
59
+ else
60
+ die("Incorrect number of parameters")
61
+ end
62
+ end
63
+
64
+ def die(msg)
65
+ $stderr.puts msg
66
+ $stderr.puts @help
67
+ exit -1
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,87 @@
1
+ require 'ss2json/command'
2
+ require 'optparse'
3
+ require 'json'
4
+
5
+ class Merge < SS2JSON::Command
6
+
7
+ def self.name
8
+ "merge"
9
+ end
10
+
11
+ def self.description
12
+ "Merge a list of json in a single file"
13
+ end
14
+
15
+ def initialize(options)
16
+ options = Options.new(options).options
17
+ global_hash = {}
18
+ options[:files].each do |file|
19
+ begin
20
+ json = JSON.parse(File.read(file))
21
+ rescue => e
22
+ die "Could not read the file #{file}"
23
+ exit -1
24
+ end
25
+ key = File.basename(file).split(".").first
26
+ global_hash[key] = json
27
+ end
28
+ output = options[:compress] ? JSON.dump(global_hash) : JSON.pretty_generate(global_hash)
29
+ puts output
30
+ end
31
+
32
+ class Options < ::OptionParser
33
+ attr_reader :options
34
+ DEFAULT_OPTIONS = { }
35
+
36
+ def initialize(args)
37
+ @options = DEFAULT_OPTIONS
38
+ opts = super() do |opts|
39
+ @help = opts
40
+
41
+ opts.banner = "Usage: #{$0} filename1 [filename2] [filename3]... "
42
+
43
+ opts.separator "\n"
44
+ # \nmerge_jsons will receive several files as an arguments and will generate
45
+ # and write to the stdout the a json hash with the name of the filename
46
+ # (without the extension) as a key, and the content of the file as a value
47
+ # for each file passed.
48
+
49
+ opts.on_tail("-h","--help", "Show this help") do
50
+ puts opts
51
+ exit 0
52
+ end
53
+
54
+ opts.on("-c","--compress", "Output a compressed json") do
55
+ @options[:compress] = true
56
+ end
57
+
58
+ opts.on_tail("--version", "Show the version") do
59
+ require 'ss2json/version'
60
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
61
+ exit 0
62
+ end
63
+
64
+ end
65
+ opts.parse!(args)
66
+
67
+ if args.size < 1
68
+ die "You should provide a list of files"
69
+ end
70
+
71
+ @options[:files] = args
72
+
73
+ @options[:files].each do |f|
74
+ File.file?(f) or die("File #{f} not found")
75
+ end
76
+
77
+
78
+ end
79
+
80
+ def die(msg)
81
+ $stderr.puts msg
82
+ $stderr.puts @help
83
+ exit -1
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,128 @@
1
+
2
+ require 'ss2json/command'
3
+ require 'ss2json/converter'
4
+ require 'optparse'
5
+ require 'json'
6
+
7
+ class ToArray < SS2JSON::Command
8
+
9
+ def self.name
10
+ "to_array"
11
+ end
12
+
13
+ def self.description
14
+ "Convert a spreadsheet to a json array, respecting the order in wich the rows are."
15
+ end
16
+
17
+ def initialize(options)
18
+ options = Options.new(options).options
19
+ output = Converter.new(options).process
20
+ puts JSON.pretty_generate(output)
21
+ end
22
+
23
+ class Options < OptionParser
24
+ attr_reader :options
25
+ DEFAULT_OPTIONS = {
26
+ :title_row => 1,
27
+ :first_row => 2,
28
+ :sheet => nil,
29
+ :file => nil,
30
+ :check_column => nil,
31
+ :key_column => 1,
32
+ :value_column => 2,
33
+ :converter => {
34
+ :show_null => false,
35
+ :dont_convert => false,
36
+ :ignored_values => [],
37
+ :downcase_first_letter => true
38
+ }
39
+
40
+ }
41
+
42
+ def initialize(args)
43
+ @options = DEFAULT_OPTIONS
44
+ @help = nil
45
+ super() do |opts|
46
+ @help = opts
47
+
48
+ opts.banner = "Usage: #{$0} FILENAME [options]"
49
+
50
+ opts.on("-s", "--sheet SHEET_NAME", "Use other that the first table") do |sheet|
51
+ @options[:sheet] = sheet
52
+ end
53
+
54
+ opts.on("-t", "--title-row ROW_NUMBER", "Row in wich the titles are. Default: #{DEFAULT_OPTIONS[:title_row]}") do |row|
55
+ die("Can't understand the row #{row}. Use a number") unless row =~ /\A\d*\z/
56
+ @options[:title_row] = row.to_i
57
+ end
58
+
59
+ opts.on("-r", "--first-row ROW_NUMBER", "Set the first row") do |row|
60
+ die("Can't understand the row #{row}. Use a number") unless row =~ /\A\d*\z/
61
+ @options[:first_row] = row.to_i
62
+ end
63
+
64
+ opts.on("-c", "--check-column NAME", "Only output objects wich his property NAME is not in IGNORED VALUES") do |t|
65
+ @options[:check_column] = t
66
+ end
67
+
68
+ opts.separator "\nData options:"
69
+
70
+ opts.on("-i", "--ignore-value VALUE", "Ignore the fields with that value. Could be use several times") do |t|
71
+ @options[:converter][:ignored_values] << t
72
+ end
73
+
74
+ opts.on("-b", "--include-blank", "Generate a json with the values included in the ignore list") do |t|
75
+ @options[:converter][:show_null] = true
76
+ end
77
+
78
+ opts.on("-d", "--disable-conversion", "Disable the conversion from floats to integers") do
79
+ @options[:converter][:dont_convert] = true
80
+ end
81
+
82
+ opts.on("-l", "--disable-first-letter", "Will disable the downcase of the first letter of the key") do
83
+ @options[:converter][:downcase_first_letter] = false
84
+ end
85
+
86
+ opts.separator "\n"
87
+
88
+ opts.on_tail("-h","--help", "Show this help") do
89
+ puts opts
90
+ exit 0
91
+ end
92
+
93
+ opts.on_tail("--version", "Show the version") do
94
+ puts "#{File.basename($0)} Version: #{SS2JSON::VERSION}"
95
+ exit 0
96
+ end
97
+
98
+ end.parse!(args)
99
+
100
+ if (args.size == 1)
101
+ @options[:file] = args.first
102
+ unless File.file?(@options[:file])
103
+ $stderr.puts "File #{@options.file} not found"
104
+ exit -5
105
+ end
106
+ else
107
+ die("Incorrect number of parameters")
108
+ end
109
+ end
110
+
111
+ def die(msg)
112
+ $stderr.puts msg
113
+ $stderr.puts @help
114
+ exit -1
115
+ end
116
+ end
117
+
118
+ class Converter < SS2JSON::Converter
119
+ def process
120
+ @options[:first_row] += 1
121
+ @content = []
122
+ each_hash_row do |hash|
123
+ @content << hash
124
+ end
125
+ @content
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,137 @@
1
+
2
+ require 'ss2json/command'
3
+ require 'ss2json/converter'
4
+ require 'optparse'
5
+ require 'json'
6
+
7
+ class ToHash < SS2JSON::Command
8
+
9
+ def self.name
10
+ "to_hash"
11
+ end
12
+
13
+ def self.description
14
+ "Convert a spreadsheet to a json hash usign one column as a key"
15
+ end
16
+
17
+ def initialize(options)
18
+ options = Options.new(options).options
19
+ output = Converter.new(options).process
20
+ puts JSON.pretty_generate(output)
21
+ end
22
+
23
+ class Options < ::OptionParser
24
+ attr_reader :options
25
+ DEFAULT_OPTIONS = {
26
+ :title_row => 1,
27
+ :first_row => 2,
28
+ :sheet => nil,
29
+ :file => nil,
30
+ :key_column => 1,
31
+ :value_column => 2,
32
+ :header_line => 1,
33
+ :converter => {
34
+ :show_null => false,
35
+ :dont_convert => false,
36
+ :ignored_values => [],
37
+ :ignored_keys => [],
38
+ :downcase_first_letter => true
39
+ }
40
+ }
41
+
42
+ def initialize(args)
43
+ @options = DEFAULT_OPTIONS
44
+ @help = nil
45
+ super() do |opts|
46
+ @help = opts
47
+
48
+ opts.banner = "Usage: #{$0} FILENAME KEY [options]"
49
+
50
+ opts.on("-s", "--sheet SHEET_NAME", "Use other that the first table") do |sheet|
51
+ @options[:sheet] = sheet
52
+ end
53
+
54
+ opts.on("-t", "--title-row ROW_NUMBER", "Row in wich the titles are. Default: #{DEFAULT_OPTIONS[:title_row]}") do |row|
55
+ die("Can't understand the row #{row}. Use a number") unless row =~ /\A\d*\z/
56
+ @options[:title_row] = row.to_i
57
+ end
58
+
59
+ opts.on("-r", "--first-row ROW_NUMBER", "Set the first row of real data. Default: #{DEFAULT_OPTIONS[:first_row]}") do |row|
60
+ die("Can't understand the row #{row}. Use a number") unless row =~ /\A\d*\z/
61
+ @options[:first_row] = row.to_i
62
+ end
63
+
64
+ opts.on("-n", "--dont-remove-key", "When using a column in the excel as a key for the hash, that column is removed. This option avoid that behaviour") do
65
+ @options[:dont_remove_key] = true
66
+ end
67
+
68
+ opts.separator "\nData options:"
69
+
70
+ opts.on("-i", "--ignore-value VALUE", "Ignore the fields with that value. Could be use several times") do |t|
71
+ @options[:converter][:ignored_values] << t
72
+ end
73
+
74
+ # TODO
75
+ # opts.on("-i", "--ignore-key VALUE", "Ignore the fields with that key. Could be use several times") do |t|
76
+ # @options[:converter][:ignored_keys] << t
77
+ # end
78
+
79
+ opts.on("-b", "--include-blank", "Generate a json with the values included in the ignore list") do |t|
80
+ @options[:converter][:show_null] = true
81
+ end
82
+
83
+ opts.on("-d", "--disable-conversion", "Disable the conversion from floats to integers") do
84
+ @options[:converter][:dont_convert] = true
85
+ end
86
+
87
+ opts.on("-l", "--disable-first-letter", "Will disable the downcase of the first letter of the key") do
88
+ @options[:converter][:downcase_first_letter] = false
89
+ end
90
+
91
+ opts.separator "\n"
92
+
93
+ opts.on_tail("-h","--help", "Show this help") do
94
+ puts opts
95
+ exit 0
96
+ end
97
+
98
+ opts.on_tail("--version", "Show the version") do
99
+ require 'ss2json/version'
100
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
101
+ exit 0
102
+ end
103
+
104
+ end.parse!(args)
105
+
106
+ if args.size == 2
107
+ @options[:file] = args.first
108
+ unless File.file?(@options[:file])
109
+ $stderr.puts "File #{@options.file} not found"
110
+ exit -5
111
+ end
112
+ @options[:hash_key] = args.last
113
+ else
114
+ die("Incorrect number of parameters")
115
+ end
116
+ end
117
+
118
+ def die(msg)
119
+ $stderr.puts msg
120
+ $stderr.puts @help
121
+ exit -1
122
+ end
123
+ end
124
+
125
+ class Converter < SS2JSON::Converter
126
+ def process
127
+ @content = {}
128
+ each_hash_row do |hash|
129
+ if value = hash.get(@options[:hash_key])
130
+ hash.delete(@options[:hash_key]) unless @options[:dont_remove_key]
131
+ @content[value] = hash
132
+ end
133
+ end
134
+ @content
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,22 @@
1
+ module SS2JSON
2
+ class Command
3
+
4
+ @commands = []
5
+ def self.load_all
6
+ require 'rubygems' unless defined?(Gem)
7
+ Gem.find_files('ss2json-commands/*.rb').each do |file|
8
+ require(file)
9
+ end
10
+ @commands
11
+ end
12
+
13
+ def self.commands
14
+ @commands
15
+ end
16
+
17
+ def self.inherited(kclass)
18
+ @commands << kclass
19
+ end
20
+ end
21
+ end
22
+