flat_kit 0.3.0 → 1.0.0

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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -2
  3. data/HISTORY.md +9 -0
  4. data/Manifest.txt +3 -42
  5. data/{bin → exe}/fk +2 -1
  6. data/flat_kit.gemspec +33 -0
  7. data/lib/flat_kit/cli.rb +46 -32
  8. data/lib/flat_kit/command/cat.rb +34 -32
  9. data/lib/flat_kit/command/merge.rb +37 -36
  10. data/lib/flat_kit/command/sort.rb +37 -37
  11. data/lib/flat_kit/command/stats.rb +41 -39
  12. data/lib/flat_kit/command.rb +10 -11
  13. data/lib/flat_kit/descendant_tracker.rb +9 -6
  14. data/lib/flat_kit/error.rb +4 -0
  15. data/lib/flat_kit/event_emitter.rb +5 -2
  16. data/lib/flat_kit/field_stats.rb +31 -26
  17. data/lib/flat_kit/field_type/boolean_type.rb +9 -5
  18. data/lib/flat_kit/field_type/date_type.rb +19 -17
  19. data/lib/flat_kit/field_type/float_type.rb +15 -9
  20. data/lib/flat_kit/field_type/guess_type.rb +9 -6
  21. data/lib/flat_kit/field_type/integer_type.rb +6 -4
  22. data/lib/flat_kit/field_type/null_type.rb +5 -1
  23. data/lib/flat_kit/field_type/string_type.rb +8 -6
  24. data/lib/flat_kit/field_type/timestamp_type.rb +11 -10
  25. data/lib/flat_kit/field_type/unknown_type.rb +12 -8
  26. data/lib/flat_kit/field_type.rb +52 -44
  27. data/lib/flat_kit/format.rb +11 -5
  28. data/lib/flat_kit/input/file.rb +11 -9
  29. data/lib/flat_kit/input/io.rb +18 -21
  30. data/lib/flat_kit/input.rb +8 -7
  31. data/lib/flat_kit/internal_node.rb +22 -19
  32. data/lib/flat_kit/jsonl/format.rb +6 -2
  33. data/lib/flat_kit/jsonl/reader.rb +7 -4
  34. data/lib/flat_kit/jsonl/record.rb +15 -18
  35. data/lib/flat_kit/jsonl/writer.rb +8 -10
  36. data/lib/flat_kit/jsonl.rb +8 -4
  37. data/lib/flat_kit/leaf_node.rb +6 -5
  38. data/lib/flat_kit/log_formatter.rb +20 -0
  39. data/lib/flat_kit/logger.rb +12 -19
  40. data/lib/flat_kit/merge.rb +21 -18
  41. data/lib/flat_kit/merge_tree.rb +5 -6
  42. data/lib/flat_kit/output/file.rb +13 -9
  43. data/lib/flat_kit/output/io.rb +40 -35
  44. data/lib/flat_kit/output.rb +8 -7
  45. data/lib/flat_kit/position.rb +3 -4
  46. data/lib/flat_kit/reader.rb +8 -8
  47. data/lib/flat_kit/record.rb +12 -12
  48. data/lib/flat_kit/sentinel_internal_node.rb +6 -5
  49. data/lib/flat_kit/sentinel_leaf_node.rb +4 -1
  50. data/lib/flat_kit/sort.rb +8 -9
  51. data/lib/flat_kit/stat_type/nominal_stats.rb +13 -7
  52. data/lib/flat_kit/stat_type/numerical_stats.rb +18 -18
  53. data/lib/flat_kit/stat_type/ordinal_stats.rb +8 -13
  54. data/lib/flat_kit/stat_type.rb +18 -13
  55. data/lib/flat_kit/stats.rb +12 -14
  56. data/lib/flat_kit/writer.rb +5 -6
  57. data/lib/flat_kit/xsv/format.rb +6 -2
  58. data/lib/flat_kit/xsv/reader.rb +8 -6
  59. data/lib/flat_kit/xsv/record.rb +21 -15
  60. data/lib/flat_kit/xsv/writer.rb +13 -10
  61. data/lib/flat_kit/xsv.rb +7 -4
  62. data/lib/flat_kit.rb +31 -26
  63. metadata +20 -158
  64. data/Rakefile +0 -21
  65. data/examples/stream-active-record-to-csv.rb +0 -42
  66. data/tasks/default.rake +0 -242
  67. data/tasks/extension.rake +0 -38
  68. data/tasks/man.rake +0 -7
  69. data/tasks/this.rb +0 -208
  70. data/test/device_dataset.rb +0 -117
  71. data/test/field_type/test_boolean_type.rb +0 -65
  72. data/test/field_type/test_date_type.rb +0 -71
  73. data/test/field_type/test_float_type.rb +0 -56
  74. data/test/field_type/test_guess_type.rb +0 -14
  75. data/test/field_type/test_integer_type.rb +0 -52
  76. data/test/field_type/test_null_type.rb +0 -41
  77. data/test/field_type/test_string_type.rb +0 -18
  78. data/test/field_type/test_timestamp_type.rb +0 -108
  79. data/test/field_type/test_unknown_type.rb +0 -35
  80. data/test/input/test_file.rb +0 -73
  81. data/test/input/test_io.rb +0 -93
  82. data/test/jsonl/test_format.rb +0 -22
  83. data/test/jsonl/test_reader.rb +0 -49
  84. data/test/jsonl/test_record.rb +0 -61
  85. data/test/jsonl/test_writer.rb +0 -86
  86. data/test/output/test_file.rb +0 -60
  87. data/test/output/test_io.rb +0 -104
  88. data/test/run +0 -23
  89. data/test/stat_type/test_nominal_stats.rb +0 -69
  90. data/test/stat_type/test_numerical_stats.rb +0 -118
  91. data/test/stat_type/test_ordinal_stats.rb +0 -92
  92. data/test/test_conversions.rb +0 -45
  93. data/test/test_event_emitter.rb +0 -89
  94. data/test/test_field_stats.rb +0 -134
  95. data/test/test_field_type.rb +0 -34
  96. data/test/test_format.rb +0 -24
  97. data/test/test_helper.rb +0 -26
  98. data/test/test_merge.rb +0 -40
  99. data/test/test_merge_tree.rb +0 -64
  100. data/test/test_version.rb +0 -11
  101. data/test/xsv/test_format.rb +0 -22
  102. data/test/xsv/test_reader.rb +0 -61
  103. data/test/xsv/test_record.rb +0 -69
  104. data/test/xsv/test_writer.rb +0 -89
data/tasks/this.rb DELETED
@@ -1,208 +0,0 @@
1
- require 'pathname'
2
-
3
- # Public: A Class containing all the metadata and utilities needed to manage a
4
- # ruby project.
5
- class ThisProject
6
- # The name of this project
7
- attr_accessor :name
8
-
9
- # The author's name
10
- attr_accessor :author
11
-
12
- # The email address of the author(s)
13
- attr_accessor :email
14
-
15
- # The homepage of this project
16
- attr_accessor :homepage
17
-
18
- # The regex of files to exclude from the manifest
19
- attr_accessor :exclude_from_manifest
20
-
21
- # The hash of Gem::Specifications keyed' by platform
22
- attr_accessor :gemspecs
23
-
24
- # Public: Initialize ThisProject
25
- #
26
- # Yields self
27
- def initialize(&block)
28
- @exclude_from_manifest = Regexp.union(/\.(git|DS_Store)/,
29
- /^(doc|coverage|pkg|tmp|Gemfile(\.lock)?)/,
30
- /^[^\/]+\.gemspec/,
31
- /\.(swp|jar|bundle|so|rvmrc|travis.yml|byebug_history|fossa.yml|ruby-version)$/,
32
- /~$/)
33
- @gemspecs = Hash.new
34
- yield self if block_given?
35
- end
36
-
37
- # Public: return the version of ThisProject
38
- #
39
- # Search the ruby files in the project looking for the one that has the
40
- # version string in it. This does not eval any code in the project, it parses
41
- # the source code looking for the string.
42
- #
43
- # Returns a String version
44
- def version
45
- [ "lib/#{ name }.rb", "lib/#{ name }/version.rb" ].each do |v|
46
- path = project_path( v )
47
- line = path.read[/^\s*VERSION\s*=\s*.*/]
48
- if line then
49
- return line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
50
- end
51
- end
52
- end
53
-
54
- # Internal: Return a section of an RDoc file with the given section name
55
- #
56
- # path - the relative path in the project of the file to parse
57
- # section_name - the section out of the file from which to parse data
58
- #
59
- # Retuns the text of the section as an array of paragrphs.
60
- def section_of( file, section_name )
61
- re = /^[=#]+ (.*)$/
62
- sectional = project_path( file )
63
- parts = sectional.read.split( re )[1..-1]
64
- parts.map! { |p| p.strip }
65
-
66
- sections = Hash.new
67
- Hash[*parts].each do |k,v|
68
- sections[k] = v.split("\n\n")
69
- end
70
- return sections[section_name]
71
- end
72
-
73
- # Internal: print out a warning about the give task
74
- def task_warning( task )
75
- warn "WARNING: '#{task}' tasks are not defined. Please run 'rake develop'"
76
- end
77
-
78
- # Internal: Return the full path to the file that is relative to the project
79
- # root.
80
- #
81
- # path - the relative path of the file from the project root
82
- #
83
- # Returns the Pathname of the file
84
- def project_path( *relative_path )
85
- project_root.join( *relative_path )
86
- end
87
-
88
- # Internal: The absolute path of this file
89
- #
90
- # Returns the Pathname of this file.
91
- def this_file_path
92
- Pathname.new( __FILE__ ).expand_path
93
- end
94
-
95
- # Internal: The root directory of this project
96
- #
97
- # This is defined as being the directory that is in the path of this project
98
- # that has the first Rakefile
99
- #
100
- # Returns the Pathname of the directory
101
- def project_root
102
- this_file_path.ascend do |p|
103
- rakefile = p.join( 'Rakefile' )
104
- return p if rakefile.exist?
105
- end
106
- end
107
-
108
- # Internal: Returns the contents of the Manifest.txt file as an array
109
- #
110
- # Returns an Array of strings
111
- def manifest
112
- manifest_file = project_path( "Manifest.txt" )
113
- abort "You need a Manifest.txt" unless manifest_file.readable?
114
- manifest_file.readlines.map { |l| l.strip }
115
- end
116
-
117
- # Internal: Return the files that define the extensions
118
- #
119
- # Returns an Array
120
- def extension_conf_files
121
- manifest.grep( /extconf.rb\Z/ )
122
- end
123
-
124
- # Internal: Returns the gemspace associated with the current ruby platform
125
- def platform_gemspec
126
- gemspecs.fetch(platform) { This.ruby_gemspec }
127
- end
128
-
129
- def core_gemspec
130
- Gem::Specification.new do |spec|
131
- spec.name = name
132
- spec.version = version
133
- spec.author = author
134
- spec.email = email
135
- spec.homepage = homepage
136
-
137
- spec.summary = summary
138
- spec.description = description
139
- spec.license = license
140
-
141
- spec.files = manifest
142
- spec.executables = spec.files.grep(/^bin/) { |f| File.basename(f) }
143
- spec.test_files = spec.files.grep(/^(spec|test)/)
144
-
145
- spec.extra_rdoc_files += spec.files.grep(/(txt|rdoc|md)$/)
146
- spec.rdoc_options = [ "--main" , 'README.md',
147
- "--markup", "tomdoc" ]
148
-
149
- spec.required_ruby_version = '>= 2.2.2'
150
- end
151
- end
152
-
153
- # Internal: Return the gemspec for the ruby platform
154
- def ruby_gemspec( core = core_gemspec, &block )
155
- yielding_gemspec( 'ruby', core, &block )
156
- end
157
-
158
- # Internal: Return the gemspec for the jruby platform
159
- def java_gemspec( core = core_gemspec, &block )
160
- yielding_gemspec( 'java', core, &block )
161
- end
162
-
163
- # Internal: give an initial spec and a key, create a new gemspec based off of
164
- # it.
165
- #
166
- # This will force the new gemspecs 'platform' to be that of the key, since the
167
- # only reason you would have multiple gemspecs at this point is to deal with
168
- # different platforms.
169
- def yielding_gemspec( key, core )
170
- spec = gemspecs[key] ||= core.dup
171
- spec.platform = key
172
- yield spec if block_given?
173
- return spec
174
- end
175
-
176
- # Internal: Return the platform of ThisProject at the current moment in time.
177
- def platform
178
- (RUBY_PLATFORM == "java") ? 'java' : Gem::Platform::RUBY
179
- end
180
-
181
- # Internal: Return the DESCRIPTION section of the README.rdoc file
182
- def description_section
183
- section_of( 'README.md', 'DESCRIPTION')
184
- end
185
-
186
- # Internal: Return the summary text from the README
187
- def summary
188
- description_section.first
189
- end
190
-
191
- # Internal: Return the full description text from the README
192
- def description
193
- description_section.join(" ").tr("\n", ' ').gsub(/[{}]/,'').gsub(/\[[^\]]+\]/,'') # strip rdoc
194
- end
195
-
196
- def license
197
- license_file = project_path("LICENSE.txt")
198
- line = license_file.readlines.first
199
- line.split(/\s+/).first
200
- end
201
-
202
- # Internal: The path to the gemspec file
203
- def gemspec_file
204
- project_path( "#{ name }.gemspec" )
205
- end
206
- end
207
-
208
- This = ThisProject.new
@@ -1,117 +0,0 @@
1
- class DeviceDataset
2
-
3
- include TestHelper
4
-
5
- attr_reader :count
6
- attr_reader :compare_fields
7
- attr_reader :fields
8
-
9
- attr_reader :filename_jsonl
10
- attr_reader :filename_sorted_jsonl
11
- attr_reader :filename_csv
12
- attr_reader :filename_sorted_csv
13
-
14
- def initialize(count:, compare_fields: [ "manufacturer", "model_name", "slug" ])
15
- @count = count
16
- @compare_fields = compare_fields
17
- @fields = %w[
18
- build_number
19
- manufacturer
20
- model_name
21
- platform
22
- serial
23
- slug
24
- ]
25
- @filename_sorted_jsonl = nil
26
- @filename_jsonl = nil
27
- @filename_sorted_csv = nil
28
- @filename_csv = nil
29
- @slug = generate_slug
30
- end
31
-
32
- def persist_records_as_jsonl
33
- @filename_jsonl = scratch_file(prefix: "unsorted_", slug: @slug)
34
- @filename_jsonl.open("w+") do |f|
35
- f.write(records_as_jsonl)
36
- end
37
- end
38
-
39
- def persist_sorted_records_as_jsonl
40
- @filename_sorted_jsonl = scratch_file(prefix: "sorted_", slug: @slug)
41
- @filename_sorted_jsonl.open("w+") do |f|
42
- f.write(sorted_records_as_jsonl)
43
- end
44
- end
45
-
46
- def cleanup_files
47
- [ @filename_sorted_jsonl, @filename_jsonl, @filename_sorted_csv, @filename_csv ].each do |p|
48
- next if p.nil?
49
- p.unlink if p.exist?
50
- end
51
- end
52
-
53
- def records
54
- @records ||= Array.new.tap do |a|
55
- count.times do
56
- a << Hash.new.tap do |h|
57
- fields.each do |f|
58
- value = (f == 'slug') ? generate_slug : ::Faker::Device.send(f)
59
- h[f] = value
60
- end
61
- end
62
- end
63
- end
64
- end
65
-
66
- def sorted_records
67
- @sorted_records ||= records.sort_by do |r|
68
- compare_fields.map { |field| r[field] }
69
- end
70
- end
71
-
72
- def records_as_jsonl
73
- @jsonl_records ||= as_jsonl(list: records)
74
- end
75
-
76
- def records_as_csv
77
- @csv_records ||= as_csv(list: records)
78
- end
79
-
80
- def records_as_csv_rows
81
- @csv_rows ||= as_csv_rows(records_as_csv)
82
- end
83
-
84
- def sorted_records_as_jsonl
85
- @jsonl_sorted_records ||= as_jsonl(list: sorted_records)
86
- end
87
-
88
- def sorted_records_as_csv
89
- @csv_sorted_records ||= as_csv(list: sorted_records)
90
- end
91
-
92
- def sorted_records_as_csv_rows
93
- @csv_sorted_rows ||= as_csv_rows(sorted_records_as_csv)
94
- end
95
-
96
- private
97
-
98
- def as_jsonl(list:)
99
- list.map { |r| Oj.dump(r) }.join("\n") + "\n"
100
- end
101
-
102
- def as_csv(list:, headers: fields)
103
- CSV.generate('', headers: headers , write_headers: true) do |csv|
104
- list.each do |r|
105
- csv << fields.map { |f| r[f] }
106
- end
107
- end
108
- end
109
-
110
- def as_csv_rows(text)
111
- Array.new.tap do |a|
112
- CSV.new(text, converters: :numeric, headers: :first_row, return_headers: false).each do |row|
113
- a << row
114
- end
115
- end
116
- end
117
- end
@@ -1,65 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestBooleanType < ::Minitest::Test
5
- def truthy_items
6
- t = %w[ yes Y true t 1 y ]
7
- t << 1
8
- end
9
-
10
- def falsey_items
11
- f = %w[ no n false f 0 N ]
12
- f << 0
13
- end
14
-
15
- def test_true
16
- assert(FlatKit::FieldType::BooleanType.matches?(true))
17
- end
18
-
19
- def test_false
20
- assert(FlatKit::FieldType::BooleanType.matches?(false))
21
- end
22
-
23
- def test_truthy_items
24
- truthy_items.each do |s|
25
- assert(FlatKit::FieldType::BooleanType.matches?(s), "#{s} should be boolean")
26
- end
27
- end
28
-
29
- def test_falsey_items
30
- falsey_items.each do |s|
31
- assert(FlatKit::FieldType::BooleanType.matches?(s), "#{s} should be boolean")
32
- end
33
- end
34
-
35
- def test_other_class_does_not_match
36
- refute(FlatKit::FieldType::BooleanType.matches?(Object.new))
37
- end
38
-
39
- def test_coerces_falsey_to_boolean
40
- falsey_items.each do |t|
41
- refute(FlatKit::FieldType::BooleanType.coerce(t))
42
- end
43
- end
44
-
45
- def test_true_is_truthy
46
- assert(FlatKit::FieldType::BooleanType.coerce(true))
47
- end
48
-
49
- def test_false_is_falsey
50
- refute(FlatKit::FieldType::BooleanType.coerce(false))
51
- end
52
-
53
- def test_0_is_false
54
- refute(FlatKit::FieldType::BooleanType.coerce(0))
55
- end
56
-
57
- def test_1_is_false
58
- assert(FlatKit::FieldType::BooleanType.coerce(1))
59
- end
60
-
61
- def test_42_is_false
62
- assert(FlatKit::FieldType::BooleanType.coerce(42.0))
63
- end
64
- end
65
- end
@@ -1,71 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestDateType < ::Minitest::Test
5
- def test_time_does_not_match
6
- refute(FlatKit::FieldType::DateType.matches?(Time.now))
7
- end
8
-
9
- def test_date
10
- assert(FlatKit::FieldType::DateType.matches?(Date.today))
11
- end
12
-
13
- def test_datetime_does_not_match
14
- refute(FlatKit::FieldType::DateType.matches?(DateTime.now))
15
- end
16
-
17
- def test_formats
18
- formats = ::FlatKit::FieldType::DateType.parse_formats
19
-
20
- assert_equal(formats.size, formats.sort.uniq.size)
21
-
22
- formats.each do |df|
23
- s = Time.now.strftime("#{df}")
24
- assert(FlatKit::FieldType::DateType.matches?(s), "#{s} should match date")
25
- end
26
- end
27
-
28
- def test_other_class_does_not_match
29
- [ 42, Object.new, true, false ].each do |x|
30
- refute(FlatKit::FieldType::DateType.matches?(x), "#{x} should not be date")
31
- end
32
- end
33
-
34
- def test_N_number_does_not_match
35
- x = "N89362"
36
- refute(FlatKit::FieldType::DateType.matches?(x), "#{x} should not be date")
37
- end
38
-
39
- def test_coerce
40
- formats = ::FlatKit::FieldType::DateType.parse_formats
41
-
42
- formats.each do |df|
43
- s = Time.now.strftime("#{df}")
44
- assert_instance_of(Date, FlatKit::FieldType::DateType.coerce(s), "#{s} should convert to date")
45
- end
46
- end
47
-
48
- def test_date_coerce_does_not_passthrough_time
49
- t = Time.now
50
- assert_equal(::FlatKit::FieldType::CoerceFailure, FlatKit::FieldType::DateType.coerce(t))
51
- end
52
-
53
- def test_date_coerce_passthrough_date
54
- t = Date.today
55
- assert_equal(t, FlatKit::FieldType::DateType.coerce(t))
56
- end
57
-
58
- def test_date_coerce_does_not_passthrough_datetime
59
- t = DateTime.now
60
- assert_equal(::FlatKit::FieldType::CoerceFailure, FlatKit::FieldType::DateType.coerce(t))
61
- end
62
-
63
- def test_number_coerce_failure
64
- assert_equal(::FlatKit::FieldType::CoerceFailure, FlatKit::FieldType::DateType.coerce(42))
65
- end
66
-
67
- def test_number_coerce_failure_bad_parse
68
- assert_equal(::FlatKit::FieldType::CoerceFailure, FlatKit::FieldType::DateType.coerce("1234 56 78 90"))
69
- end
70
- end
71
- end
@@ -1,56 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestFloatType < ::Minitest::Test
5
- def test_float_matches
6
- assert(FlatKit::FieldType::FloatType.matches?(42.0))
7
- assert(FlatKit::FieldType::FloatType.matches?(42.1))
8
- end
9
-
10
- def test_integer_does_not_match
11
- refute(FlatKit::FieldType::FloatType.matches?(42))
12
- end
13
-
14
- def test_string_of_digits_does_not_match
15
- refute(FlatKit::FieldType::FloatType.matches?("42"))
16
- end
17
-
18
- def test_string_of_digits_with_dot_matches
19
- assert(FlatKit::FieldType::FloatType.matches?("42.0"))
20
- end
21
-
22
- def test_string_of_leters_does_not_match
23
- refute(FlatKit::FieldType::FloatType.matches?("abc"))
24
- end
25
-
26
- def test_scientific_notation_matches
27
- assert(FlatKit::FieldType::FloatType.matches?("1e-10"))
28
- end
29
-
30
- def test_other_class_does_not_match
31
- refute(FlatKit::FieldType::FloatType.matches?(Object.new))
32
- end
33
-
34
- def test_integer_coerces
35
- assert_equal(42.0, ::FlatKit::FieldType::FloatType.coerce(42))
36
- end
37
-
38
- def test_integer_strings_coerce
39
- assert_equal(42.0, ::FlatKit::FieldType::FloatType.coerce("42"))
40
- end
41
-
42
- def test_float_strings_coerce
43
- assert_equal(42.6, ::FlatKit::FieldType::FloatType.coerce("42.6"))
44
- end
45
-
46
- def test_float_coerces
47
- assert_equal(42.6, ::FlatKit::FieldType::FloatType.coerce(42.6))
48
- end
49
-
50
- def test_non_numercic_do_not_coerce
51
- [ "eleven", nil, false, Object.new ].each do |nope|
52
- assert_equal(::FlatKit::FieldType::CoerceFailure, ::FlatKit::FieldType::FloatType.coerce(nope))
53
- end
54
- end
55
- end
56
- end
@@ -1,14 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestGuessType < ::Minitest::Test
5
-
6
- def test_guess_type_should_not_match_anything
7
- refute(FlatKit::FieldType::GuessType.matches?(nil))
8
- end
9
-
10
- def test_guess_type_returns_coerce_failure
11
- assert_equal(::FlatKit::FieldType::CoerceFailure, ::FlatKit::FieldType::GuessType.coerce(nil))
12
- end
13
- end
14
- end
@@ -1,52 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestIntegerType < ::Minitest::Test
5
- def test_matches_integer
6
- assert(FlatKit::FieldType::IntegerType.matches?(42))
7
- end
8
-
9
- def test_matches_negative_integer
10
- assert(FlatKit::FieldType::IntegerType.matches?("-42"))
11
- end
12
-
13
- def test_float_does_not_match
14
- refute(FlatKit::FieldType::IntegerType.matches?(42.0))
15
- end
16
-
17
- def test_string_of_digits_matches
18
- assert(FlatKit::FieldType::IntegerType.matches?("42"))
19
- end
20
-
21
- def test_string_with_some_digiets_does_not_match
22
- refute(FlatKit::FieldType::IntegerType.matches?("42.0"))
23
- refute(FlatKit::FieldType::IntegerType.matches?("abc"))
24
- end
25
-
26
- def test_other_class_does_not_match
27
- refute(FlatKit::FieldType::IntegerType.matches?(Object.new))
28
- end
29
-
30
- def test_integer_coerces
31
- assert_equal(42, ::FlatKit::FieldType::IntegerType.coerce(42))
32
- end
33
-
34
- def test_integer_strings_coerce
35
- assert_equal(42, ::FlatKit::FieldType::IntegerType.coerce("42"))
36
- end
37
-
38
- def test_float_coerces
39
- assert_equal(42, ::FlatKit::FieldType::IntegerType.coerce(42.6))
40
- end
41
-
42
- def test_float_strings_do_not_coerce
43
- assert_equal(::FlatKit::FieldType::CoerceFailure, ::FlatKit::FieldType::IntegerType.coerce("42.6"))
44
- end
45
-
46
- def test_non_numercic_do_not_coerce
47
- [ "eleven", nil, false, Object.new ].each do |nope|
48
- assert_equal(::FlatKit::FieldType::CoerceFailure, ::FlatKit::FieldType::IntegerType.coerce(nope))
49
- end
50
- end
51
- end
52
- end
@@ -1,41 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestNullType < ::Minitest::Test
5
- def nully_items
6
- [ "null", "NULL", "nil", "\\N" ]
7
- end
8
-
9
- def test_null
10
- assert(FlatKit::FieldType::NullType.matches?(nil))
11
- end
12
-
13
- def test_nully_items
14
- nully_items.each do |s|
15
- assert(FlatKit::FieldType::NullType.matches?(s), "#{s} should be null")
16
- end
17
- end
18
-
19
- def test_other_class_does_not_match
20
- [ 42, Object.new, true, false ].each do |x|
21
- refute(FlatKit::FieldType::NullType.matches?(x), "#{x} should not be == null")
22
- end
23
- end
24
-
25
- def test_coerce_coerces_nil
26
- assert_nil(FlatKit::FieldType::NullType.coerce(nil))
27
- end
28
-
29
- def test_coerces_nully_items
30
- nully_items.each do |s|
31
- assert_nil(FlatKit::FieldType::NullType.coerce(s))
32
- end
33
- end
34
-
35
- def test_coerce_failure_non_non_nully_items
36
- [ "whatever", 42, Object.new, true, false, Class].each do |x|
37
- assert_equal(::FlatKit::FieldType::CoerceFailure, FlatKit::FieldType::NullType.coerce(x))
38
- end
39
- end
40
- end
41
- end
@@ -1,18 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module TestFieldType
4
- class TestStringType < ::Minitest::Test
5
-
6
- def test_string_will_not_match_non_string_data
7
- [42, false, true, 12.5, Object.new].each do |o|
8
- refute(FlatKit::FieldType::StringType.matches?(o))
9
- end
10
- end
11
-
12
- def test_string_type_returns_coerce_failures
13
- [BasicObject.new].each do |o|
14
- assert_equal(::FlatKit::FieldType::CoerceFailure, ::FlatKit::FieldType::StringType.coerce(o))
15
- end
16
- end
17
- end
18
- end