spreadbase 0.2.0 → 0.2.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 +4 -4
- data/.github/workflows/ci.yml +25 -0
- data/Gemfile +4 -0
- data/README.md +1 -3
- data/lib/spreadbase/codecs/open_document_12_modules/decoding.rb +34 -9
- data/lib/spreadbase/version.rb +1 -1
- data/spec/codecs/open_document_12_spec.rb +89 -3
- data/spec/elements/document_spec.rb +23 -0
- data/spec/fixtures/test.ods +0 -0
- data/spreadbase.gemspec +1 -1
- metadata +5 -4
- data/.travis.yml +0 -8
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c697a87553389d94f16ea79fbcb0552ddea9dd7e18b13404078cca8b0d13b32d
         | 
| 4 | 
            +
              data.tar.gz: 05b540a328ee21d7263b4f3b619dd6799641d4ca04ef2d99b694ec6d75b243a5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e94b944ff92895cb2f090c7c8b4ca2b0ce84eee4ffd2c9cb855047f430992ed60bfa6dbf39f336414887a4f12b02c3ce1dc0857ae7293e071514a9360c7f2334
         | 
| 7 | 
            +
              data.tar.gz: 32c1bf438e40c8a5b4a321160f3931c3afae5fe1f455946fe2912c1ea26c2f423ba57af0b0cb06b92f7470db12656bc047180eabed82416664bd6e0d176884c1
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            name: CI
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on: [push, pull_request]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            jobs:
         | 
| 6 | 
            +
              rspec:
         | 
| 7 | 
            +
                runs-on: ubuntu-latest
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                strategy:
         | 
| 10 | 
            +
                  matrix:
         | 
| 11 | 
            +
                    ruby: ['3.0', '2.7', '2.6', '2.5', '2.4', '2.3']
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                steps:
         | 
| 14 | 
            +
                  - name: Checkout spreadbase repository
         | 
| 15 | 
            +
                    uses: actions/checkout@v2
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  - name: Setup Ruby
         | 
| 18 | 
            +
                    uses: ruby/setup-ruby@v1
         | 
| 19 | 
            +
                    with:
         | 
| 20 | 
            +
                      ruby-version: ${{ matrix.ruby }}
         | 
| 21 | 
            +
                      bundler-cache: true
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  - name: Run RSpec
         | 
| 24 | 
            +
                    run: |
         | 
| 25 | 
            +
                      bundle exec rake spec
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            [](https://github.com/saveriomiroddi/spreadbase/actions/workflows/ci.yml)
         | 
| 2 2 |  | 
| 3 3 | 
             
            SpreadBase!!
         | 
| 4 4 | 
             
            ============
         | 
| @@ -154,5 +154,3 @@ Roadmap/Todo | |
| 154 154 | 
             
            ------------
         | 
| 155 155 |  | 
| 156 156 | 
             
            https://github.com/saveriomiroddi/spreadbase/wiki/Todo-%28roadmap%29
         | 
| 157 | 
            -
             | 
| 158 | 
            -
            [BS img]: https://travis-ci.org/saveriomiroddi/spreadbase.svg?branch=master
         | 
| @@ -59,7 +59,7 @@ module SpreadBase # :nodoc: | |
| 59 59 | 
             
                      # A single column/row can represent multiple columns (table:number-(columns|rows)-repeated)
         | 
| 60 60 | 
             
                      #
         | 
| 61 61 | 
             
                      table.column_width_styles = column_nodes.inject([]) { | current_styles, node | current_styles + decode_column_width_style(node) }
         | 
| 62 | 
            -
                      table.data                = row_nodes | 
| 62 | 
            +
                      table.data                = decode_row_nodes(row_nodes, options)
         | 
| 63 63 |  | 
| 64 64 | 
             
                      table
         | 
| 65 65 | 
             
                    end
         | 
| @@ -73,23 +73,48 @@ module SpreadBase # :nodoc: | |
| 73 73 | 
             
                      make_array_from_repetitions(style_name, repetitions)
         | 
| 74 74 | 
             
                    end
         | 
| 75 75 |  | 
| 76 | 
            +
                    def decode_row_nodes(row_nodes, options)
         | 
| 77 | 
            +
                      rows = []
         | 
| 78 | 
            +
                      row_nodes.inject(0) do |size, node|
         | 
| 79 | 
            +
                        row, repetitions = decode_row_node(node, options)
         | 
| 80 | 
            +
                        row.empty? || append_row(rows, size, row, repetitions)
         | 
| 81 | 
            +
                        size + repetitions
         | 
| 82 | 
            +
                      end
         | 
| 83 | 
            +
                      rows
         | 
| 84 | 
            +
                    end
         | 
| 85 | 
            +
             | 
| 76 86 | 
             
                    def decode_row_node(row_node, options)
         | 
| 77 87 | 
             
                      repetitions = (row_node.attributes['table:number-rows-repeated'] || '1').to_i
         | 
| 78 88 | 
             
                      cell_nodes  = row_node.elements.to_a('table:table-cell')
         | 
| 79 89 |  | 
| 80 | 
            -
                       | 
| 81 | 
            -
             | 
| 82 | 
            -
                      values = cell_nodes.map { | node | decode_cell_node(node, options) }.flatten
         | 
| 90 | 
            +
                      [decode_cell_nodes(cell_nodes, options), repetitions]
         | 
| 91 | 
            +
                    end
         | 
| 83 92 |  | 
| 84 | 
            -
             | 
| 93 | 
            +
                    def append_row(rows, size, row, repetitions)
         | 
| 94 | 
            +
                      (size - rows.size).times { rows << [] }
         | 
| 95 | 
            +
                      rows.concat(make_array_from_repetitions(row, repetitions))
         | 
| 85 96 | 
             
                    end
         | 
| 86 97 |  | 
| 87 | 
            -
                    def  | 
| 88 | 
            -
                       | 
| 98 | 
            +
                    def decode_cell_nodes(cell_nodes, options)
         | 
| 99 | 
            +
                      cells = []
         | 
| 100 | 
            +
                      cell_nodes.inject(0) do |size, node|
         | 
| 101 | 
            +
                        cell, repetitions = decode_cell_node(node, options)
         | 
| 102 | 
            +
                        cell.nil? || append_cell(cells, size, cell, repetitions)
         | 
| 103 | 
            +
                        size + repetitions
         | 
| 104 | 
            +
                      end
         | 
| 105 | 
            +
                      cells
         | 
| 106 | 
            +
                    end
         | 
| 89 107 |  | 
| 90 | 
            -
             | 
| 108 | 
            +
                    def decode_cell_node(cell_node, options)
         | 
| 109 | 
            +
                      [
         | 
| 110 | 
            +
                        decode_cell_value(cell_node, options),
         | 
| 111 | 
            +
                        (cell_node.attributes['table:number-columns-repeated'] || '1').to_i
         | 
| 112 | 
            +
                      ]
         | 
| 113 | 
            +
                    end
         | 
| 91 114 |  | 
| 92 | 
            -
             | 
| 115 | 
            +
                    def append_cell(cells, size, cell, repetitions)
         | 
| 116 | 
            +
                      cells[size - 1] = nil if size != cells.size
         | 
| 117 | 
            +
                      cells.concat(make_array_from_repetitions(cell, repetitions))
         | 
| 93 118 | 
             
                    end
         | 
| 94 119 |  | 
| 95 120 | 
             
                    def decode_cell_value(cell_node, options)
         | 
    
        data/lib/spreadbase/version.rb
    CHANGED
    
    
| @@ -15,7 +15,7 @@ describe SpreadBase::Codecs::OpenDocument12 do | |
| 15 15 | 
             
                  'abc', [
         | 
| 16 16 | 
             
                    [1,      1.1,        T_BIGDECIMAL],
         | 
| 17 17 | 
             
                    [T_DATE, T_DATETIME, T_TIME],
         | 
| 18 | 
            -
                    [nil,    'a' | 
| 18 | 
            +
                    [nil,    nil,        'a']
         | 
| 19 19 | 
             
                  ]
         | 
| 20 20 | 
             
                )
         | 
| 21 21 |  | 
| @@ -56,8 +56,8 @@ describe SpreadBase::Codecs::OpenDocument12 do | |
| 56 56 |  | 
| 57 57 | 
             
                    assert_size(row_3, 3) do | value_1, value_2, value_3 |
         | 
| 58 58 | 
             
                      expect(value_1).to eq(nil)
         | 
| 59 | 
            -
                      expect(value_2).to eq( | 
| 60 | 
            -
                      expect(value_3).to eq( | 
| 59 | 
            +
                      expect(value_2).to eq(nil)
         | 
| 60 | 
            +
                      expect(value_3).to eq('a')
         | 
| 61 61 | 
             
                    end
         | 
| 62 62 |  | 
| 63 63 | 
             
                  end
         | 
| @@ -112,4 +112,90 @@ describe SpreadBase::Codecs::OpenDocument12 do | |
| 112 112 | 
             
                expect(value).to eq(T_BIGDECIMAL)
         | 
| 113 113 | 
             
              end
         | 
| 114 114 |  | 
| 115 | 
            +
              context "when cells at the end of the row are empty" do
         | 
| 116 | 
            +
                let(:document_archive) do
         | 
| 117 | 
            +
                  document = SpreadBase::Document.new
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                  document.tables << SpreadBase::Table.new(
         | 
| 120 | 
            +
                    'abc', [
         | 
| 121 | 
            +
                      [nil],
         | 
| 122 | 
            +
                      [nil, nil],
         | 
| 123 | 
            +
                      [1  , nil],
         | 
| 124 | 
            +
                      [nil, 1  , nil]
         | 
| 125 | 
            +
                    ]
         | 
| 126 | 
            +
                  )
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(document)
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                it "should drop such cells" do
         | 
| 132 | 
            +
                  document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(document_archive)
         | 
| 133 | 
            +
                  table = document.tables[0]
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                  assert_size(table.data, 4) do |row_1, row_2, row_3, row_4|
         | 
| 136 | 
            +
                    assert_size(row_1, 0)
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    assert_size(row_2, 0)
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                    assert_size(row_3, 1) do |value_1|
         | 
| 141 | 
            +
                      expect(value_1).to eq(1)
         | 
| 142 | 
            +
                    end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    assert_size(row_4, 2) do |value_1, value_2|
         | 
| 145 | 
            +
                      expect(value_1).to be_nil
         | 
| 146 | 
            +
                      expect(value_2).to eq(1)
         | 
| 147 | 
            +
                    end
         | 
| 148 | 
            +
                  end
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              context "when cells of the last row are empty" do
         | 
| 153 | 
            +
                let(:document_archive) do
         | 
| 154 | 
            +
                  document = SpreadBase::Document.new
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  document.tables << SpreadBase::Table.new(
         | 
| 157 | 
            +
                    'abc', [
         | 
| 158 | 
            +
                      []
         | 
| 159 | 
            +
                    ]
         | 
| 160 | 
            +
                  )
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  document.tables << SpreadBase::Table.new(
         | 
| 163 | 
            +
                    'def', [
         | 
| 164 | 
            +
                      [nil]
         | 
| 165 | 
            +
                    ]
         | 
| 166 | 
            +
                  )
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  document.tables << SpreadBase::Table.new(
         | 
| 169 | 
            +
                    'ghi', [
         | 
| 170 | 
            +
                      [nil, nil]
         | 
| 171 | 
            +
                    ]
         | 
| 172 | 
            +
                  )
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                  document.tables << SpreadBase::Table.new(
         | 
| 175 | 
            +
                    'jkl', [
         | 
| 176 | 
            +
                      [nil],
         | 
| 177 | 
            +
                      [1],
         | 
| 178 | 
            +
                      [nil]
         | 
| 179 | 
            +
                    ]
         | 
| 180 | 
            +
                  )
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                  SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(document)
         | 
| 183 | 
            +
                end
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                it "should drop such row" do
         | 
| 186 | 
            +
                  document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(document_archive)
         | 
| 187 | 
            +
                  tables = document.tables
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                  assert_size(tables, 4) do |table_1, table_2, table_3, table_4|
         | 
| 190 | 
            +
                    assert_size(table_1.data, 0)
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                    assert_size(table_2.data, 0)
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                    assert_size(table_3.data, 0)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    assert_size(table_4.data, 2)
         | 
| 197 | 
            +
                  end
         | 
| 198 | 
            +
                end
         | 
| 199 | 
            +
              end
         | 
| 200 | 
            +
             | 
| 115 201 | 
             
            end
         | 
| @@ -109,4 +109,27 @@ abc: | |
| 109 109 | 
             
                expect(@sample_document.to_s(with_headers: true)).to eq(expected_string)
         | 
| 110 110 | 
             
              end
         | 
| 111 111 |  | 
| 112 | 
            +
              it "should parse a existing ODS file" do
         | 
| 113 | 
            +
                ods_file = File.expand_path('../fixtures/test.ods', __dir__)
         | 
| 114 | 
            +
                document = SpreadBase::Document.new(ods_file)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                expect(document.tables[0].name).to eq('Sheet1')
         | 
| 117 | 
            +
                expect(document.tables[0].data).to match([
         | 
| 118 | 
            +
                  match(['hoge'                                      ]),
         | 
| 119 | 
            +
                  match([nil   , 'fuga'                              ]),
         | 
| 120 | 
            +
                  match([nil   , nil   , 'piyo'                      ]),
         | 
| 121 | 
            +
                  match([nil   , nil   , nil   , 'hogera'            ]),
         | 
| 122 | 
            +
                  match([nil   , nil   , nil   , nil     , 'hogehoge'])
         | 
| 123 | 
            +
                ])
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                expect(document.tables[1].name).to eq('Sheet2')
         | 
| 126 | 
            +
                expect(document.tables[1].data).to match([
         | 
| 127 | 
            +
                  match([nil  , nil     , nil  , nil  , 'foo']),
         | 
| 128 | 
            +
                  match([nil  , nil     , nil  , 'bar'       ]),
         | 
| 129 | 
            +
                  match([nil  , nil     , 'baz'              ]),
         | 
| 130 | 
            +
                  match([nil  , 'foobar'                     ]),
         | 
| 131 | 
            +
                  match(['qux'                               ])
         | 
| 132 | 
            +
                ])
         | 
| 133 | 
            +
              end
         | 
| 134 | 
            +
             | 
| 112 135 | 
             
            end
         | 
| Binary file | 
    
        data/spreadbase.gemspec
    CHANGED
    
    | @@ -10,7 +10,7 @@ Gem::Specification.new do |s| | |
| 10 10 | 
             
              s.platform    = Gem::Platform::RUBY
         | 
| 11 11 | 
             
              s.required_ruby_version = '>= 2.3.0'
         | 
| 12 12 | 
             
              s.authors     = ["Saverio Miroddi"]
         | 
| 13 | 
            -
              s.date        = ' | 
| 13 | 
            +
              s.date        = '2021-03-05'
         | 
| 14 14 | 
             
              s.email       = ["saverio.pub2@gmail.com"]
         | 
| 15 15 | 
             
              s.homepage    = "https://github.com/saveriomiroddi/spreadbase"
         | 
| 16 16 | 
             
              s.summary     = %q{Library for reading/writing OpenOffice Calc documents.}
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: spreadbase
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Saverio Miroddi
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-03-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rubyzip
         | 
| @@ -59,9 +59,9 @@ executables: [] | |
| 59 59 | 
             
            extensions: []
         | 
| 60 60 | 
             
            extra_rdoc_files: []
         | 
| 61 61 | 
             
            files:
         | 
| 62 | 
            +
            - ".github/workflows/ci.yml"
         | 
| 62 63 | 
             
            - ".gitignore"
         | 
| 63 64 | 
             
            - ".rspec"
         | 
| 64 | 
            -
            - ".travis.yml"
         | 
| 65 65 | 
             
            - Gemfile
         | 
| 66 66 | 
             
            - LICENSE
         | 
| 67 67 | 
             
            - README.md
         | 
| @@ -80,6 +80,7 @@ files: | |
| 80 80 | 
             
            - spec/codecs/open_document_12_spec.rb
         | 
| 81 81 | 
             
            - spec/elements/document_spec.rb
         | 
| 82 82 | 
             
            - spec/elements/table_spec.rb
         | 
| 83 | 
            +
            - spec/fixtures/test.ods
         | 
| 83 84 | 
             
            - spec/spec_helper.rb
         | 
| 84 85 | 
             
            - spec/spec_helpers.rb
         | 
| 85 86 | 
             
            - spreadbase.gemspec
         | 
| @@ -107,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 107 108 | 
             
                - !ruby/object:Gem::Version
         | 
| 108 109 | 
             
                  version: '0'
         | 
| 109 110 | 
             
            requirements: []
         | 
| 110 | 
            -
            rubygems_version: 3. | 
| 111 | 
            +
            rubygems_version: 3.2.3
         | 
| 111 112 | 
             
            signing_key: 
         | 
| 112 113 | 
             
            specification_version: 4
         | 
| 113 114 | 
             
            summary: Library for reading/writing OpenOffice Calc documents.
         |