honey_format 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
 - data/README.md +12 -8
 - data/lib/honey_format/csv.rb +4 -2
 - data/lib/honey_format/row.rb +3 -2
 - data/lib/honey_format/rows.rb +5 -5
 - data/lib/honey_format/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a39f797b080a1d5ff641f7f477cdfe2d181cf599e0ab3e05a3e1d69e21ebb94b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2701ce31bf31e19229d11d6ff6f817de24c9d24165d27904c30cd8bc7f6b9752
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: cedc41b03b37daa7199cd11d6f2b4fd72599ae31adac8c7379c3dd396f364215cf5eff2376d09c975482ae44491aa74d7042e3c90b4bfb36ddc156a51b32c372
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 45ec386f47253fd4a1e5c6e86cd99f7e381abe93be65fb4fc766fb2b3fdc29f84c4037209af68cf75ad1fbc10621d539b04976bc8e579eac9398fc8251755b2e
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -43,31 +43,35 @@ csv = HoneyFormat::CSV.new(csv_string) 
     | 
|
| 
       43 
43 
     | 
    
         
             
            csv.header # => ["Id", "Username"]
         
     | 
| 
       44 
44 
     | 
    
         
             
            csv.column # => [:id, :username]
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
            include HoneyFormat
         
     | 
| 
       47 
     | 
    
         
            -
            # If included you can use the HoneyCSV shorthand
         
     | 
| 
       48 
     | 
    
         
            -
            csv = HoneyCSV.new(csv_string)
         
     | 
| 
       49 
46 
     | 
    
         
             
            rows = csv.rows # => [#<struct id="1", username="buren">]
         
     | 
| 
       50 
47 
     | 
    
         
             
            user = rows.first
         
     | 
| 
       51 
48 
     | 
    
         
             
            user.id         # => "1"
         
     | 
| 
       52 
49 
     | 
    
         
             
            user.username   # => "buren"
         
     | 
| 
       53 
50 
     | 
    
         
             
            ```
         
     | 
| 
       54 
51 
     | 
    
         | 
| 
      
 52 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 53 
     | 
    
         
            +
            csv_string = "Id, Username\n 1, buren"
         
     | 
| 
      
 54 
     | 
    
         
            +
            uppercase_strings = ->(o) { o.is_a?(String) ? o.upcase : o  }
         
     | 
| 
      
 55 
     | 
    
         
            +
            csv = HoneyFormat::CSV.new(csv_string, row_builder: uppercase_strings)
         
     | 
| 
      
 56 
     | 
    
         
            +
            csv.rows # => [#<struct id="1", username="BUREN">]
         
     | 
| 
      
 57 
     | 
    
         
            +
            ```
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
       55 
59 
     | 
    
         
             
            Validate CSV header
         
     | 
| 
       56 
60 
     | 
    
         
             
            ```ruby
         
     | 
| 
       57 
61 
     | 
    
         
             
            csv_string = "Id, Username\n 1, buren"
         
     | 
| 
       58 
62 
     | 
    
         
             
            # Invalid
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
      
 63 
     | 
    
         
            +
            HoneyFormat::CSV.new(csv_string, valid_columns: [:something, :username])
         
     | 
| 
       60 
64 
     | 
    
         
             
            # => #<HoneyFormat::MissingCSVHeaderColumnError: key :id ("Id") not in [:something, :username]>
         
     | 
| 
       61 
65 
     | 
    
         | 
| 
       62 
66 
     | 
    
         
             
            # Valid
         
     | 
| 
       63 
     | 
    
         
            -
            csv =  
     | 
| 
      
 67 
     | 
    
         
            +
            csv = HoneyFormat::CSV.new(csv_string, valid_columns: [:id, :username])
         
     | 
| 
       64 
68 
     | 
    
         
             
            csv.rows.first.username # => "buren"
         
     | 
| 
       65 
69 
     | 
    
         
             
            ```
         
     | 
| 
       66 
70 
     | 
    
         | 
| 
       67 
71 
     | 
    
         
             
            Define header
         
     | 
| 
       68 
72 
     | 
    
         
             
            ```ruby
         
     | 
| 
       69 
73 
     | 
    
         
             
            csv_string = "1, buren"
         
     | 
| 
       70 
     | 
    
         
            -
            csv =  
     | 
| 
      
 74 
     | 
    
         
            +
            csv = HoneyFormat::CSV.new(csv_string, header: ['Id', 'Username'])
         
     | 
| 
       71 
75 
     | 
    
         
             
            csv.rows.first.username # => "buren"
         
     | 
| 
       72 
76 
     | 
    
         
             
            ```
         
     | 
| 
       73 
77 
     | 
    
         | 
| 
         @@ -75,13 +79,13 @@ If your header contains special chars and/or chars that can't be part of Ruby me 
     | 
|
| 
       75 
79 
     | 
    
         
             
            things get a little awkward..
         
     | 
| 
       76 
80 
     | 
    
         
             
            ```ruby
         
     | 
| 
       77 
81 
     | 
    
         
             
            csv_string = "ÅÄÖ\nSwedish characters"
         
     | 
| 
       78 
     | 
    
         
            -
            user =  
     | 
| 
      
 82 
     | 
    
         
            +
            user = HoneyFormat::CSV.new(csv_string).rows.first
         
     | 
| 
       79 
83 
     | 
    
         
             
            # Note that these chars aren't "downcased",
         
     | 
| 
       80 
84 
     | 
    
         
             
            # "ÅÄÖ".downcase # => "ÅÄÖ"
         
     | 
| 
       81 
85 
     | 
    
         
             
            user.ÅÄÖ # => "Swedish characters"
         
     | 
| 
       82 
86 
     | 
    
         | 
| 
       83 
87 
     | 
    
         
             
            csv_string = "First-Name\nJacob"
         
     | 
| 
       84 
     | 
    
         
            -
            user =  
     | 
| 
      
 88 
     | 
    
         
            +
            user = HoneyFormat::CSV.new(csv_string).rows.first
         
     | 
| 
       85 
89 
     | 
    
         
             
            user.public_send(:"first-name") # => "Jacob"
         
     | 
| 
       86 
90 
     | 
    
         
             
            ```
         
     | 
| 
       87 
91 
     | 
    
         | 
    
        data/lib/honey_format/csv.rb
    CHANGED
    
    | 
         @@ -11,13 +11,15 @@ module HoneyFormat 
     | 
|
| 
       11 
11 
     | 
    
         
             
                # @param [String] csv string.
         
     | 
| 
       12 
12 
     | 
    
         
             
                # @param [Array] valid_columns valid array of symbols representing valid columns.
         
     | 
| 
       13 
13 
     | 
    
         
             
                # @param [Array] header optional argument for CSV header
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @param [#call] row_builder will be called for each parsed row
         
     | 
| 
       14 
15 
     | 
    
         
             
                # @raise [MissingCSVHeaderError] raised when header is missing (empty or nil).
         
     | 
| 
       15 
16 
     | 
    
         
             
                # @raise [MissingCSVHeaderColumnError] raised when header column is missing.
         
     | 
| 
       16 
17 
     | 
    
         
             
                # @raise [UnknownCSVHeaderColumnError] raised when column is not in valid list.
         
     | 
| 
       17 
     | 
    
         
            -
                def initialize(csv, delimiter: ',', header: nil, valid_columns: :all, header_converter: ConvertHeaderValue)
         
     | 
| 
      
 18 
     | 
    
         
            +
                def initialize(csv, delimiter: ',', header: nil, valid_columns: :all, header_converter: ConvertHeaderValue, row_builder: nil)
         
     | 
| 
       18 
19 
     | 
    
         
             
                  csv = ::CSV.parse(csv, col_sep: delimiter)
         
     | 
| 
       19 
20 
     | 
    
         
             
                  @csv_body = csv
         
     | 
| 
       20 
21 
     | 
    
         
             
                  @header = Header.new(header || csv.shift, valid: valid_columns, converter: header_converter)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  @row_builder = row_builder
         
     | 
| 
       21 
23 
     | 
    
         
             
                end
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
25 
     | 
    
         
             
                # @return [Array] of strings for sanitized header.
         
     | 
| 
         @@ -33,7 +35,7 @@ module HoneyFormat 
     | 
|
| 
       33 
35 
     | 
    
         
             
                # @return [Array] of rows.
         
     | 
| 
       34 
36 
     | 
    
         
             
                # @raise [InvalidRowLengthError] raised when there are more row elements longer than columns
         
     | 
| 
       35 
37 
     | 
    
         
             
                def rows
         
     | 
| 
       36 
     | 
    
         
            -
                  @rows ||= Rows.new(@csv_body, columns).to_a
         
     | 
| 
      
 38 
     | 
    
         
            +
                  @rows ||= Rows.new(@csv_body, columns, builder: @row_builder).to_a
         
     | 
| 
       37 
39 
     | 
    
         
             
                end
         
     | 
| 
       38 
40 
     | 
    
         | 
| 
       39 
41 
     | 
    
         
             
                # @yield [row] block to receive the row.
         
     | 
    
        data/lib/honey_format/row.rb
    CHANGED
    
    | 
         @@ -7,10 +7,11 @@ module HoneyFormat 
     | 
|
| 
       7 
7 
     | 
    
         
             
                # @raise [EmptyColumnsError] raised when there are no columns.
         
     | 
| 
       8 
8 
     | 
    
         
             
                # @example Create new row
         
     | 
| 
       9 
9 
     | 
    
         
             
                #     Row.new!([:id])
         
     | 
| 
       10 
     | 
    
         
            -
                def initialize(columns)
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(columns, builder: nil)
         
     | 
| 
       11 
11 
     | 
    
         
             
                  validate_columns!(columns)
         
     | 
| 
       12 
12 
     | 
    
         
             
                  @klass = Struct.new(*columns)
         
     | 
| 
       13 
13 
     | 
    
         
             
                  @columns = columns
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @builder = builder
         
     | 
| 
       14 
15 
     | 
    
         
             
                end
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
                # Returns a Struct.
         
     | 
| 
         @@ -21,7 +22,7 @@ module HoneyFormat 
     | 
|
| 
       21 
22 
     | 
    
         
             
                #     r = Row.new!([:id])
         
     | 
| 
       22 
23 
     | 
    
         
             
                #     r.build(['1']).id #=> '1'
         
     | 
| 
       23 
24 
     | 
    
         
             
                def build(row)
         
     | 
| 
       24 
     | 
    
         
            -
                  @klass.new(*row)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @klass.new(*row).tap { |o| @builder && @builder.call(o) }
         
     | 
| 
       25 
26 
     | 
    
         
             
                rescue ArgumentError, 'struct size differs'
         
     | 
| 
       26 
27 
     | 
    
         
             
                  fail_for_struct_size_diff!(row)
         
     | 
| 
       27 
28 
     | 
    
         
             
                end
         
     | 
    
        data/lib/honey_format/rows.rb
    CHANGED
    
    | 
         @@ -7,8 +7,8 @@ module HoneyFormat 
     | 
|
| 
       7 
7 
     | 
    
         
             
                # @return [Rows] new instance of Rows.
         
     | 
| 
       8 
8 
     | 
    
         
             
                # @param [Array] rows the array of rows.
         
     | 
| 
       9 
9 
     | 
    
         
             
                # @param [Array] columns the array of column symbols.
         
     | 
| 
       10 
     | 
    
         
            -
                def initialize(rows, columns)
         
     | 
| 
       11 
     | 
    
         
            -
                  @rows = prepare_rows(Row.new(columns), rows)
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(rows, columns, builder: nil)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @rows = prepare_rows(Row.new(columns, builder: builder), rows)
         
     | 
| 
       12 
12 
     | 
    
         
             
                end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                # Returns rows as array.
         
     | 
| 
         @@ -22,9 +22,9 @@ module HoneyFormat 
     | 
|
| 
       22 
22 
     | 
    
         
             
                def prepare_rows(builder, rows)
         
     | 
| 
       23 
23 
     | 
    
         
             
                  built_rows = []
         
     | 
| 
       24 
24 
     | 
    
         
             
                  rows.each do |row|
         
     | 
| 
       25 
     | 
    
         
            -
                     
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
      
 25 
     | 
    
         
            +
                    # ignore empty rows - the Ruby CSV library can return empty lines as [nil]
         
     | 
| 
      
 26 
     | 
    
         
            +
                    next if row.empty? || row.nil? || row == [nil]
         
     | 
| 
      
 27 
     | 
    
         
            +
                    built_rows << builder.build(Sanitize.array!(row))
         
     | 
| 
       28 
28 
     | 
    
         
             
                  end
         
     | 
| 
       29 
29 
     | 
    
         
             
                  built_rows
         
     | 
| 
       30 
30 
     | 
    
         
             
                end
         
     | 
    
        data/lib/honey_format/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: honey_format
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.4.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Jacob Burenstam
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2018- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2018-05-03 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     |