honey_format 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +3 -0
- data/.rubocop.yml +7 -0
- data/.ruby-style-guide.yml +264 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +2 -0
- data/README.md +63 -15
- data/Rakefile +2 -0
- data/bin/benchmark +2 -0
- data/bin/console +1 -0
- data/exe/honey_format +1 -0
- data/honey_format.gemspec +5 -4
- data/lib/honey_format/cli/benchmark_cli.rb +15 -13
- data/lib/honey_format/cli/cli.rb +17 -12
- data/lib/honey_format/cli/result_writer.rb +2 -0
- data/lib/honey_format/configuration.rb +114 -11
- data/lib/honey_format/converters/convert_boolean.rb +24 -0
- data/lib/honey_format/converters/convert_date_and_time.rb +30 -0
- data/lib/honey_format/converters/convert_number.rb +33 -0
- data/lib/honey_format/converters/convert_string.rb +42 -0
- data/lib/honey_format/converters/converters.rb +12 -0
- data/lib/honey_format/converters/header_column_converter.rb +57 -0
- data/lib/honey_format/csv.rb +22 -14
- data/lib/honey_format/errors.rb +8 -2
- data/lib/honey_format/helpers/helpers.rb +41 -0
- data/lib/honey_format/{header.rb → matrix/header.rb} +48 -12
- data/lib/honey_format/matrix/matrix.rb +104 -0
- data/lib/honey_format/{row.rb → matrix/row.rb} +6 -3
- data/lib/honey_format/{row_builder.rb → matrix/row_builder.rb} +5 -4
- data/lib/honey_format/{rows.rb → matrix/rows.rb} +7 -4
- data/lib/honey_format/matrix.rb +6 -89
- data/lib/honey_format/registry.rb +99 -0
- data/lib/honey_format/version.rb +4 -2
- data/lib/honey_format.rb +14 -6
- metadata +34 -24
- data/lib/honey_format/header_column_converter.rb +0 -40
- data/lib/honey_format/value_converter.rb +0 -117
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HoneyFormat
|
4
|
+
# Represents Matrix.
|
5
|
+
class Matrix
|
6
|
+
# Instantiate Matrix.
|
7
|
+
# @return [Matrix] a new instance of Matrix.
|
8
|
+
# @param [Array<Array<String, nil>>] matrix
|
9
|
+
# @param header [Array<String>]
|
10
|
+
# header optional argument that represents header, required if the matrix
|
11
|
+
# lacks a header row.
|
12
|
+
# @param header_converter [#call] converts header columns.
|
13
|
+
# @param header_deduplicator [#call] deduplicates header columns.
|
14
|
+
# @param row_builder [#call] will be called for each parsed row.
|
15
|
+
# @param type_map [Hash] map of column_name => type conversion to perform.
|
16
|
+
# @raise [HeaderError] super class of errors raised when there is a header error.
|
17
|
+
# @raise [MissingHeaderError] raised when header is missing (empty or nil).
|
18
|
+
# @raise [MissingHeaderColumnError] raised when header column is missing.
|
19
|
+
# @raise [RowError] super class of errors raised when there is a row error.
|
20
|
+
# @raise [EmptyRowColumnsError] raised when row columns are empty.
|
21
|
+
# @raise [InvalidRowLengthError] raised when row has more columns than header columns.
|
22
|
+
# @example
|
23
|
+
# matrix = HoneyFormat::Matrix.new([%w[name id], %w[jacob 1]])
|
24
|
+
# matrix.columns # => [:name, :id]
|
25
|
+
# matrix.rows.to_a # => [#<Row name="jacob", id="1">]
|
26
|
+
# @example With custom header converter
|
27
|
+
# converter = proc { |v| v == 'name' ? 'first_name' : v }
|
28
|
+
# matrix = HoneyFormat::Matrix.new([%w[name id]], header_converter: converter)
|
29
|
+
# matrix.columns # => [:first_name, :id]
|
30
|
+
# @example Handle errors
|
31
|
+
# begin
|
32
|
+
# matrix = HoneyFormat::Matrix.new([%w[name id]])
|
33
|
+
# rescue HoneyFormat::HeaderError => e
|
34
|
+
# puts "header error: #{e.class}, #{e.message}"
|
35
|
+
# rescue HoneyFormat::RowError => e
|
36
|
+
# puts "row error: #{e.class}, #{e.message}"
|
37
|
+
# end
|
38
|
+
# @see Header#initialize
|
39
|
+
# @see Rows#initialize
|
40
|
+
def initialize(
|
41
|
+
matrix,
|
42
|
+
header: nil,
|
43
|
+
header_converter: HoneyFormat.header_converter,
|
44
|
+
header_deduplicator: HoneyFormat.config.header_deduplicator,
|
45
|
+
row_builder: nil,
|
46
|
+
type_map: {}
|
47
|
+
)
|
48
|
+
header_row = header || matrix.shift
|
49
|
+
@header = Header.new(
|
50
|
+
header_row,
|
51
|
+
converter: header_converter,
|
52
|
+
deduplicator: header_deduplicator
|
53
|
+
)
|
54
|
+
@rows = Rows.new(matrix, columns, builder: row_builder, type_map: type_map)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Original matrix header
|
58
|
+
# @return [Header] object representing the matrix header.
|
59
|
+
def header
|
60
|
+
@header
|
61
|
+
end
|
62
|
+
|
63
|
+
# Matrix columns converted from the original Matrix header
|
64
|
+
# @return [Array<Symbol>] of column identifiers.
|
65
|
+
def columns
|
66
|
+
@header.to_a
|
67
|
+
end
|
68
|
+
|
69
|
+
# Return rows
|
70
|
+
# @return [Rows] rows.
|
71
|
+
def rows
|
72
|
+
@rows
|
73
|
+
end
|
74
|
+
|
75
|
+
# Itereate over each row
|
76
|
+
# @yield [row] The given block will be passed for every row.
|
77
|
+
# @yieldparam [Row] row in the matrix.
|
78
|
+
# @return [Enumerator] If no block is given, an enumerator object will be returned.
|
79
|
+
def each_row
|
80
|
+
return rows.each unless block_given?
|
81
|
+
|
82
|
+
rows.each { |row| yield(row) }
|
83
|
+
end
|
84
|
+
|
85
|
+
# Convert matrix to CSV-string.
|
86
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass]
|
87
|
+
# the columns to output, nil means all columns (default: nil)
|
88
|
+
# @yield [row]
|
89
|
+
# The given block will be passed for every row - return truthy if you want the
|
90
|
+
# row to be included in the output
|
91
|
+
# @yieldparam [Row] row
|
92
|
+
# @return [String] CSV-string representation.
|
93
|
+
# @example with selected columns
|
94
|
+
# matrix.to_csv(columns: [:id, :country])
|
95
|
+
# @example with selected rows
|
96
|
+
# matrix.to_csv { |row| row.country == 'Sweden' }
|
97
|
+
# @example with both selected columns and rows
|
98
|
+
# matrix.to_csv(columns: [:id, :country]) { |row| row.country == 'Sweden' }
|
99
|
+
def to_csv(columns: nil, &block)
|
100
|
+
columns = columns&.map(&:to_sym)
|
101
|
+
@header.to_csv(columns: columns) + @rows.to_csv(columns: columns, &block)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module HoneyFormat
|
2
4
|
# Default row builder
|
3
5
|
class Row < Struct
|
@@ -12,7 +14,8 @@ module HoneyFormat
|
|
12
14
|
end
|
13
15
|
|
14
16
|
# Represent row as CSV
|
15
|
-
# @param columns [Array<Symbol>, Set<Symbol>, NilClass]
|
17
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass]
|
18
|
+
# the columns to output, nil means all columns (default: nil)
|
16
19
|
# @return [String] CSV-string representation.
|
17
20
|
def to_csv(columns: nil)
|
18
21
|
attributes = members
|
@@ -30,8 +33,8 @@ module HoneyFormat
|
|
30
33
|
value = self[field]
|
31
34
|
value = "\"#{value}\"" if value.is_a?(String)
|
32
35
|
|
33
|
-
[field, value].join(
|
34
|
-
end.join(
|
36
|
+
[field, value].join('=')
|
37
|
+
end.join(', ')
|
35
38
|
|
36
39
|
"#<Row #{attributes}>"
|
37
40
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module HoneyFormat
|
4
4
|
# Holds data for a single row.
|
@@ -20,7 +20,7 @@ module HoneyFormat
|
|
20
20
|
end
|
21
21
|
|
22
22
|
@type_map = type_map
|
23
|
-
@converter = HoneyFormat.
|
23
|
+
@converter = HoneyFormat.converter_registry
|
24
24
|
|
25
25
|
@row_klass = Row.new(*columns)
|
26
26
|
@builder = builder
|
@@ -30,7 +30,8 @@ module HoneyFormat
|
|
30
30
|
# Returns an object representing the row.
|
31
31
|
# @return [Row, Object] a new instance of built row.
|
32
32
|
# @param row [Array] the row array.
|
33
|
-
# @raise [InvalidRowLengthError]
|
33
|
+
# @raise [InvalidRowLengthError]
|
34
|
+
# raised when there are more row elements longer than columns
|
34
35
|
# @example Build new row
|
35
36
|
# r = RowBuilder.new([:id])
|
36
37
|
# r.build(['1']).id #=> '1'
|
@@ -71,7 +72,7 @@ module HoneyFormat
|
|
71
72
|
"Row length #{row.length}",
|
72
73
|
"column length #{@columns.length}",
|
73
74
|
"row: #{row.inspect}",
|
74
|
-
"orignal message: '#{e.message}'"
|
75
|
+
"orignal message: '#{e.message}'",
|
75
76
|
].join(', ')
|
76
77
|
raise(Errors::InvalidRowLengthError, err_msg)
|
77
78
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'set'
|
2
|
-
require 'honey_format/row_builder'
|
3
4
|
|
4
5
|
module HoneyFormat
|
5
6
|
# Represents rows.
|
@@ -46,8 +47,10 @@ module HoneyFormat
|
|
46
47
|
end
|
47
48
|
alias_method :size, :length
|
48
49
|
|
49
|
-
# @param columns [Array<Symbol>, Set<Symbol>, NilClass]
|
50
|
-
#
|
50
|
+
# @param columns [Array<Symbol>, Set<Symbol>, NilClass]
|
51
|
+
# the columns to output, nil means all columns (default: nil)
|
52
|
+
# @yield [row]
|
53
|
+
# each row - return truthy if you want the row to be included in the output
|
51
54
|
# @yieldparam [Row] row
|
52
55
|
# @return [String] CSV-string representation.
|
53
56
|
# @example with selected columns
|
@@ -61,7 +64,7 @@ module HoneyFormat
|
|
61
64
|
columns = Set.new(columns.map(&:to_sym)) if columns
|
62
65
|
csv_rows = []
|
63
66
|
each do |row|
|
64
|
-
if !block ||
|
67
|
+
if !block || yield(row)
|
65
68
|
csv_rows << row.to_csv(columns: columns)
|
66
69
|
end
|
67
70
|
end
|
data/lib/honey_format/matrix.rb
CHANGED
@@ -1,90 +1,7 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'honey_format/
|
4
|
-
require 'honey_format/
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class Matrix
|
9
|
-
# Instantiate CSV.
|
10
|
-
# @return [CSV] a new instance of Matrix.
|
11
|
-
# @param [Array<Array<String, nil>>] matrix
|
12
|
-
# @param [Array<String>] header optional argument that represents header, required if the matrix lacks a header row.
|
13
|
-
# @param [#call] header_converter converts header columns.
|
14
|
-
# @param [#call] row_builder will be called for each parsed row.
|
15
|
-
# @param type_map [Hash] map of column_name => type conversion to perform.
|
16
|
-
# @raise [HeaderError] super class of errors raised when there is a header error.
|
17
|
-
# @raise [MissingHeaderError] raised when header is missing (empty or nil).
|
18
|
-
# @raise [MissingHeaderColumnError] raised when header column is missing.
|
19
|
-
# @raise [RowError] super class of errors raised when there is a row error.
|
20
|
-
# @raise [EmptyRowColumnsError] raised when row columns are empty.
|
21
|
-
# @raise [InvalidRowLengthError] raised when row has more columns than header columns.
|
22
|
-
# @example
|
23
|
-
# matrix = HoneyFormat::Matrix.new([%w[name id]])
|
24
|
-
# @example With custom header converter
|
25
|
-
# converter = proc { |v| v == 'name' ? 'first_name' : v }
|
26
|
-
# matrix = HoneyFormat::Matrix.new([%w[name id]], header_converter: converter)
|
27
|
-
# matrix.columns # => [:first_name, :id]
|
28
|
-
# @example Handle errors
|
29
|
-
# begin
|
30
|
-
# matrix = HoneyFormat::Matrix.new([%w[name id]])
|
31
|
-
# rescue HoneyFormat::HeaderError => e
|
32
|
-
# puts "header error: #{e.class}, #{e.message}"
|
33
|
-
# rescue HoneyFormat::RowError => e
|
34
|
-
# puts "row error: #{e.class}, #{e.message}"
|
35
|
-
# end
|
36
|
-
def initialize(
|
37
|
-
matrix,
|
38
|
-
header: nil,
|
39
|
-
header_converter: HoneyFormat.header_converter,
|
40
|
-
row_builder: nil,
|
41
|
-
type_map: {}
|
42
|
-
)
|
43
|
-
header_row = header || matrix.shift
|
44
|
-
@header = Header.new(header_row, converter: header_converter)
|
45
|
-
@rows = Rows.new(matrix, columns, builder: row_builder, type_map: type_map)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Original CSV header
|
49
|
-
# @return [Header] object representing the CSV header.
|
50
|
-
def header
|
51
|
-
@header
|
52
|
-
end
|
53
|
-
|
54
|
-
# CSV columns converted from the original CSV header
|
55
|
-
# @return [Array<Symbol>] of column identifiers.
|
56
|
-
def columns
|
57
|
-
@header.to_a
|
58
|
-
end
|
59
|
-
|
60
|
-
# @return [Rows] of rows.
|
61
|
-
def rows
|
62
|
-
@rows
|
63
|
-
end
|
64
|
-
|
65
|
-
# @yield [row] The given block will be passed for every row.
|
66
|
-
# @yieldparam [Row] row in the CSV.
|
67
|
-
# @return [Enumerator] If no block is given, an enumerator object will be returned.
|
68
|
-
def each_row
|
69
|
-
return rows.each unless block_given?
|
70
|
-
|
71
|
-
rows.each { |row| yield(row) }
|
72
|
-
end
|
73
|
-
|
74
|
-
# Convert matrix to CSV-string.
|
75
|
-
# @param columns [Array<Symbol>, Set<Symbol>, NilClass] the columns to output, nil means all columns (default: nil)
|
76
|
-
# @yield [row] The given block will be passed for every row - return truthy if you want the row to be included in the output
|
77
|
-
# @yieldparam [Row] row
|
78
|
-
# @return [String] CSV-string representation.
|
79
|
-
# @example with selected columns
|
80
|
-
# matrix.to_csv(columns: [:id, :country])
|
81
|
-
# @example with selected rows
|
82
|
-
# matrix.to_csv { |row| row.country == 'Sweden' }
|
83
|
-
# @example with both selected columns and rows
|
84
|
-
# matrix.to_csv(columns: [:id, :country]) { |row| row.country == 'Sweden' }
|
85
|
-
def to_csv(columns: nil, &block)
|
86
|
-
columns = columns&.map(&:to_sym)
|
87
|
-
@header.to_csv(columns: columns) + @rows.to_csv(columns: columns, &block)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
3
|
+
require 'honey_format/matrix/row_builder'
|
4
|
+
require 'honey_format/matrix/rows'
|
5
|
+
require 'honey_format/matrix/row'
|
6
|
+
require 'honey_format/matrix/header'
|
7
|
+
require 'honey_format/matrix/matrix'
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HoneyFormat
|
4
|
+
# Registry that holds value callers
|
5
|
+
class Registry
|
6
|
+
# Instantiate a caller registry
|
7
|
+
# @param [Hash] default hash of defaults
|
8
|
+
def initialize(default = {})
|
9
|
+
@callers = nil
|
10
|
+
@default = default.dup
|
11
|
+
reset!
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns list of registered types
|
15
|
+
# @return [Array<Symbol>] list of registered types
|
16
|
+
def types
|
17
|
+
@callers.keys
|
18
|
+
end
|
19
|
+
|
20
|
+
# Register a caller
|
21
|
+
# @param [Symbol, String] type the name of the type
|
22
|
+
# @param [#call] caller that responds to #call
|
23
|
+
# @return [Registry] returns self
|
24
|
+
# @raise [TypeExistsError] if type is already registered
|
25
|
+
def register(type, caller)
|
26
|
+
self[type] = caller
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Unregister a caller
|
31
|
+
# @param [Symbol, String] type the name of the type
|
32
|
+
# @return [Registry] returns self
|
33
|
+
# @raise [UnknownTypeError] if type is already registered
|
34
|
+
def unregister(type)
|
35
|
+
unknown_type_error!(type) unless type?(type)
|
36
|
+
@callers.delete(to_key(type))
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
# Call value type
|
41
|
+
# @param [Symbol, String] type the name of the type
|
42
|
+
# @param [Object] value to be converted
|
43
|
+
def call(value, type)
|
44
|
+
self[type].call(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Register a caller
|
48
|
+
# @param [Symbol, String] type the name of the type
|
49
|
+
# @param [#call] caller that responds to #call
|
50
|
+
# @return [Object] returns the caller
|
51
|
+
# @raise [TypeExistsError] if type is already registered
|
52
|
+
def []=(type, caller)
|
53
|
+
type = to_key(type)
|
54
|
+
|
55
|
+
if type?(type)
|
56
|
+
raise(Errors::TypeExistsError, "type '#{type}' already exists")
|
57
|
+
end
|
58
|
+
|
59
|
+
@callers[type] = caller
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the given type or raises error if type doesn't exist
|
63
|
+
# @param [Symbol, String] type the name of the type
|
64
|
+
# @return [Object] returns the caller
|
65
|
+
# @raise [UnknownTypeError] if type does not exist
|
66
|
+
def [](type)
|
67
|
+
@callers.fetch(to_key(type)) { unknown_type_error!(type) }
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns true if the type exists, false otherwise
|
71
|
+
# @param [Symbol, String] type the name of the type
|
72
|
+
# @return [true, false] true if type exists, false otherwise
|
73
|
+
def type?(type)
|
74
|
+
return false unless keyable?(type)
|
75
|
+
@callers.key?(to_key(type))
|
76
|
+
end
|
77
|
+
|
78
|
+
# Resets the caller registry to its default configuration
|
79
|
+
# @return [Registry] returns the caller registry
|
80
|
+
def reset!
|
81
|
+
@callers = @default.dup
|
82
|
+
self
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def keyable?(key)
|
88
|
+
key.respond_to?(:to_sym)
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_key(key)
|
92
|
+
key.to_sym
|
93
|
+
end
|
94
|
+
|
95
|
+
def unknown_type_error!(type)
|
96
|
+
raise(Errors::UnknownTypeError, "unknown type '#{type}'")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/honey_format/version.rb
CHANGED
data/lib/honey_format.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'honey_format/version'
|
2
4
|
require 'honey_format/configuration'
|
3
5
|
require 'honey_format/errors'
|
4
|
-
require 'honey_format/
|
6
|
+
require 'honey_format/registry'
|
7
|
+
require 'honey_format/converters/converters'
|
5
8
|
require 'honey_format/csv'
|
6
9
|
|
7
|
-
|
8
10
|
# Main module for HoneyFormat
|
9
11
|
module HoneyFormat
|
10
12
|
# CSV alias
|
@@ -32,9 +34,15 @@ module HoneyFormat
|
|
32
34
|
config.header_converter
|
33
35
|
end
|
34
36
|
|
35
|
-
# Returns the configured
|
36
|
-
# @return [
|
37
|
-
def self.
|
38
|
-
config.
|
37
|
+
# Returns the configured converter registry
|
38
|
+
# @return [Registry] the current converter registry
|
39
|
+
def self.converter_registry
|
40
|
+
config.converter_registry
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the configured deduplicator registry
|
44
|
+
# @return [Registry] the current deduplicator registry
|
45
|
+
def self.header_deduplicator_registry
|
46
|
+
config.header_deduplicator_registry
|
39
47
|
end
|
40
48
|
end
|
metadata
CHANGED
@@ -1,45 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honey_format
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Burenstam
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: benchmark-ips
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '10
|
33
|
+
version: '1.10'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '10
|
40
|
+
version: '1.10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: byebug
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,21 +53,21 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
61
|
+
version: '10.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
68
|
+
version: '10.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -105,7 +105,10 @@ extensions: []
|
|
105
105
|
extra_rdoc_files: []
|
106
106
|
files:
|
107
107
|
- ".gitignore"
|
108
|
+
- ".hound.yml"
|
108
109
|
- ".rspec"
|
110
|
+
- ".rubocop.yml"
|
111
|
+
- ".ruby-style-guide.yml"
|
109
112
|
- ".travis.yml"
|
110
113
|
- CHANGELOG.md
|
111
114
|
- CODE_OF_CONDUCT.md
|
@@ -123,15 +126,22 @@ files:
|
|
123
126
|
- lib/honey_format/cli/cli.rb
|
124
127
|
- lib/honey_format/cli/result_writer.rb
|
125
128
|
- lib/honey_format/configuration.rb
|
129
|
+
- lib/honey_format/converters/convert_boolean.rb
|
130
|
+
- lib/honey_format/converters/convert_date_and_time.rb
|
131
|
+
- lib/honey_format/converters/convert_number.rb
|
132
|
+
- lib/honey_format/converters/convert_string.rb
|
133
|
+
- lib/honey_format/converters/converters.rb
|
134
|
+
- lib/honey_format/converters/header_column_converter.rb
|
126
135
|
- lib/honey_format/csv.rb
|
127
136
|
- lib/honey_format/errors.rb
|
128
|
-
- lib/honey_format/
|
129
|
-
- lib/honey_format/header_column_converter.rb
|
137
|
+
- lib/honey_format/helpers/helpers.rb
|
130
138
|
- lib/honey_format/matrix.rb
|
131
|
-
- lib/honey_format/
|
132
|
-
- lib/honey_format/
|
133
|
-
- lib/honey_format/
|
134
|
-
- lib/honey_format/
|
139
|
+
- lib/honey_format/matrix/header.rb
|
140
|
+
- lib/honey_format/matrix/matrix.rb
|
141
|
+
- lib/honey_format/matrix/row.rb
|
142
|
+
- lib/honey_format/matrix/row_builder.rb
|
143
|
+
- lib/honey_format/matrix/rows.rb
|
144
|
+
- lib/honey_format/registry.rb
|
135
145
|
- lib/honey_format/version.rb
|
136
146
|
homepage: https://github.com/buren/honey_format
|
137
147
|
licenses:
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module HoneyFormat
|
2
|
-
# Header column converter
|
3
|
-
module HeaderColumnConverter
|
4
|
-
# Replace map
|
5
|
-
REPLACE_MAP = [
|
6
|
-
[/ \(/, '('],
|
7
|
-
[/ \[/, '['],
|
8
|
-
[/ \{/, '{'],
|
9
|
-
[/\) /, ')'],
|
10
|
-
[/\] /, ']'],
|
11
|
-
[/\} /, '}'],
|
12
|
-
[/ /, '_'],
|
13
|
-
[/-/, '_']
|
14
|
-
].map { |array| array.freeze }.freeze
|
15
|
-
|
16
|
-
# Returns converted value and mutates the argument.
|
17
|
-
# @return [Symbol] the cleaned header column.
|
18
|
-
# @param [String] column the string to be cleaned.
|
19
|
-
# @param [Integer] index the column index.
|
20
|
-
# @example Convert simple header
|
21
|
-
# HeaderColumnConverter.call(" User name ") #=> "user_name"
|
22
|
-
# @example Convert complex header
|
23
|
-
# HeaderColumnConverter.call(" First name (user)") #=> :'first_name(user)'
|
24
|
-
def self.call(column, index = nil)
|
25
|
-
if column.nil? || column.empty?
|
26
|
-
raise(ArgumentError, "column and column index can't be blank/nil") unless index
|
27
|
-
return :"column#{index}"
|
28
|
-
end
|
29
|
-
|
30
|
-
column = column.dup
|
31
|
-
column.strip!
|
32
|
-
column.downcase!
|
33
|
-
REPLACE_MAP.each do |data|
|
34
|
-
from, to = data
|
35
|
-
column.gsub!(from, to)
|
36
|
-
end
|
37
|
-
column.to_sym
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|