sepparator 0.0.1
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 +7 -0
- data/.gitignore +18 -0
- data/.guardrc +1 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +66 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +2 -0
- data/Rakefile +1 -0
- data/bin/sepp +5 -0
- data/lib/sepparator.rb +10 -0
- data/lib/sepparator/console.rb +50 -0
- data/lib/sepparator/schema_detector.rb +50 -0
- data/lib/sepparator/spreadsheet_converter.rb +28 -0
- data/sepparator.gemspec +29 -0
- data/spec/sepparator/example.csv +3 -0
- data/spec/sepparator/schema_detector_spec.rb +62 -0
- data/spec/sepparator/spreadsheet_converter.rb +39 -0
- data/spec/sepparator/spreadsheet_converter_spec.rb +38 -0
- data/spec/spec_helper.rb +20 -0
- metadata +184 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e9f7be8183b19d92ca4a0bbcb0f113702c9682c8
|
4
|
+
data.tar.gz: 226038e8750deb96d9d71294cbaafc1ccdd355b7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 165cd593157953ec6934819eb3d819f2af585074deec298773c94a32bd81bc9cd60899af84ba58c9b74a4ed4da316ea9c5667663c0c227d10459a3bd1097abb1
|
7
|
+
data.tar.gz: d8e7ee0c773fa5a10a6bbd683e6080ae66c96f60ae1d6bef8e270b162c97aa52cbea295c84c6452cacfd2d19f30c96d8a888a5e4ab98ce5804df07e2da12109a
|
data/.gitignore
ADDED
data/.guardrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Guard.options[:clear] = true
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sepparator (0.0.1)
|
5
|
+
simple_xlsx_writer
|
6
|
+
thor
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
coderay (1.0.9)
|
12
|
+
diff-lcs (1.2.4)
|
13
|
+
fast_xs (0.8.0)
|
14
|
+
ffi (1.9.0)
|
15
|
+
formatador (0.2.4)
|
16
|
+
guard (1.8.1)
|
17
|
+
formatador (>= 0.2.4)
|
18
|
+
listen (>= 1.0.0)
|
19
|
+
lumberjack (>= 1.0.2)
|
20
|
+
pry (>= 0.9.10)
|
21
|
+
thor (>= 0.14.6)
|
22
|
+
guard-rspec (3.0.2)
|
23
|
+
guard (>= 1.8)
|
24
|
+
rspec (~> 2.13)
|
25
|
+
listen (1.2.2)
|
26
|
+
rb-fsevent (>= 0.9.3)
|
27
|
+
rb-inotify (>= 0.9)
|
28
|
+
rb-kqueue (>= 0.2)
|
29
|
+
lumberjack (1.0.4)
|
30
|
+
method_source (0.8.1)
|
31
|
+
pry (0.9.12.2)
|
32
|
+
coderay (~> 1.0.5)
|
33
|
+
method_source (~> 0.8)
|
34
|
+
slop (~> 3.4)
|
35
|
+
rake (10.1.0)
|
36
|
+
rb-fsevent (0.9.3)
|
37
|
+
rb-inotify (0.9.0)
|
38
|
+
ffi (>= 0.5.0)
|
39
|
+
rb-kqueue (0.2.0)
|
40
|
+
ffi (>= 0.5.0)
|
41
|
+
rspec (2.13.0)
|
42
|
+
rspec-core (~> 2.13.0)
|
43
|
+
rspec-expectations (~> 2.13.0)
|
44
|
+
rspec-mocks (~> 2.13.0)
|
45
|
+
rspec-core (2.13.1)
|
46
|
+
rspec-expectations (2.13.0)
|
47
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
48
|
+
rspec-mocks (2.13.1)
|
49
|
+
rubyzip (0.9.9)
|
50
|
+
simple_xlsx_writer (0.5.3)
|
51
|
+
fast_xs (>= 0.7.3)
|
52
|
+
rubyzip (>= 0.9.4)
|
53
|
+
slop (3.4.5)
|
54
|
+
thor (0.18.1)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
ruby
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
bundler (~> 1.3)
|
61
|
+
guard
|
62
|
+
guard-rspec
|
63
|
+
pry
|
64
|
+
rake
|
65
|
+
rspec
|
66
|
+
sepparator!
|
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Andreas Brandl
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/sepp
ADDED
data/lib/sepparator.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Sepparator
|
4
|
+
class Console < Thor
|
5
|
+
|
6
|
+
option :col_sep, aliases: ['-s'], desc: 'CSV column separator, defaults to tab-separated values', banner: '\t'
|
7
|
+
option :force, type: :boolean, aliases: ['-f'], desc: 'overwrite existing files'
|
8
|
+
desc "convert CSV XLS", "converts a csv to a .xlsx Excel file"
|
9
|
+
long_desc <<-LONGDESC
|
10
|
+
`sepp convert` converts a CSV file to a xlsx file.
|
11
|
+
|
12
|
+
Parameters:\x5
|
13
|
+
|
14
|
+
CSV - path to a CSV file (required)
|
15
|
+
|
16
|
+
XLS - destination path for excel file (optional)\x5
|
17
|
+
Use --force to overwrite existing files.\x5
|
18
|
+
If XLS is ommited, sepp will create the excel file
|
19
|
+
alongside the csv using the .xlsx extension.
|
20
|
+
|
21
|
+
Options:
|
22
|
+
|
23
|
+
--col_sep - CSV column separation character(s)
|
24
|
+
|
25
|
+
--force - overwrite destination files if necessary
|
26
|
+
LONGDESC
|
27
|
+
def convert(csv_path, xls_path=nil)
|
28
|
+
xls_path ||= csv_path.gsub(/\.csv/, '.xlsx')
|
29
|
+
converter = SpreadsheetConverter.new(col_sep: options['col_sep'] || "\t")
|
30
|
+
|
31
|
+
File.unlink(xls_path) if File.exists?(xls_path) && options.include?('force')
|
32
|
+
|
33
|
+
if File.exists?(xls_path)
|
34
|
+
STDERR.puts "destination file exists, use --force to overwrite: #{xls_path}"
|
35
|
+
exit(1)
|
36
|
+
elsif (not File.exists?(csv_path))
|
37
|
+
STDERR.puts "csv file not found: #{csv_path}"
|
38
|
+
exit(2)
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
converter.convert(csv_path, xls_path)
|
43
|
+
rescue ArgumentError => e
|
44
|
+
STDERR.puts e.message
|
45
|
+
exit(3)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Sepparator
|
2
|
+
|
3
|
+
class SchemaDetector
|
4
|
+
|
5
|
+
def for_hash(hash)
|
6
|
+
schema = {}
|
7
|
+
hash.each_with_object(schema) do |(k,v),schema|
|
8
|
+
schema[k] = type_of_value(v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def for_array(array)
|
13
|
+
return {} if array.empty?
|
14
|
+
start_schema = for_hash(array.first)
|
15
|
+
schema = array.reduce(start_schema) do |schema, entry|
|
16
|
+
fit_schema entry, schema
|
17
|
+
end
|
18
|
+
schema.each do |key, type|
|
19
|
+
if type.nil?
|
20
|
+
# when all values were nil, set to Object
|
21
|
+
schema[key] = Object
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def fit_schema(entry, schema=nil)
|
28
|
+
entry_schema = for_hash entry
|
29
|
+
return entry_schema unless schema
|
30
|
+
raise ArgumentError, 'different key entries not (yet) supported' if entry_schema.keys != schema.keys
|
31
|
+
|
32
|
+
schema.each do |key, type|
|
33
|
+
if type == nil && entry_schema[key] != nil
|
34
|
+
schema[key] = entry_schema[key] # first not-nil value
|
35
|
+
elsif type != nil && entry_schema[key] == nil
|
36
|
+
# just ignore subsequent nil-values
|
37
|
+
elsif type != Object && type != entry_schema[key]
|
38
|
+
schema[key] = Object # differing types, generalize to Object
|
39
|
+
end
|
40
|
+
end
|
41
|
+
schema
|
42
|
+
end
|
43
|
+
|
44
|
+
def type_of_value(value)
|
45
|
+
(value.nil?) ? nil : value.class
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'simple_xlsx'
|
2
|
+
require 'csv'
|
3
|
+
|
4
|
+
module Sepparator
|
5
|
+
|
6
|
+
class SpreadsheetConverter
|
7
|
+
|
8
|
+
attr_reader :col_sep
|
9
|
+
|
10
|
+
def initialize(col_sep: ';')
|
11
|
+
@col_sep = col_sep
|
12
|
+
end
|
13
|
+
|
14
|
+
def convert(csv_path, xls_path, sheet_name: 'from CSV')
|
15
|
+
raise ArgumentError, "destination file exists: #{xls_path}" if File.exists?(xls_path)
|
16
|
+
raise ArgumentError, "file not found: #{csv_path}" unless File.exists?(csv_path)
|
17
|
+
SimpleXlsx::Serializer.new(xls_path) do |doc|
|
18
|
+
doc.add_sheet(sheet_name || 'from CSV') do |sheet|
|
19
|
+
CSV.foreach(csv_path, col_sep: col_sep, converters: [:numeric, :date_time, :date]) do |csv_row|
|
20
|
+
sheet.add_row(csv_row)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/sepparator.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "sepparator"
|
7
|
+
spec.version = '0.0.1'
|
8
|
+
spec.authors = ["Andreas Brandl"]
|
9
|
+
spec.email = ["github@andreas-brandl.de"]
|
10
|
+
spec.description = %q{tool for working with CSV files, it supports conversion to Excel files and import to databases.}
|
11
|
+
spec.summary = spec.description
|
12
|
+
spec.homepage = "https://github.com/afirel/sepparator"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency 'simple_xlsx_writer'
|
21
|
+
spec.add_dependency 'thor'
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency 'rspec'
|
26
|
+
spec.add_development_dependency 'pry'
|
27
|
+
spec.add_development_dependency 'guard'
|
28
|
+
spec.add_development_dependency 'guard-rspec'
|
29
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Sepparator::SchemaDetector do
|
4
|
+
let(:hash) {
|
5
|
+
{
|
6
|
+
integer: 1,
|
7
|
+
float: 0.1,
|
8
|
+
string: 'foobar',
|
9
|
+
date: Date.today,
|
10
|
+
timestamp: DateTime.now
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
let(:expected_schema) {
|
15
|
+
Hash[hash.keys.zip(hash.values.map { |v| v.class })]
|
16
|
+
}
|
17
|
+
|
18
|
+
context '#for_hash' do
|
19
|
+
it 'detects a schema given a hash' do
|
20
|
+
schema = subject.for_hash(hash)
|
21
|
+
expect(schema).to eq(expected_schema)
|
22
|
+
end
|
23
|
+
it 'ignores nil values' do
|
24
|
+
schema = subject.for_hash(hash.merge({nilvalue: nil}))
|
25
|
+
expect(schema[:nilvalue]).to be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context '#for_array' do
|
30
|
+
it 'detects a schema given an array of hashes' do
|
31
|
+
input = 10.times.map { |_| hash }
|
32
|
+
schema = subject.for_array(input)
|
33
|
+
expect(schema).to eq(expected_schema)
|
34
|
+
end
|
35
|
+
it 'detects Object type when different types present' do
|
36
|
+
differing_type_hash = hash.merge({integer: 'not-an-int'})
|
37
|
+
input = 10.times.map { |_| hash } + [differing_type_hash]
|
38
|
+
schema = subject.for_array(input)
|
39
|
+
expect(schema[:integer]).to eq(Object)
|
40
|
+
end
|
41
|
+
it 'raises when different key entries are given' do
|
42
|
+
different_keys = hash.dup.merge({extra: 'extra-column'})
|
43
|
+
different_keys.delete(:integer) # remove one column
|
44
|
+
input = 10.times.map { |_| hash } + [different_keys]
|
45
|
+
expect {subject.for_array(input)}.to raise_error(ArgumentError, "different key entries not (yet) supported")
|
46
|
+
end
|
47
|
+
it 'ignores nil values' do
|
48
|
+
input = [hash.dup.merge({date: nil})] + 10.times.map { |_| hash } + [hash.dup.merge({integer: nil})]
|
49
|
+
schema = subject.for_array(input)
|
50
|
+
expect(schema).to eq(expected_schema)
|
51
|
+
end
|
52
|
+
it 'set type to Object when all values are nil for one key' do
|
53
|
+
input = [hash.merge({allnil: nil})]
|
54
|
+
schema = subject.for_array input
|
55
|
+
expect(schema[:allnil]).to eq(Object)
|
56
|
+
end
|
57
|
+
it 'returns empty hash when given empty array' do
|
58
|
+
expect(subject.for_array([])).to eq({})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sepparator/spreadsheet_converter'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Sepparator
|
7
|
+
describe SpreadsheetConverter do
|
8
|
+
|
9
|
+
it 'remembers the column separator' do
|
10
|
+
sep = 'foobar'
|
11
|
+
expect(described_class.new(col_sep: sep).col_sep).to eq(sep)
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#convert' do
|
15
|
+
let(:xls_path) { Tempfile.new('convert-to-xlsx').path }
|
16
|
+
let(:csv_path) { File.join(__dir__, 'example.csv')}
|
17
|
+
subject { described_class.new.convert(csv_path, xls_path)}
|
18
|
+
|
19
|
+
before do
|
20
|
+
FileUtils.rm_f xls_path
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'converts a CSV file' do
|
24
|
+
# don't comparing xlsx files here
|
25
|
+
subject
|
26
|
+
expect(File.exists?(xls_path)).to be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raises when the source file was not found' do
|
30
|
+
expect{described_class.new.convert('/some/non/existing/file.csv', xls_path)}.to raise_error(ArgumentError, /file not found/)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'raises when the destination file already exists' do
|
34
|
+
expect{described_class.new.convert('/some/non/existing/file.csv', Tempfile.new('blafoo').path)}.to raise_error(ArgumentError, /destination file exists/)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sepparator/spreadsheet_converter'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
describe Sepparator::SpreadsheetConverter do
|
7
|
+
|
8
|
+
it 'remembers the column separator' do
|
9
|
+
sep = 'foobar'
|
10
|
+
expect(described_class.new(col_sep: sep).col_sep).to eq(sep)
|
11
|
+
end
|
12
|
+
|
13
|
+
context '#convert' do
|
14
|
+
#let(:xls_path) { Tempfile.new('convert-to-xlsx')}
|
15
|
+
let(:xls_path) { '/tmp/example.xlsx' }
|
16
|
+
let(:csv_path) { File.join(__dir__, 'example.csv')}
|
17
|
+
subject { described_class.new.convert(csv_path, xls_path)}
|
18
|
+
|
19
|
+
before do
|
20
|
+
FileUtils.rm_f xls_path
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'converts a CSV file' do
|
24
|
+
# don't comparing xlsx files here
|
25
|
+
subject
|
26
|
+
expect(File.exists?(xls_path)).to be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raises when the source file was not found' do
|
30
|
+
expect{described_class.new.convert('/some/non/existing/file.csv', xls_path)}.to raise_error(ArgumentError, /file not found/)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'raises when the destination file already exists' do
|
34
|
+
expect{described_class.new.convert('/some/non/existing/file.csv', Tempfile.new('blafoo').path)}.to raise_error(ArgumentError, /destination file exists/)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift File.join(__dir__, '..', 'lib')
|
2
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
3
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
4
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
5
|
+
# loaded once.
|
6
|
+
#
|
7
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
+
config.run_all_when_everything_filtered = true
|
11
|
+
config.filter_run :focus
|
12
|
+
|
13
|
+
# Run specs in random order to surface order dependencies. If you find an
|
14
|
+
# order dependency and want to debug it, you can fix the order by providing
|
15
|
+
# the seed, which is printed after each run.
|
16
|
+
# --seed 1234
|
17
|
+
config.order = 'random'
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'sepparator'
|
metadata
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sepparator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andreas Brandl
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: simple_xlsx_writer
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: tool for working with CSV files, it supports conversion to Excel files
|
126
|
+
and import to databases.
|
127
|
+
email:
|
128
|
+
- github@andreas-brandl.de
|
129
|
+
executables:
|
130
|
+
- sepp
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- .gitignore
|
135
|
+
- .guardrc
|
136
|
+
- .rspec
|
137
|
+
- Gemfile
|
138
|
+
- Gemfile.lock
|
139
|
+
- Guardfile
|
140
|
+
- LICENSE.txt
|
141
|
+
- README.md
|
142
|
+
- Rakefile
|
143
|
+
- bin/sepp
|
144
|
+
- lib/sepparator.rb
|
145
|
+
- lib/sepparator/console.rb
|
146
|
+
- lib/sepparator/schema_detector.rb
|
147
|
+
- lib/sepparator/spreadsheet_converter.rb
|
148
|
+
- sepparator.gemspec
|
149
|
+
- spec/sepparator/example.csv
|
150
|
+
- spec/sepparator/schema_detector_spec.rb
|
151
|
+
- spec/sepparator/spreadsheet_converter.rb
|
152
|
+
- spec/sepparator/spreadsheet_converter_spec.rb
|
153
|
+
- spec/spec_helper.rb
|
154
|
+
homepage: https://github.com/afirel/sepparator
|
155
|
+
licenses:
|
156
|
+
- MIT
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - '>='
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project:
|
174
|
+
rubygems_version: 2.0.3
|
175
|
+
signing_key:
|
176
|
+
specification_version: 4
|
177
|
+
summary: tool for working with CSV files, it supports conversion to Excel files and
|
178
|
+
import to databases.
|
179
|
+
test_files:
|
180
|
+
- spec/sepparator/example.csv
|
181
|
+
- spec/sepparator/schema_detector_spec.rb
|
182
|
+
- spec/sepparator/spreadsheet_converter.rb
|
183
|
+
- spec/sepparator/spreadsheet_converter_spec.rb
|
184
|
+
- spec/spec_helper.rb
|