remote_table 0.2.3 → 0.2.4
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.
- data/VERSION +1 -1
- data/lib/remote_table.rb +1 -0
- data/lib/remote_table/file.rb +47 -0
- data/lib/remote_table/file/csv.rb +4 -14
- data/lib/remote_table/file/fixed_width.rb +3 -41
- data/remote_table.gemspec +2 -2
- metadata +2 -2
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.2. | 
| 1 | 
            +
            0.2.4
         | 
    
        data/lib/remote_table.rb
    CHANGED
    
    
    
        data/lib/remote_table/file.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            class RemoteTable
         | 
| 2 2 | 
             
              class File
         | 
| 3 3 | 
             
                attr_accessor :filename, :format, :delimiter, :skip, :cut, :crop, :sheet, :headers, :schema, :schema_name, :trap
         | 
| 4 | 
            +
                attr_accessor :encoding
         | 
| 4 5 | 
             
                attr_accessor :path
         | 
| 5 6 | 
             
                attr_accessor :keep_blank_rows
         | 
| 6 7 |  | 
| @@ -17,9 +18,23 @@ class RemoteTable | |
| 17 18 | 
             
                  @schema = bus[:schema]
         | 
| 18 19 | 
             
                  @schema_name = bus[:schema_name]
         | 
| 19 20 | 
             
                  @trap = bus[:trap]
         | 
| 21 | 
            +
                  @encoding = bus[:encoding] || 'UTF-8'
         | 
| 20 22 | 
             
                  extend "RemoteTable::#{format.to_s.camelcase}".constantize
         | 
| 21 23 | 
             
                end
         | 
| 22 24 |  | 
| 25 | 
            +
                class << self
         | 
| 26 | 
            +
                  # http://santanatechnotes.blogspot.com/2005/12/matching-iso-8859-1-strings-with-ruby.html
         | 
| 27 | 
            +
                  def convert_to_utf8(str, encoding)
         | 
| 28 | 
            +
                    if encoding == 'UTF-8'
         | 
| 29 | 
            +
                      str.toutf8 # just in case
         | 
| 30 | 
            +
                    else
         | 
| 31 | 
            +
                      @_iconv ||= Hash.new
         | 
| 32 | 
            +
                      @_iconv[encoding] ||= Iconv.new 'UTF-8', encoding
         | 
| 33 | 
            +
                      @_iconv[encoding].iconv(str).toutf8
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                
         | 
| 23 38 | 
             
                def tabulate(path)
         | 
| 24 39 | 
             
                  define_fixed_width_schema! if format == :fixed_width and schema.is_a?(Array) # TODO move to generic subclass callback
         | 
| 25 40 | 
             
                  self.path = path
         | 
| @@ -47,6 +62,38 @@ class RemoteTable | |
| 47 62 | 
             
                  end
         | 
| 48 63 | 
             
                end
         | 
| 49 64 |  | 
| 65 | 
            +
                def backup_file!
         | 
| 66 | 
            +
                  FileUtils.cp path, "#{path}.backup"
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
                
         | 
| 69 | 
            +
                def skip_rows!
         | 
| 70 | 
            +
                  return unless skip
         | 
| 71 | 
            +
                  `cat #{path} | tail -n +#{skip + 1} > #{path}.tmp`
         | 
| 72 | 
            +
                  FileUtils.mv "#{path}.tmp", path
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
                
         | 
| 75 | 
            +
                def convert_file_to_utf8!
         | 
| 76 | 
            +
                  return if encoding == 'UTF8' or encoding == 'UTF-8'
         | 
| 77 | 
            +
                  `iconv -c -f #{encoding} -t UTF8 #{path} > #{path}.tmp`
         | 
| 78 | 
            +
                  FileUtils.mv "#{path}.tmp", path
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
                
         | 
| 81 | 
            +
                def restore_file!
         | 
| 82 | 
            +
                  FileUtils.mv "#{path}.backup", path if ::File.readable? "#{path}.backup"
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
                
         | 
| 85 | 
            +
                def cut_columns!
         | 
| 86 | 
            +
                  return unless cut
         | 
| 87 | 
            +
                  `cat #{path} | cut -c #{cut} > #{path}.tmp`
         | 
| 88 | 
            +
                  FileUtils.mv "#{path}.tmp", path
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                
         | 
| 91 | 
            +
                def crop_rows!
         | 
| 92 | 
            +
                  return unless crop
         | 
| 93 | 
            +
                  `cat #{path} | tail -n +#{crop.first} | head -n #{crop.last - crop.first + 1} > #{path}.tmp`
         | 
| 94 | 
            +
                  FileUtils.mv "#{path}.tmp", path
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
                
         | 
| 50 97 | 
             
                def format_from_filename
         | 
| 51 98 | 
             
                  extname = ::File.extname(filename).gsub('.', '')
         | 
| 52 99 | 
             
                  return :csv if extname.blank?
         | 
| @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            class RemoteTable
         | 
| 2 2 | 
             
              module Csv
         | 
| 3 3 | 
             
                def each_row(&block)
         | 
| 4 | 
            +
                  backup_file!
         | 
| 5 | 
            +
                  convert_file_to_utf8!
         | 
| 4 6 | 
             
                  skip_rows!
         | 
| 5 7 | 
             
                  FasterCSV.foreach(path, fastercsv_options) do |row|
         | 
| 6 8 | 
             
                    ordered_hash = ActiveSupport::OrderedHash.new
         | 
| @@ -27,13 +29,13 @@ class RemoteTable | |
| 27 29 | 
             
                    yield ordered_hash if keep_blank_rows or filled_values.nonzero?
         | 
| 28 30 | 
             
                  end
         | 
| 29 31 | 
             
                ensure
         | 
| 30 | 
            -
                   | 
| 32 | 
            +
                  restore_file!
         | 
| 31 33 | 
             
                end
         | 
| 32 34 |  | 
| 33 35 | 
             
                private
         | 
| 34 36 |  | 
| 35 37 | 
             
                def fastercsv_options
         | 
| 36 | 
            -
                  fastercsv_options = { :skip_blanks => !keep_blank_rows, :header_converters => lambda { |k| k.to_s | 
| 38 | 
            +
                  fastercsv_options = { :skip_blanks => !keep_blank_rows, :header_converters => lambda { |k| RemoteTable::File.convert_to_utf8 k.to_s, encoding } }
         | 
| 37 39 | 
             
                  if headers == false
         | 
| 38 40 | 
             
                    fastercsv_options.merge!(:headers => nil)
         | 
| 39 41 | 
             
                  else
         | 
| @@ -42,17 +44,5 @@ class RemoteTable | |
| 42 44 | 
             
                  fastercsv_options.merge!(:col_sep => delimiter) if delimiter
         | 
| 43 45 | 
             
                  fastercsv_options
         | 
| 44 46 | 
             
                end
         | 
| 45 | 
            -
                
         | 
| 46 | 
            -
                def skip_rows!
         | 
| 47 | 
            -
                  return unless skip
         | 
| 48 | 
            -
                  original = "#{path}.original"
         | 
| 49 | 
            -
                  FileUtils.cp(path, original)
         | 
| 50 | 
            -
                  `cat #{original} | tail -n +#{skip + 1} > #{path}`
         | 
| 51 | 
            -
                end
         | 
| 52 | 
            -
                
         | 
| 53 | 
            -
                def restore_rows!
         | 
| 54 | 
            -
                  return unless skip
         | 
| 55 | 
            -
                  FileUtils.mv "#{path}.original", path
         | 
| 56 | 
            -
                end
         | 
| 57 47 | 
             
              end
         | 
| 58 48 | 
             
            end
         | 
| @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            class RemoteTable
         | 
| 2 2 | 
             
              module FixedWidth
         | 
| 3 3 | 
             
                def each_row(&block)
         | 
| 4 | 
            +
                  backup_file!
         | 
| 5 | 
            +
                  convert_file_to_utf8!
         | 
| 4 6 | 
             
                  crop_rows!
         | 
| 5 7 | 
             
                  skip_rows!
         | 
| 6 8 | 
             
                  cut_columns!
         | 
| @@ -10,47 +12,7 @@ class RemoteTable | |
| 10 12 | 
             
                    yield hash if keep_blank_rows or hash.any? { |k, v| v.present? }
         | 
| 11 13 | 
             
                  end
         | 
| 12 14 | 
             
                ensure
         | 
| 13 | 
            -
                   | 
| 14 | 
            -
                  unskip_rows!
         | 
| 15 | 
            -
                  uncrop_rows!
         | 
| 16 | 
            -
                end
         | 
| 17 | 
            -
                
         | 
| 18 | 
            -
                private
         | 
| 19 | 
            -
                
         | 
| 20 | 
            -
                def cut_columns!
         | 
| 21 | 
            -
                  return unless cut
         | 
| 22 | 
            -
                  original = "#{path}.uncut"
         | 
| 23 | 
            -
                  FileUtils.cp(path, original)
         | 
| 24 | 
            -
                  `cat #{original} | cut -c #{cut} > #{path}`
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
                
         | 
| 27 | 
            -
                def uncut_columns!
         | 
| 28 | 
            -
                  return unless cut
         | 
| 29 | 
            -
                  FileUtils.mv "#{path}.uncut", path
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                def skip_rows!
         | 
| 33 | 
            -
                  return unless skip
         | 
| 34 | 
            -
                  original = "#{path}.unskipped"
         | 
| 35 | 
            -
                  FileUtils.cp(path, original)
         | 
| 36 | 
            -
                  `cat #{original} | tail -n +#{skip + 1} > #{path}`
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
                
         | 
| 39 | 
            -
                def unskip_rows!
         | 
| 40 | 
            -
                  return unless skip
         | 
| 41 | 
            -
                  FileUtils.mv "#{path}.unskipped", path
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
                
         | 
| 44 | 
            -
                def crop_rows!
         | 
| 45 | 
            -
                  return unless crop
         | 
| 46 | 
            -
                  original = "#{path}.uncropped"
         | 
| 47 | 
            -
                  FileUtils.cp(path, original)
         | 
| 48 | 
            -
                  `cat #{original} | tail -n +#{crop.first} | head -n #{crop.last - crop.first + 1} > #{path}`
         | 
| 49 | 
            -
                end
         | 
| 50 | 
            -
                
         | 
| 51 | 
            -
                def uncrop_rows!
         | 
| 52 | 
            -
                  return unless crop
         | 
| 53 | 
            -
                  FileUtils.mv "#{path}.uncropped", path
         | 
| 15 | 
            +
                  restore_file!
         | 
| 54 16 | 
             
                end
         | 
| 55 17 | 
             
              end
         | 
| 56 18 | 
             
            end
         | 
    
        data/remote_table.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{remote_table}
         | 
| 8 | 
            -
              s.version = "0.2. | 
| 8 | 
            +
              s.version = "0.2.4"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Seamus Abshere", "Andy Rossmeissl"]
         | 
| 12 | 
            -
              s.date = %q{2010-03- | 
| 12 | 
            +
              s.date = %q{2010-03-24}
         | 
| 13 13 | 
             
              s.description = %q{Remotely open and parse Excel XLS, ODS, CSV and fixed-width tables.}
         | 
| 14 14 | 
             
              s.email = %q{seamus@abshere.net}
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: remote_table
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Seamus Abshere
         | 
| @@ -10,7 +10,7 @@ autorequire: | |
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 12 |  | 
| 13 | 
            -
            date: 2010-03- | 
| 13 | 
            +
            date: 2010-03-24 00:00:00 -04:00
         | 
| 14 14 | 
             
            default_executable: 
         | 
| 15 15 | 
             
            dependencies: 
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency 
         |