piperator 0.3.0 → 1.0.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 +5 -5
 - data/.travis.yml +7 -2
 - data/CHANGELOG.md +4 -0
 - data/README.md +30 -1
 - data/lib/piperator.rb +31 -1
 - data/lib/piperator/builder.rb +53 -0
 - data/lib/piperator/version.rb +2 -1
 - data/piperator.gemspec +1 -1
 - metadata +6 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: af5e198f4b96db3cee04f76d28630879c8a6d7f69a83b7aef26d895ccff7051a
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 236c0753cdde6275d2e9bf350b2afa839312bbe72a636eff5a190a1a6bcd8b3b
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 17220ec804befc2717354c004a9c0b038d00618a3296ac773e77a99d14333d3dafc87d73b112dc1921eeaf6c67e4b7e8e8070ba42cd983b692d9a7c73999e44c
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: b74fe2c27cc940c5be501ecfb429dad7a89fde7283f30f67c64840013361a32101e7d9b5fa72b590d13750b8f75bc94683139cc38bdc8d0309516d04ffc931f5
         
     | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -6,6 +6,20 @@ The library is heavily inspired by [Elixir pipe operator](https://elixirschool.c 
     | 
|
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            [](https://travis-ci.org/lautis/piperator)
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
            <!-- START doctoc generated TOC please keep comment here to allow auto update -->
         
     | 
| 
      
 10 
     | 
    
         
            +
            <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
         
     | 
| 
      
 11 
     | 
    
         
            +
            **Table of Contents**
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            - [Installation](#installation)
         
     | 
| 
      
 14 
     | 
    
         
            +
            - [Usage](#usage)
         
     | 
| 
      
 15 
     | 
    
         
            +
              - [Pipelines](#pipelines)
         
     | 
| 
      
 16 
     | 
    
         
            +
              - [Enumerators as IO objects](#enumerators-as-io-objects)
         
     | 
| 
      
 17 
     | 
    
         
            +
            - [Development](#development)
         
     | 
| 
      
 18 
     | 
    
         
            +
            - [Related Projects](#related-projects)
         
     | 
| 
      
 19 
     | 
    
         
            +
            - [Contributing](#contributing)
         
     | 
| 
      
 20 
     | 
    
         
            +
            - [License](#license)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            <!-- END doctoc generated TOC please keep comment here to allow auto update -->
         
     | 
| 
       9 
23 
     | 
    
         | 
| 
       10 
24 
     | 
    
         
             
            ## Installation
         
     | 
| 
       11 
25 
     | 
    
         | 
| 
         @@ -35,7 +49,16 @@ Piperator. 
     | 
|
| 
       35 
49 
     | 
    
         
             
            # => 18
         
     | 
| 
       36 
50 
     | 
    
         
             
            ```
         
     | 
| 
       37 
51 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 52 
     | 
    
         
            +
            The same could also be achieved using DSL instead of method chaining:
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 55 
     | 
    
         
            +
            Piperator.build do
         
     | 
| 
      
 56 
     | 
    
         
            +
              pipe(->(values) { values.lazy.map { |i| i * 3 } })
         
     | 
| 
      
 57 
     | 
    
         
            +
              pipe(->(values) { values.sum })
         
     | 
| 
      
 58 
     | 
    
         
            +
            end.call([1, 2, 3])
         
     | 
| 
      
 59 
     | 
    
         
            +
            ```
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            If desired, the input enumerable can also be given as the first element of the pipeline using `Piperator.wrap`.
         
     | 
| 
       39 
62 
     | 
    
         | 
| 
       40 
63 
     | 
    
         
             
            ```ruby
         
     | 
| 
       41 
64 
     | 
    
         
             
            Piperator.
         
     | 
| 
         @@ -156,6 +179,12 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run 
     | 
|
| 
       156 
179 
     | 
    
         | 
| 
       157 
180 
     | 
    
         
             
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         
     | 
| 
       158 
181 
     | 
    
         | 
| 
      
 182 
     | 
    
         
            +
            ## Related Projects
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
            * [D★Stream](https://github.com/ddfreyne/d-stream) - Set of extensions for writing stream-processing code.
         
     | 
| 
      
 185 
     | 
    
         
            +
            * [ddbuffer](https://github.com/ddfreyne/ddbuffer) - Buffer enumerables/enumerators.
         
     | 
| 
      
 186 
     | 
    
         
            +
            * [Down::ChunkedIO](https://github.com/janko-m/down/blob/master/lib/down/chunked_io.rb) - A similar IO class as Piperator::IO.
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
       159 
188 
     | 
    
         
             
            ## Contributing
         
     | 
| 
       160 
189 
     | 
    
         | 
| 
       161 
190 
     | 
    
         
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/lautis/piperator.
         
     | 
    
        data/lib/piperator.rb
    CHANGED
    
    | 
         @@ -1,13 +1,43 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'piperator/version'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'piperator/pipeline'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'piperator/io'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'piperator/builder'
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
       5 
6 
     | 
    
         
             
            # Top-level shortcuts
         
     | 
| 
       6 
7 
     | 
    
         
             
            module Piperator
         
     | 
| 
      
 8 
     | 
    
         
            +
              # Build a new pipeline using DSL. This enables easy control of the pipeline
         
     | 
| 
      
 9 
     | 
    
         
            +
              # stucture.
         
     | 
| 
      
 10 
     | 
    
         
            +
              #
         
     | 
| 
      
 11 
     | 
    
         
            +
              #   Piperator.build do
         
     | 
| 
      
 12 
     | 
    
         
            +
              #     wrap [1, 2, 3]
         
     | 
| 
      
 13 
     | 
    
         
            +
              #     pipe(-> (enumerable) { enumerable.map { |i| i + 1 } })
         
     | 
| 
      
 14 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 15 
     | 
    
         
            +
              #   # => Pipeline that returns [2, 3, 4] called
         
     | 
| 
      
 16 
     | 
    
         
            +
              #
         
     | 
| 
      
 17 
     | 
    
         
            +
              #   # Alternatively, the Builder is also given as argument to the block
         
     | 
| 
      
 18 
     | 
    
         
            +
              #   Piperator.build do |p|
         
     | 
| 
      
 19 
     | 
    
         
            +
              #     p.wrap [1, 2, 3]
         
     | 
| 
      
 20 
     | 
    
         
            +
              #     p.pipe(-> (enumerable) { enumerable.map { |i| i + 1 } })
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   # This is similar, but allows access to instance variables.
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # @return [Pipeline] Pipeline containing defined steps
         
     | 
| 
      
 25 
     | 
    
         
            +
              def self.build(&block)
         
     | 
| 
      
 26 
     | 
    
         
            +
                return Pipeline.new unless block_given?
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                Builder.new(block&.binding).tap do |builder|
         
     | 
| 
      
 29 
     | 
    
         
            +
                  if block.arity.positive?
         
     | 
| 
      
 30 
     | 
    
         
            +
                    yield builder
         
     | 
| 
      
 31 
     | 
    
         
            +
                  else
         
     | 
| 
      
 32 
     | 
    
         
            +
                    builder.instance_eval(&block)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end.to_pipeline
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
       7 
37 
     | 
    
         
             
              # Build a new pipeline from a callable or an enumerable object
         
     | 
| 
       8 
38 
     | 
    
         
             
              #
         
     | 
| 
       9 
39 
     | 
    
         
             
              # @see Piperator::Pipeline.pipe
         
     | 
| 
       10 
     | 
    
         
            -
              # @param  
     | 
| 
      
 40 
     | 
    
         
            +
              # @param enumerable An object responding to call(enumerable)
         
     | 
| 
       11 
41 
     | 
    
         
             
              # @return [Pipeline] A pipeline containing only the callable
         
     | 
| 
       12 
42 
     | 
    
         
             
              def self.pipe(enumerable)
         
     | 
| 
       13 
43 
     | 
    
         
             
                Pipeline.pipe(enumerable)
         
     | 
| 
         @@ -0,0 +1,53 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Piperator
         
     | 
| 
      
 2 
     | 
    
         
            +
              # Builder is used to provide DSL-based Pipeline building. Using Builder,
         
     | 
| 
      
 3 
     | 
    
         
            +
              # Pipelines can be built without pipe chaining, which might be easier if
         
     | 
| 
      
 4 
     | 
    
         
            +
              # some steps need to be included only on specific conditions.
         
     | 
| 
      
 5 
     | 
    
         
            +
              #
         
     | 
| 
      
 6 
     | 
    
         
            +
              # @see Piperator.build
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Builder
         
     | 
| 
      
 8 
     | 
    
         
            +
                # Expose a chained method in Pipeline in DSL
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @param method_name Name of method in Pipeline
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @see Pipeline
         
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @!macro [attach] dsl_method
         
     | 
| 
      
 14 
     | 
    
         
            +
                #   @method $1
         
     | 
| 
      
 15 
     | 
    
         
            +
                #   Call Pipeline#$1 given arguments and use the return value as builder state.
         
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                #   @see Pipeline.$1
         
     | 
| 
      
 18 
     | 
    
         
            +
                def self.dsl_method(method_name)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  define_method(method_name) do |*arguments|
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @pipeline = @pipeline.send(method_name, *arguments)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                dsl_method :pipe
         
     | 
| 
      
 25 
     | 
    
         
            +
                dsl_method :wrap
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def initialize(saved_binding, pipeline = Pipeline.new)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @pipeline = pipeline
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @saved_binding = saved_binding
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                # Return build pipeline
         
     | 
| 
      
 33 
     | 
    
         
            +
                #
         
     | 
| 
      
 34 
     | 
    
         
            +
                # @return [Pipeline]
         
     | 
| 
      
 35 
     | 
    
         
            +
                def to_pipeline
         
     | 
| 
      
 36 
     | 
    
         
            +
                  @pipeline
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                private
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                def method_missing(method_name, *arguments, &block)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  if @saved_binding.receiver.respond_to?(method_name, true)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @saved_binding.receiver.send(method_name, *arguments, &block)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  else
         
     | 
| 
      
 45 
     | 
    
         
            +
                    super
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                def respond_to_missing?(method_name, include_private = false)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  @saved_binding.receiver.respond_to?(method_name, include_private) || super
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/piperator/version.rb
    CHANGED
    
    
    
        data/piperator.gemspec
    CHANGED
    
    | 
         @@ -23,7 +23,7 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       23 
23 
     | 
    
         
             
              spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         
     | 
| 
       24 
24 
     | 
    
         
             
              spec.require_paths = ['lib']
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
              spec.add_development_dependency 'bundler', ' 
     | 
| 
      
 26 
     | 
    
         
            +
              spec.add_development_dependency 'bundler', '>= 1.14'
         
     | 
| 
       27 
27 
     | 
    
         
             
              spec.add_development_dependency 'rake', '~> 12.0'
         
     | 
| 
       28 
28 
     | 
    
         
             
              spec.add_development_dependency 'rspec', '~> 3.0'
         
     | 
| 
       29 
29 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,27 +1,27 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: piperator
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Ville Lautanala
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2019-10-13 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
       15 
15 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
     | 
    
         
            -
                - - " 
     | 
| 
      
 17 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
19 
     | 
    
         
             
                    version: '1.14'
         
     | 
| 
       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 
26 
     | 
    
         
             
                    version: '1.14'
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
         @@ -71,6 +71,7 @@ files: 
     | 
|
| 
       71 
71 
     | 
    
         
             
            - bin/console
         
     | 
| 
       72 
72 
     | 
    
         
             
            - bin/setup
         
     | 
| 
       73 
73 
     | 
    
         
             
            - lib/piperator.rb
         
     | 
| 
      
 74 
     | 
    
         
            +
            - lib/piperator/builder.rb
         
     | 
| 
       74 
75 
     | 
    
         
             
            - lib/piperator/io.rb
         
     | 
| 
       75 
76 
     | 
    
         
             
            - lib/piperator/pipeline.rb
         
     | 
| 
       76 
77 
     | 
    
         
             
            - lib/piperator/version.rb
         
     | 
| 
         @@ -94,8 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       94 
95 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       95 
96 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       96 
97 
     | 
    
         
             
            requirements: []
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
            rubygems_version: 2.6.11
         
     | 
| 
      
 98 
     | 
    
         
            +
            rubygems_version: 3.0.3
         
     | 
| 
       99 
99 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       100 
100 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       101 
101 
     | 
    
         
             
            summary: Composable pipelines for streaming large collections
         
     |