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.
data/README.md CHANGED
@@ -1,8 +1,35 @@
1
-
2
1
  # ss2json
3
2
 
3
+ **ss2json** is a collection of tools to help in the conversion of spreadsheet to json.
4
+
5
+ * [ss2json-vertical](#ss2json-vertical) Generate an array of rows. Each row is going to be a hash.
6
+ * [ss2json-vertical-hash](#ss2json-vertical-hash) Generate a hash of elements. Each element is a hash that represents a column. The key of that hash is a column.
7
+ * [ss2json-horizontal](#ss2json-horizontal) Generate a hash from a key value pairs. The keys are in one column and the values in other.
8
+ * [merge-jsons](#merge-jsons) Generate a hash that have the filename as a key, and the content as a value.
9
+ * [order-json](#order-jsons) Order the keys of the hashes of a json file.
10
+ * [compress-json](#compress-json) Compress the given json. The lasts commands output in pretty format (human readable). You can pipe through this command to compress.
11
+ * [catss](#catss) Shows on the terminal the content of the sheet
12
+
13
+ ## Tools
14
+
15
+ ### ss2json-vertical
16
+
17
+ Lets start with this command to show the basic feature of ss2json.
18
+ Suppose we have this sheet:
19
+
20
+ | A | B | C | D | E | F | G | H | I |
21
+ 1 | id | name | childs.1.name | childs.1.age | childs.2.name | Childs.2.age | address.street | address.post_code | i.notes |
22
+ 2 | 1 | Guillermo | | | | | Calle de Eros 7 | 28018 | nice guy |
23
+ 3 | 2 | Epi | Carlos | | | | Castellana | 28020 | |
24
+ 4 | 3 | Esther | Roberto | 3 | Carlos | 4 | | | |
25
+ 5 | 4 | | | | | | | | left note |
26
+
27
+ What we see here is that the column names (row 1) have a special encoding.
28
+
29
+ ### ss2json-hash
30
+
31
+ ### ss2json-horizontal
4
32
 
5
- **ss2json** is a SpreadSheet To Json converter. It follow a few rules for generating nested hash.
6
33
 
7
34
  ## Tutorial
8
35
 
data/Rakefile CHANGED
@@ -1,8 +1,16 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rubygems'
3
+ require 'bundler/setup'
2
4
 
3
5
 
4
6
 
5
- desc "test"
6
- task :test do
7
- sh "ruby -I lib -rubygems test/*_test.rb"
8
- end
7
+ # desc "test"
8
+ # task :test do
9
+ # sh "ruby -I lib -rubygems test/**/*_test.rb"
10
+ # end
11
+
12
+ # require 'rake/testtask'
13
+ #
14
+ # Rake::TestTask.new do |t|
15
+ # t.pattern = "test/**/*_test.rb"
16
+ # end
data/balance.xlsx ADDED
Binary file
data/bin/ss2json CHANGED
@@ -1,7 +1,42 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'roo'
4
- require 'ss2json'
3
+ if ARGV[0] && !(ARGV[0] =~ /^-/)
4
+ begin
5
+ require "ss2json-commands/#{ARGV[0]}"
6
+ kommand = SS2JSON::Command.const_get(ARGV[0].gsub(/^.|_./){|a| a[-1].chr.upcase})
7
+ $0="#{$0} #{ARGV[0]}"
8
+ $stderr.puts "ss2json: '#{ARGV[0]}' is not a ss2json command. See 'ss2json --help'. (#{e.message})"
9
+ exit -1
10
+ end
11
+ else
5
12
 
13
+ require 'ss2json/command'
14
+ require 'optparse'
6
15
 
7
- puts Ss2Json::Cli.start
16
+ available_commands = []
17
+ SS2JSON::Command.load_all
18
+ SS2JSON::Command.commands.each do |command|
19
+ available_commands << [command.name, command.description]
20
+ end
21
+
22
+ opts = OptionParser.new do |opts|
23
+ opts.banner = "Usage: #{$0} ACTION [options]"
24
+
25
+ opts.separator ""
26
+ opts.separator "Where ACTION could be:"
27
+ available_commands.each do |cmd|
28
+ opts.separator "\t%-10s%s" % cmd
29
+ end
30
+ opts.separator ""
31
+
32
+ opts.on("-h", "--help", "Show this help") do
33
+ puts opts
34
+ end
35
+ end
36
+
37
+ ARGV[0] = "--help" if ARGV.size == 0
38
+ opts.parse!(ARGV)
39
+
40
+
41
+
42
+ end
@@ -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 Cat < SS2JSON::Command
12
+
13
+ def self.name
14
+ "cat"
15
+ end
16
+
17
+ def self.description
18
+ "Shows a nice console friendly table of the sheet"
19
+ end
20
+
21
+ def initialize(options)
22
+ options = Options.new(options).options
23
+ converter = SS2JSON::Converter.new(options)
24
+ puts ::Terminal::Table.new :rows => converter.to_a
25
+ end
26
+
27
+ class Options < ::OptionParser
28
+ attr_reader :options
29
+ DEFAULT_OPTIONS = {
30
+ :sheet => nil,
31
+ :file => nil,
32
+ }
33
+
34
+ def initialize(args)
35
+ @options = DEFAULT_OPTIONS
36
+ @help = nil
37
+ super() do |opts|
38
+ @help = opts
39
+
40
+ opts.banner = "Usage: #{$0} FILENAME [sheet]"
41
+
42
+ opts.separator "\n"
43
+
44
+ opts.on_tail("-h","--help", "Show this help") do
45
+ puts opts
46
+ exit 0
47
+ end
48
+
49
+ opts.on_tail("--version", "Show the version") do
50
+ require 'ss2json/version'
51
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
52
+ exit 0
53
+ end
54
+ end.parse!(args)
55
+
56
+ if file = args.shift
57
+ @options[:file] = file
58
+ @options[:sheet] = args.shift
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,67 @@
1
+ require 'ss2json/command'
2
+ require 'optparse'
3
+
4
+ class Compress < SS2JSON::Command
5
+
6
+ def self.name
7
+ "compress"
8
+ end
9
+
10
+ def self.description
11
+ "Uglify a json file (DO NOT RESPECT ORDER)"
12
+ end
13
+
14
+ def initialize(options)
15
+ options = Options.new(options).options
16
+ puts JSON.parse(options[:file].read).to_json
17
+ ensure
18
+ options[:file].close if options[:file]
19
+ end
20
+
21
+ class Options < ::OptionParser
22
+ attr_reader :options
23
+ DEFAULT_OPTIONS = {
24
+ :sheet => nil,
25
+ :file => nil,
26
+ }
27
+
28
+ def initialize(args)
29
+ @options = DEFAULT_OPTIONS
30
+ opts = super() do |opts|
31
+ @help = opts
32
+
33
+ opts.banner = "Usage: #{$0} [FILENAME]"
34
+
35
+ opts.separator "\n"
36
+
37
+ opts.on_tail("-h","--help", "Show this help") do
38
+ puts opts
39
+ exit 0
40
+ end
41
+
42
+ opts.on_tail("--version", "Show the version") do
43
+ require 'ss2json/version'
44
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
45
+ exit 0
46
+ end
47
+
48
+ end
49
+ opts.parse!(args)
50
+
51
+ if args.size > 1
52
+ file = args.first
53
+ File.file?(file) or die("File #{file} not found")
54
+ @options[:file] = File.open(file)
55
+ else
56
+ @options[:file] = $stdin
57
+ end
58
+ end
59
+
60
+ def die(msg)
61
+ $stderr.puts msg
62
+ $stderr.puts @help
63
+ exit -1
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,132 @@
1
+
2
+
3
+ require 'ss2json/command'
4
+ require 'ss2json/converter'
5
+ require 'optparse'
6
+ require 'json'
7
+
8
+ class Constants < SS2JSON::Command
9
+
10
+ def self.name
11
+ "constants"
12
+ end
13
+
14
+ def self.description
15
+ "Convert a spreadsheet to a json hash where the keys are in one column and the values are in another column"
16
+ end
17
+
18
+ def initialize(options)
19
+ options = Options.new(options).options
20
+ output = Converter.new(options).process
21
+ puts JSON.pretty_generate(output)
22
+ end
23
+
24
+ class Options < OptionParser
25
+ attr_reader :options
26
+ DEFAULT_OPTIONS = {
27
+ :first_row => 1,
28
+ :sheet => nil,
29
+ :file => nil,
30
+ :key_column => 1,
31
+ :value_column => 2,
32
+ :converter => {
33
+ :show_null => false,
34
+ :dont_convert => false,
35
+ :ignored_values => [],
36
+ :downcase_first_letter => true
37
+ }
38
+
39
+ }
40
+
41
+ def initialize(args)
42
+ @options = DEFAULT_OPTIONS
43
+ @help = nil
44
+ super() do |opts|
45
+ @help = opts
46
+
47
+ opts.banner = "Usage: #{$0} FILENAME [options]"
48
+
49
+ opts.on("-s", "--sheet SHEET_NAME", "Use other that the first table") do |sheet|
50
+ @options[:sheet] = sheet
51
+ end
52
+
53
+ opts.on("-r", "--first-row ROW_NUMBER", "Set the first row") do |row|
54
+ die("Can't understand the row #{row}. Use a number") unless row =~ /\A\d*\z/
55
+ @options[:first_row] = row.to_i
56
+ end
57
+
58
+
59
+ opts.on("-k", "--key-column COLUMN_NUMBER", "Column where the keys are (Default to 1)") do |column|
60
+ die("Can't understand the column #{column}. Use a number") unless column =~ /\A\d*\z/
61
+ @options[:key_column] = column.to_i
62
+ end
63
+
64
+ opts.on("-a", "--value-column COLUMN_NUMBER", "Column where the values are (Default to 2)") do |column|
65
+ die("Can't understand the column #{column}. Use a number") unless column =~ /\A\d*\z/
66
+ @options[:value_column] = column.to_i
67
+ end
68
+
69
+ opts.separator "\nData options:"
70
+
71
+ opts.on("-i", "--ignore-value VALUE", "Ignore the fields with that value. Could be use several times") do |t|
72
+ @options[:converter][:ignored_values] << t
73
+ end
74
+
75
+ opts.on("-b", "--include-blank", "Generate a json with the values included in the ignore list") do |t|
76
+ @options[:converter][:show_null] = true
77
+ end
78
+
79
+ opts.on("-d", "--disable-conversion", "Disable the conversion from floats to integers") do
80
+ @options[:converter][:dont_convert] = true
81
+ end
82
+
83
+ opts.on("-l", "--disable-first-letter", "Will disable the downcase of the first letter of the key") do
84
+ @options[:converter][:downcase_first_letter] = false
85
+ end
86
+
87
+
88
+ opts.separator "\n"
89
+
90
+ opts.on_tail("-h","--help", "Show this help") do
91
+ puts opts
92
+ exit 0
93
+ end
94
+
95
+ opts.on_tail("--version", "Show the version") do
96
+ puts "#{File.basename($0)} Version: #{SS2JSON::VERSION}"
97
+ exit 0
98
+ end
99
+
100
+ end.parse!(args)
101
+
102
+ if args.size == 1
103
+ @options[:file] = args.first
104
+ unless File.file?(@options[:file])
105
+ $stderr.puts "File #{@options.file} not found"
106
+ exit -5
107
+ end
108
+ else
109
+ die("Incorrect number of parameters")
110
+ end
111
+ end
112
+
113
+ def die(msg)
114
+ $stderr.puts msg
115
+ $stderr.puts @help
116
+ exit -1
117
+ end
118
+ end
119
+
120
+ class Converter < SS2JSON::Converter
121
+ def process
122
+ hash = {}
123
+ each_row do |row|
124
+ key = @doc.cell(row, @options[:key_column])
125
+ value = @doc.cell(row, @options[:value_column])
126
+ hash[key] = value
127
+ end
128
+ @content = SS2JSON::RowConverter.new(hash, @options[:converter])
129
+ @content
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,72 @@
1
+
2
+
3
+
4
+
5
+ require 'ss2json/command'
6
+ require 'optparse'
7
+
8
+ class Humanize < SS2JSON::Command
9
+
10
+ def self.name
11
+ "humanize"
12
+ end
13
+
14
+ def self.description
15
+ "Pretty print and sort (keys) on json"
16
+ end
17
+
18
+ def initialize(options)
19
+ options = Options.new(options).options
20
+ if options[:file]
21
+ exec "python -mjson.tool < '#{options[:file]}'"
22
+ else
23
+ exec "python -mjson.tool"
24
+ end
25
+ end
26
+
27
+ class Options < ::OptionParser
28
+ attr_reader :options
29
+ DEFAULT_OPTIONS = {
30
+ :sheet => nil,
31
+ :file => nil,
32
+ }
33
+
34
+ def initialize(args)
35
+ @options = DEFAULT_OPTIONS
36
+ opts = super() do |opts|
37
+ @help = opts
38
+
39
+ opts.banner = "Usage: #{$0} [FILENAME]"
40
+
41
+ opts.separator "\n"
42
+ opts.separator "\tThis tool use python -mjson.tool So you need python to be installed\n"
43
+
44
+ opts.on_tail("-h","--help", "Show this help") do
45
+ puts opts
46
+ exit 0
47
+ end
48
+
49
+ opts.on_tail("--version", "Show the version") do
50
+ require 'ss2json/version'
51
+ puts "#{$0} Version: #{SS2JSON::VERSION}"
52
+ exit 0
53
+ end
54
+
55
+ end
56
+ opts.parse!(args)
57
+
58
+ if args.size > 1
59
+ file = args.first
60
+ File.file?(file) or die("File #{file} not found")
61
+ @options[:file] = file
62
+ end
63
+ end
64
+
65
+ def die(msg)
66
+ $stderr.puts msg
67
+ $stderr.puts @help
68
+ exit -1
69
+ end
70
+ end
71
+
72
+ end