tableschema 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +21 -0
  3. data/.travis.yml +15 -1
  4. data/README.md +164 -129
  5. data/Rakefile +10 -1
  6. data/bin/console +2 -6
  7. data/{etc/schemas → lib/profiles}/geojson.json +0 -1
  8. data/lib/profiles/table-schema.json +1625 -0
  9. data/lib/profiles/topojson.json +311 -0
  10. data/lib/tableschema.rb +5 -3
  11. data/lib/tableschema/constraints/constraints.rb +12 -24
  12. data/lib/tableschema/constraints/enum.rb +6 -2
  13. data/lib/tableschema/constraints/max_length.rb +6 -2
  14. data/lib/tableschema/constraints/maximum.rb +12 -2
  15. data/lib/tableschema/constraints/min_length.rb +6 -2
  16. data/lib/tableschema/constraints/minimum.rb +12 -2
  17. data/lib/tableschema/constraints/pattern.rb +9 -2
  18. data/lib/tableschema/constraints/required.rb +6 -15
  19. data/lib/tableschema/constraints/unique.rb +12 -0
  20. data/lib/tableschema/defaults.rb +9 -0
  21. data/lib/tableschema/exceptions.rb +15 -2
  22. data/lib/tableschema/field.rb +39 -20
  23. data/lib/tableschema/helpers.rb +32 -15
  24. data/lib/tableschema/infer.rb +31 -28
  25. data/lib/tableschema/model.rb +57 -34
  26. data/lib/tableschema/schema.rb +40 -6
  27. data/lib/tableschema/table.rb +75 -26
  28. data/lib/tableschema/types/any.rb +1 -0
  29. data/lib/tableschema/types/array.rb +2 -1
  30. data/lib/tableschema/types/base.rb +9 -21
  31. data/lib/tableschema/types/date.rb +1 -0
  32. data/lib/tableschema/types/datetime.rb +1 -0
  33. data/lib/tableschema/types/duration.rb +31 -0
  34. data/lib/tableschema/types/geojson.rb +27 -5
  35. data/lib/tableschema/types/geopoint.rb +4 -3
  36. data/lib/tableschema/types/integer.rb +1 -0
  37. data/lib/tableschema/types/number.rb +40 -25
  38. data/lib/tableschema/types/object.rb +2 -1
  39. data/lib/tableschema/types/string.rb +8 -0
  40. data/lib/tableschema/types/time.rb +1 -0
  41. data/lib/tableschema/types/year.rb +34 -0
  42. data/lib/tableschema/types/yearmonth.rb +52 -0
  43. data/lib/tableschema/validate.rb +45 -29
  44. data/lib/tableschema/version.rb +1 -1
  45. data/tableschema.gemspec +2 -1
  46. metadata +31 -12
  47. data/etc/schemas/json-table-schema.json +0 -102
  48. data/lib/tableschema/data.rb +0 -60
  49. data/lib/tableschema/types/null.rb +0 -37
@@ -1,102 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-04/schema#",
3
- "title": "JSON Table Schema",
4
- "description": "JSON Schema for validating JSON Table structures",
5
- "type": "object",
6
- "properties": {
7
- "fields": {
8
- "type": "array",
9
- "minItems": 1,
10
- "items": {
11
- "type": "object",
12
- "properties": {
13
- "name": {
14
- "type": "string"
15
- },
16
- "title": {
17
- "type": "string"
18
- },
19
- "description": {
20
- "type": "string"
21
- },
22
- "type": {
23
- "enum": [ "string", "number", "integer", "date", "time", "datetime", "boolean", "binary", "object", "geopoint", "geojson", "array", "any" ]
24
- },
25
- "format": {
26
- "type": "string"
27
- },
28
- "constraints": {
29
- "type": "object",
30
- "properties": {
31
- "required": {
32
- "type": "boolean"
33
- },
34
- "minLength": {
35
- "type": "integer"
36
- },
37
- "maxLength": {
38
- "type": "integer"
39
- },
40
- "unique": {
41
- "type": "boolean"
42
- },
43
- "pattern": {
44
- "type": "string"
45
- },
46
- "minimum": {
47
- "oneOf": [
48
- {"type": "string"},
49
- {"type": "number"}
50
- ]
51
- },
52
- "maximum": {
53
- "oneOf": [
54
- {"type": "string"},
55
- {"type": "number"}
56
- ]
57
- }
58
- }
59
- }
60
- },
61
- "required": ["name"]
62
- }
63
- },
64
- "primaryKey": {
65
- "oneOf": [
66
- {"type": "string"},
67
- {"type": "array"}
68
- ]
69
- },
70
- "foreignKeys": {
71
- "type": "array",
72
- "items": {
73
- "type": "object",
74
- "required": ["fields", "reference"],
75
- "properties": {
76
- "fields": {
77
- "oneOf": [
78
- {"type": "string"},
79
- {"type": "array"}
80
- ]
81
- },
82
- "reference": {
83
- "type": "object",
84
- "required": ["resource", "fields"],
85
- "properties": {
86
- "resource": {
87
- "type": "string"
88
- },
89
- "fields": {
90
- "oneOf": [
91
- {"type": "string"},
92
- {"type": "array"}
93
- ]
94
- }
95
- }
96
- }
97
- }
98
- }
99
- }
100
- },
101
- "required": ["fields"]
102
- }
@@ -1,60 +0,0 @@
1
- module TableSchema
2
- module Data
3
-
4
- attr_reader :errors
5
-
6
- def cast_rows(rows, fail_fast = true, limit = nil)
7
- @errors ||= []
8
- parsed_rows = []
9
- rows.each_with_index do |r, i|
10
- begin
11
- break if limit && (limit <= i)
12
- r = r.fields if r.class == CSV::Row
13
- parsed_rows << cast_row(r, fail_fast)
14
- rescue MultipleInvalid, ConversionError => e
15
- raise e if fail_fast == true
16
- @errors << e if e.is_a?(ConversionError)
17
- end
18
- end
19
- check_for_errors
20
- parsed_rows
21
- end
22
-
23
- alias_method :convert, :cast_rows
24
-
25
- def cast_row(row, fail_fast = true)
26
- @errors ||= []
27
- raise_header_error(row) if row.count != fields.count
28
- fields.each_with_index do |field,i|
29
- row[i] = cast_column(field, row[i], fail_fast)
30
- end
31
- check_for_errors
32
- row
33
- end
34
-
35
- alias_method :convert_row, :cast_row
36
-
37
- private
38
-
39
- def raise_header_error(row)
40
- raise(TableSchema::ConversionError.new("The number of items to convert (#{row.count}) does not match the number of headers in the schema (#{fields.count})"))
41
- end
42
-
43
- def check_for_errors
44
- raise(TableSchema::MultipleInvalid.new("There were errors parsing the data")) if @errors.count > 0
45
- end
46
-
47
- def cast_column(field, col, fail_fast)
48
- field.cast_value(col)
49
- rescue Exception => e
50
- if fail_fast == true
51
- raise e
52
- else
53
- @errors << e
54
- end
55
- end
56
-
57
- alias_method :convert_column, :cast_column
58
-
59
- end
60
- end
@@ -1,37 +0,0 @@
1
- module TableSchema
2
- module Types
3
- class Null < Base
4
-
5
- def name
6
- 'null'
7
- end
8
-
9
- def self.supported_constraints
10
- [
11
- 'required',
12
- 'pattern',
13
- 'enum',
14
- ]
15
- end
16
-
17
- def type
18
- ::NilClass
19
- end
20
-
21
- def null_values
22
- ['null', 'none', 'nil', 'nan', '-', '']
23
- end
24
-
25
- def cast_default(value)
26
- if value.is_a?(type)
27
- return value
28
- elsif null_values.include?(value.to_s.downcase)
29
- nil
30
- else
31
- raise TableSchema::InvalidCast.new("#{value} is not a #{name}")
32
- end
33
- end
34
-
35
- end
36
- end
37
- end