csv2schema 0.1.0 → 0.1.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 +8 -8
- data/.travis.yml +6 -0
- data/CHANGELOG.md +9 -0
- data/README.md +26 -0
- data/csv2schema.gemspec +3 -0
- data/exe/csv2schema +51 -0
- data/lib/csv2schema.rb +1 -0
- data/lib/csv2schema/csv.rb +1 -1
- data/lib/csv2schema/format_builder.rb +84 -0
- data/lib/csv2schema/schema.rb +8 -1
- data/lib/csv2schema/version.rb +1 -1
- metadata +48 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTRjMDQyMjU2NmY1YTYzOTc4MGMzMjkxMjE4MDk3MjUyYjQzMThmZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OWMwYjAyNzUwMDAwNjRmZjNhZTAxNDMwMjgyMjhmNjVlZGU2ZWQ5ZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Y2VlOWMzZGM1OWQyYjA3YzdhMzM5MDBmNjcwNmZkZjFmNzk0MTFhZDhmNzll
|
10
|
+
ZTdjYmE3ZTQ4NDBhNDkzMDFkYjY1NzgyYTgwNWE2NjgwM2YxN2NmYzM1MTM5
|
11
|
+
MTg0MjM5OTcxMTk3OTg1MTdhZTFjYjVjNzNkYjU3NWI5ZmZiZWY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzA3MzRhYjY0ODJkOTRmMWZjOTQ5NzhkYjY3NTA5NzFmNzVjOWIyYWJjOThi
|
14
|
+
ZDcxMmQ3MWExOGE4ZmM1YzQyMWUxYTBiYWExYTMzOTVmOWMxYmZlOGMzNDZi
|
15
|
+
OGY0ZWUyN2ViZGVkZDllZDk1NzRjZGM5YWJkZTg4NWFmYjM1Zjc=
|
data/.travis.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
---
|
1
2
|
language: ruby
|
2
3
|
rvm:
|
3
4
|
- 2.3.1
|
@@ -10,3 +11,8 @@ deploy:
|
|
10
11
|
on:
|
11
12
|
tags: true
|
12
13
|
repo: theodi/csv2schema
|
14
|
+
env:
|
15
|
+
global:
|
16
|
+
secure: jNfyOFHHWsNoOnpZeeB64rfpgBy1qn4h7pltuSwvW5LwuHBaQQU2d2vqi7ypqN7AfCvxU2ZGOmiGlhX7TjsIFhqs0LBpUuzde7xgMMrHuDr7fp3aNfKXjljdg0ltUsXjcgyoPMsaWJt9KqhIY3YFGcz+PeOFGmUVLDHUNjM2nyDIlmPxn5iCt/UzSOXWW3iHdjwfJyiUNLvRP+AxCfL0bR7d0LleitAk75ITcsKgbasekg51uFC/wvdZnPB88Er3Sr4y2/YXQDjQuyCj+cOZitNgHjFQ3lRz7CBHko5uA7NcQeFxLmV3oaOTmbwDGiI9fHjzWXDkWAc2jnf98B1UizFJDkGpftXBRrtoFqf6huIegJf+0bP4zKoEOfINHm50QGVLmbXDqN0Oc3WNJo/ULXm80W28yf7cuQBHSJ8ze+3Bllg8NHQwlCws2teHappkOG842Nzzx9qNs/ATleiHtvIo6iUtv5QXHkqD7OET6ubJVyGWw5guCRo/tpsFV1djEc3O9Dpc2aQs2hhz0gMvHVrb1V1mGGKwC37KEJCzRuPJypkTvSsylTLezq4eQ24E/jMpVMi97vceXbXpj+mxL1aaOwtDoN5QR6MCvC3w7dvODEG/mJ5wDtEhPp35zK3iwI26g/gxWrW9iy9cLz2jqBPY1EZJDOPvlD4OyB+XNSc=
|
17
|
+
after_success:
|
18
|
+
- bundle exec henry deploy
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [0.1.0](https://github.com/theodi/csv2schema/tree/0.1.0) (2016-09-02)
|
4
|
+
[Full Changelog](https://github.com/theodi/csv2schema/compare/0.0.1...0.1.0)
|
5
|
+
|
6
|
+
## [0.0.1](https://github.com/theodi/csv2schema/tree/0.0.1) (2016-09-02)
|
7
|
+
|
8
|
+
|
9
|
+
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/README.md
CHANGED
@@ -26,6 +26,32 @@ Or install it yourself as:
|
|
26
26
|
|
27
27
|
## Usage
|
28
28
|
|
29
|
+
You can either use the gem on the command line, or in your own Ruby code
|
30
|
+
|
31
|
+
### On the command line
|
32
|
+
|
33
|
+
After installing the gem, you can generate a schema file on the command line like so:
|
34
|
+
|
35
|
+
```
|
36
|
+
csv2schema generate myfile.csv
|
37
|
+
```
|
38
|
+
|
39
|
+
This will generate a JSON table schema file at `schema.json`.
|
40
|
+
|
41
|
+
You can also specify a filename and extension like so:
|
42
|
+
|
43
|
+
```
|
44
|
+
csv2schema generate myfile.csv --filename=myschema.json
|
45
|
+
```
|
46
|
+
|
47
|
+
If you want to dump the JSON to the command line (to pipe somewhere else for example) we can handle that too:
|
48
|
+
|
49
|
+
```
|
50
|
+
csv2schema generate myfile.csv --dump
|
51
|
+
```
|
52
|
+
|
53
|
+
### In your own Ruby code
|
54
|
+
|
29
55
|
Require the gem (if you haven't already):
|
30
56
|
|
31
57
|
```ruby
|
data/csv2schema.gemspec
CHANGED
@@ -27,9 +27,12 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
|
29
29
|
spec.add_dependency "csvlint", "~> 0.3.2"
|
30
|
+
spec.add_dependency "thor", "~> 0.19.1"
|
31
|
+
spec.add_dependency "colorize", "~> 0.8.1"
|
30
32
|
|
31
33
|
spec.add_development_dependency "bundler", "~> 1.11"
|
32
34
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
35
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
36
|
spec.add_development_dependency "pry", "~> 0.10.4"
|
37
|
+
spec.add_development_dependency "henry", "~> 0.1.3"
|
35
38
|
end
|
data/exe/csv2schema
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "csv2schema"
|
5
|
+
require "thor"
|
6
|
+
require "colorize"
|
7
|
+
|
8
|
+
module Csv2schema
|
9
|
+
class Cli < Thor
|
10
|
+
|
11
|
+
desc "csv2schema /path/to/file.csv OR csv2schema http://example.org/file.csv", "Generate schema from CSV"
|
12
|
+
option :dump, type: :boolean
|
13
|
+
option :filename
|
14
|
+
def generate(source)
|
15
|
+
source = read_source(source)
|
16
|
+
csv = Csv2schema::CSV.new(source)
|
17
|
+
if options[:dump]
|
18
|
+
puts csv.schema
|
19
|
+
else
|
20
|
+
filename = options[:filename].nil? ? 'schema.json' : options[:filename]
|
21
|
+
File.open(filename, 'w') {|f| f.write(csv.schema) }
|
22
|
+
puts "Schema created at #{filename}!".colorize(:green)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def read_source(source)
|
29
|
+
if source.nil?
|
30
|
+
# If no source is present, try reading from stdin
|
31
|
+
if !$stdin.tty?
|
32
|
+
source = StringIO.new(STDIN.read) rescue nil
|
33
|
+
return_error "No CSV data to validate" if !options[:schema] && source.nil?
|
34
|
+
end
|
35
|
+
else
|
36
|
+
# If the source isn't a URL, it's a file
|
37
|
+
unless source =~ /^http(s)?/
|
38
|
+
begin
|
39
|
+
source = File.new( source )
|
40
|
+
rescue Errno::ENOENT
|
41
|
+
return_error "#{source} not found"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
source
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Csv2schema::Cli.start(ARGV)
|
data/lib/csv2schema.rb
CHANGED
data/lib/csv2schema/csv.rb
CHANGED
@@ -0,0 +1,84 @@
|
|
1
|
+
module Csv2schema
|
2
|
+
class Validator < Csvlint::Validator
|
3
|
+
|
4
|
+
def build_formats(row)
|
5
|
+
row.each_with_index do |col, i|
|
6
|
+
next if col.nil? || col.empty?
|
7
|
+
@formats[i] ||= Hash.new(0)
|
8
|
+
|
9
|
+
# require "pry" ; binding.pry
|
10
|
+
|
11
|
+
format =
|
12
|
+
if float?(col)
|
13
|
+
:float
|
14
|
+
elsif col.strip[FORMATS[:boolean]]
|
15
|
+
:boolean
|
16
|
+
elsif uri?(col)
|
17
|
+
:uri
|
18
|
+
elsif possible_date?(col)
|
19
|
+
date_formats(col)
|
20
|
+
elsif col.strip[FORMATS[:numeric]]
|
21
|
+
:numeric
|
22
|
+
else
|
23
|
+
:string
|
24
|
+
end
|
25
|
+
|
26
|
+
@formats[i][format] += 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def float?(col)
|
31
|
+
Float(col).to_s == col rescue false
|
32
|
+
end
|
33
|
+
|
34
|
+
def date_formats(col)
|
35
|
+
if col[FORMATS[:date_db]] && date_format?(Date, col, '%Y-%m-%d')
|
36
|
+
:date_db
|
37
|
+
elsif col[FORMATS[:date_short]] && date_format?(Date, col, '%e %b')
|
38
|
+
:date_short
|
39
|
+
elsif col[FORMATS[:date_rfc822]] && date_format?(Date, col, '%e %b %Y')
|
40
|
+
:date_rfc822
|
41
|
+
elsif col[FORMATS[:date_long]] && date_format?(Date, col, '%B %e, %Y')
|
42
|
+
:date_long
|
43
|
+
elsif col[FORMATS[:dateTime_time]] && date_format?(Time, col, '%H:%M')
|
44
|
+
:dateTime_time
|
45
|
+
elsif col[FORMATS[:dateTime_hms]] && date_format?(Time, col, '%H:%M:%S')
|
46
|
+
:dateTime_hms
|
47
|
+
elsif col[FORMATS[:dateTime_db]] && date_format?(Time, col, '%Y-%m-%d %H:%M:%S')
|
48
|
+
:dateTime_db
|
49
|
+
elsif col[FORMATS[:dateTime_iso8601]] && date_format?(Time, col, '%Y-%m-%dT%H:%M:%SZ')
|
50
|
+
:dateTime_iso8601
|
51
|
+
elsif col[FORMATS[:dateTime_short]] && date_format?(Time, col, '%d %b %H:%M')
|
52
|
+
:dateTime_short
|
53
|
+
elsif col[FORMATS[:dateTime_long]] && date_format?(Time, col, '%B %d, %Y %H:%M')
|
54
|
+
:dateTime_long
|
55
|
+
elsif col[FORMATS[:date_month]] && date_format?(Date, col, '%Y-%m')
|
56
|
+
:date_month
|
57
|
+
elsif col.strip[FORMATS[:numeric]]
|
58
|
+
:numeric
|
59
|
+
else
|
60
|
+
:string
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
FORMATS = {
|
65
|
+
:string => nil,
|
66
|
+
:numeric => /\A[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?\z/,
|
67
|
+
:uri => /\Ahttps?:/,
|
68
|
+
:boolean => /\Atrue\z|\Afalse\z|\Ay\z|\An\z|\Ayes\z|\Ano\z|\A1\z|\A0\z/i,
|
69
|
+
:date_year => /\A\d{4,}\z/, # 12345
|
70
|
+
:date_month => /\A\d{4,}-\d{2,}\z/, # 12345-02
|
71
|
+
:date_db => /\A\d{4,}-\d\d-\d\d\z/, # "12345-01-01"
|
72
|
+
:date_long => /\A(?:#{Date::MONTHNAMES.join('|')}) [ \d]\d, \d{4,}\z/, # "January 1, 12345"
|
73
|
+
:date_rfc822 => /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join('|')}) \d{4,}\z/, # " 1 Jan 12345"
|
74
|
+
:date_short => /\A[ \d]\d (?:#{Date::ABBR_MONTHNAMES.join('|')})\z/, # "1 Jan"
|
75
|
+
:dateTime_db => /\A\d{4,}-\d\d-\d\d \d\d:\d\d:\d\d\z/, # "12345-01-01 00:00:00"
|
76
|
+
:dateTime_hms => /\A\d\d:\d\d:\d\d\z/, # "00:00:00"
|
77
|
+
:dateTime_iso8601 => /\A\d{4,}-\d\d-\d\dT\d\d:\d\d:\d\dZ\z/, # "12345-01-01T00:00:00Z"
|
78
|
+
:dateTime_long => /\A(?:#{Date::MONTHNAMES.join('|')}) \d\d, \d{4,} \d\d:\d\d\z/, # "January 01, 12345 00:00"
|
79
|
+
:dateTime_short => /\A\d\d (?:#{Date::ABBR_MONTHNAMES.join('|')}) \d\d:\d\d\z/, # "01 Jan 00:00"
|
80
|
+
:dateTime_time => /\A\d\d:\d\d\z/, # "00:00"
|
81
|
+
}.freeze
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
data/lib/csv2schema/schema.rb
CHANGED
@@ -21,7 +21,14 @@ module Csv2schema
|
|
21
21
|
def get_type(format)
|
22
22
|
{
|
23
23
|
string: 'http://www.w3.org/2001/XMLSchema#string',
|
24
|
-
numeric: 'http://www.w3.org/2001/XMLSchema#int'
|
24
|
+
numeric: 'http://www.w3.org/2001/XMLSchema#int',
|
25
|
+
float: 'http://www.w3.org/2001/XMLSchema#float',
|
26
|
+
uri: 'http://www.w3.org/2001/XMLSchema#anyURI',
|
27
|
+
boolean: 'http://www.w3.org/2001/XMLSchema#boolean',
|
28
|
+
date_db: 'http://www.w3.org/2001/XMLSchema#date',
|
29
|
+
dateTime_iso8601: 'http://www.w3.org/2001/XMLSchema#dateTime',
|
30
|
+
date_month: 'http://www.w3.org/2001/XMLSchema#gYearMonth',
|
31
|
+
dateTime_hms: 'http://www.w3.org/2001/XMLSchema#time'
|
25
32
|
}[format]
|
26
33
|
end
|
27
34
|
|
data/lib/csv2schema/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv2schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pezholio
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.3.2
|
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.19.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.19.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.1
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bundler
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,10 +108,25 @@ dependencies:
|
|
80
108
|
- - ~>
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: 0.10.4
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: henry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.1.3
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.1.3
|
83
125
|
description:
|
84
126
|
email:
|
85
127
|
- pezholio@gmail.com
|
86
|
-
executables:
|
128
|
+
executables:
|
129
|
+
- csv2schema
|
87
130
|
extensions: []
|
88
131
|
extra_rdoc_files: []
|
89
132
|
files:
|
@@ -91,6 +134,7 @@ files:
|
|
91
134
|
- .rspec
|
92
135
|
- .ruby-version
|
93
136
|
- .travis.yml
|
137
|
+
- CHANGELOG.md
|
94
138
|
- CODE_OF_CONDUCT.md
|
95
139
|
- Gemfile
|
96
140
|
- LICENSE.txt
|
@@ -99,8 +143,10 @@ files:
|
|
99
143
|
- bin/console
|
100
144
|
- bin/setup
|
101
145
|
- csv2schema.gemspec
|
146
|
+
- exe/csv2schema
|
102
147
|
- lib/csv2schema.rb
|
103
148
|
- lib/csv2schema/csv.rb
|
149
|
+
- lib/csv2schema/format_builder.rb
|
104
150
|
- lib/csv2schema/formats.rb
|
105
151
|
- lib/csv2schema/required.rb
|
106
152
|
- lib/csv2schema/schema.rb
|