diff options
| author | Luc Donnet | 2017-12-20 10:18:01 +0100 | 
|---|---|---|
| committer | GitHub | 2017-12-20 10:18:01 +0100 | 
| commit | e6ab30bc089b9d30a4222df214a70097df651d72 (patch) | |
| tree | b62489c965045d0fa897f02caeeb0b59d436a062 /spec/support | |
| parent | c13540b1b10451c9b26045cbfcb5ec397d1ddbc0 (diff) | |
| parent | b4f0fe5ac25c1d58c7396f55fb66de7313783d9c (diff) | |
| download | chouette-core-e6ab30bc089b9d30a4222df214a70097df651d72.tar.bz2 | |
Merge pull request #124 from af83/5006-wb_import_filter_refs_with_foreign_lines
5006 wb import filter refs with foreign lines
Diffstat (limited to 'spec/support')
| -rw-r--r-- | spec/support/helpers/tree_walker.rb | 15 | ||||
| -rw-r--r-- | spec/support/zip_support.rb | 25 | ||||
| -rw-r--r-- | spec/support/zip_support/create_zip_data.rb | 70 | 
3 files changed, 110 insertions, 0 deletions
| diff --git a/spec/support/helpers/tree_walker.rb b/spec/support/helpers/tree_walker.rb new file mode 100644 index 000000000..b86c3a8e1 --- /dev/null +++ b/spec/support/helpers/tree_walker.rb @@ -0,0 +1,15 @@ +module TreeWalker extend self +    MAX_LEVEL = 5 +    def walk_tree path, max_level: MAX_LEVEL, level: 0, yield_dirs: :no, &blk +      raise RuntimeError, "too many levels in tree walk, > #{max_level}" if level > max_level +      Dir.glob(File.join(path, '*')) do | file | +        if File.directory?( file ) +          blk.(:dir, file) if yield_dirs == :before  +          walk_tree(file, max_level: max_level, level: level.succ, yield_dirs: yield_dirs, &blk) +          blk.(:dir, file) if yield_dirs == :after  +        else +          blk.(:file, file) +        end +      end +    end +end diff --git a/spec/support/zip_support.rb b/spec/support/zip_support.rb new file mode 100644 index 000000000..3d9b2f97c --- /dev/null +++ b/spec/support/zip_support.rb @@ -0,0 +1,25 @@ +require_relative 'helpers/tree_walker' +module ZipSupport + +  module Helper extend self +    def remove +      -> filetype, path do +        filetype == :file ? File.unlink(path) : Dir.unlink(path) +      end +    end +  end + +  def zip_fixtures_path(file_name) +    fixtures_path(File.join('zip', file_name)) +  end + +  def clear_all_zip_fixtures! relpath = '' +    raise ArgumentError, 'up dir not allowed (..)' if %r{\.\.} === relpath +    TreeWalker.walk_tree zip_fixtures_path(relpath), yield_dirs: :after, &Helper.remove  +  end +end + +RSpec.configure do |conf| +  conf.include ZipSupport, type: :zip +end + diff --git a/spec/support/zip_support/create_zip_data.rb b/spec/support/zip_support/create_zip_data.rb new file mode 100644 index 000000000..250d67f74 --- /dev/null +++ b/spec/support/zip_support/create_zip_data.rb @@ -0,0 +1,70 @@ +require_relative '../helpers/tree_walker' +module ZipSupport +  module CreateZipData + +    class ZipData < Struct.new(:name, :data)  + +      def write_to file +        File.write(file, data) +      end + +    end + +    class Implementation + +      attr_reader :name, :prefix, :zip + +      def initialize name +        @name   = name +        @prefix = "#{name}/" +        @zip    = ZipData.new(name, '') +      end + +      def make_from names_to_content_map +        os = Zip::OutputStream.write_buffer do | zio | +          names_to_content_map.each(&add_entries(zio)) +        end +        zip.data = os.string +        zip +      end + +      def make_from_tree +        os = Zip::OutputStream.write_buffer do | zio | +          TreeWalker.walk_tree(name, &add_entry(zio))  +        end +        zip.data = os.string +        zip +      end + +      private + +      def add_entry zio +        -> _, path do +          rel_path = path.sub(prefix, '') +          zio.put_next_entry(rel_path) +          zio.write(File.read(path)) +        end +      end + +      def add_entries zio +        -> name, content do +          zio.put_next_entry(name) +          zio.write(content) +        end +      end +    end + + +    def make_zip(name, names_to_content_map = {}) +      Implementation.new(name).make_from(names_to_content_map) +    end + +    def make_zip_from_tree(dir) +      Implementation.new(dir).make_from_tree +    end +  end +end + +RSpec.configure do |conf| +  conf.include ZipSupport::CreateZipData, type: :zip +end | 
