pipeable 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Checks if operation is true and then answers success (passthrough) or failure (with argument).
6
+ class Check < Abstract
7
+ def initialize(operation, message, **)
8
+ super(**)
9
+ @operation = operation
10
+ @message = message
11
+ end
12
+
13
+ def call result
14
+ result.bind do |arguments|
15
+ answer = question arguments
16
+ answer == true || answer.is_a?(Success) ? result : Failure(arguments)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :operation, :message
23
+
24
+ def question arguments
25
+ splat = marameters.categorize operation.method(message).parameters, arguments
26
+ operation.public_send(message, *splat.positionals, **splat.keywords, &splat.block)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/container"
4
+
5
+ module Pipeable
6
+ module Steps
7
+ # Registers default steps.
8
+ module Container
9
+ extend Dry::Container::Mixin
10
+
11
+ register(:as) { As }
12
+ register(:bind) { Bind }
13
+ register(:check) { Check }
14
+ register(:fmap) { Fmap }
15
+ register(:insert) { Insert }
16
+ register(:map) { Map }
17
+ register(:merge) { Merge }
18
+ register(:orr) { Or }
19
+ register(:tee) { Tee }
20
+ register(:to) { To }
21
+ register(:try) { Try }
22
+ register(:use) { Use }
23
+ register(:validate) { Validate }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Wraps Dry Monads `#fmap` method as a step.
6
+ class Fmap < Abstract
7
+ def call(result) = result.fmap { |input| base_block.call input }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Inserts elements before, after, or around input.
6
+ class Insert < Abstract
7
+ LAST = -1
8
+
9
+ def initialize(*positionals, at: LAST, **)
10
+ super(*positionals, **)
11
+ @value = positionals.empty? ? base_keywords : positionals.flatten
12
+ @at = at
13
+ end
14
+
15
+ def call result
16
+ result.fmap do |input|
17
+ cast = input.is_a?(Array) ? input : [input]
18
+ value.is_a?(Array) ? cast.insert(at, *value) : cast.insert(at, value)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :value, :at
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Maps over a collection, processing each element, and answering a new result.
6
+ class Map < Abstract
7
+ def call(result) = result.fmap { |collection| collection.map(&base_block) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Merges initialized attributes with step argument for use by a subsequent step.
6
+ class Merge < Abstract
7
+ def initialize as: :step, **keywords
8
+ super(**keywords)
9
+ @as = as
10
+ end
11
+
12
+ def call result
13
+ result.fmap do |input|
14
+ if input.is_a? Hash
15
+ input.merge! base_keywords
16
+ else
17
+ {as => input}.merge!(base_keywords)
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :as
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Wraps Dry Monads `#or` method as a step.
6
+ class Or < Abstract
7
+ def call(result) = result.or { |input| base_block.call input }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Messages operation, without any response checks, while passing input through as output.
6
+ class Tee < Abstract
7
+ def initialize(operation, *, **)
8
+ super(*, **)
9
+ @operation = operation
10
+ end
11
+
12
+ def call result
13
+ operation.public_send(*base_positionals, **base_keywords)
14
+ result
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :operation
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Delegates to a non-callable operation which automatically wraps the result if necessary.
6
+ class To < Abstract
7
+ def initialize(operation, message, **)
8
+ super(**)
9
+ @operation = operation
10
+ @message = message
11
+ end
12
+
13
+ def call result
14
+ result.bind do |arguments|
15
+ splat = marameters.categorize operation.method(message).parameters, arguments
16
+ wrap operation.public_send(message, *splat.positionals, **splat.keywords, &splat.block)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :operation, :message
23
+
24
+ def wrap(result) = result.is_a?(Dry::Monads::Result) ? result : Success(result)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Messages a risky operation which may pass or fail.
6
+ class Try < Abstract
7
+ def initialize *positionals, catch:, **keywords
8
+ super(*positionals, **keywords)
9
+ @catch = catch
10
+ end
11
+
12
+ def call result
13
+ result.fmap { |operation| operation.public_send(*base_positionals, **base_keywords) }
14
+ rescue *Array(catch) => error
15
+ Failure error.message
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :catch
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Use another transaction -- or any command -- which answers a result.
6
+ class Use < Abstract
7
+ def initialize(operation, **)
8
+ super(**)
9
+ @operation = operation
10
+ end
11
+
12
+ def call(result) = result.bind { |input| operation.call input }
13
+
14
+ private
15
+
16
+ attr_reader :operation
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pipeable
4
+ module Steps
5
+ # Validates a result via a callable operation.
6
+ class Validate < Abstract
7
+ def initialize(operation, as: :to_h, **)
8
+ super(**)
9
+ @operation = operation
10
+ @as = as
11
+ end
12
+
13
+ def call result
14
+ result.bind do |payload|
15
+ value = operation.call payload
16
+
17
+ return Failure value if value.failure?
18
+
19
+ Success(as ? value.public_send(as) : value)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :operation, :as
26
+ end
27
+ end
28
+ end
data/lib/pipeable.rb CHANGED
@@ -1,7 +1,20 @@
1
- require "pipeable/version"
1
+ # frozen_string_literal: true
2
2
 
3
+ require "zeitwerk"
4
+
5
+ Zeitwerk::Loader.new.then do |loader|
6
+ loader.tag = File.basename __FILE__, ".rb"
7
+ loader.push_dir __dir__
8
+ loader.setup
9
+ end
10
+
11
+ # Main namespace.
3
12
  module Pipeable
4
- def pipe(&block)
5
- yield self
13
+ def self.included(descendant) = descendant.include Stepable.new
14
+
15
+ def self.loader registry = Zeitwerk::Registry
16
+ @loader ||= registry.loaders.find { |loader| loader.tag == File.basename(__FILE__, ".rb") }
6
17
  end
18
+
19
+ def self.with(...) = Stepable.new(...)
7
20
  end
data/pipeable.gemspec CHANGED
@@ -1,22 +1,34 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'pipeable/version'
1
+ # frozen_string_literal: true
5
2
 
6
3
  Gem::Specification.new do |spec|
7
- spec.name = "pipeable"
8
- spec.version = Pipeable::VERSION
9
- spec.authors = ["Brandon Weaver"]
10
- spec.email = ["keystonelemur@gmail.com"]
11
- spec.summary = %q{A Mock at Unix Piping in Ruby}
12
- spec.homepage = "https://www.github.com/baweaver/pipeable"
13
- spec.license = "MIT"
14
- spec.files = `git ls-files -z`.split("\x0")
15
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
- spec.require_paths = ["lib"]
4
+ spec.name = "pipeable"
5
+ spec.version = "0.1.0"
6
+ spec.authors = ["Brooke Kuhlmann"]
7
+ spec.email = ["brooke@alchemists.io"]
8
+ spec.homepage = "https://alchemists.io/projects/pipeable"
9
+ spec.summary = "An implementation of the Railway Pattern for functional composable pipelines."
10
+ spec.license = "Hippocratic-2.1"
18
11
 
19
- spec.add_development_dependency "bundler", "~> 1.5"
20
- spec.add_development_dependency "rake"
21
- spec.add_development_dependency "rspec"
12
+ spec.metadata = {
13
+ "bug_tracker_uri" => "https://github.com/bkuhlmann/pipeable/issues",
14
+ "changelog_uri" => "https://alchemists.io/projects/pipeable/versions",
15
+ "documentation_uri" => "https://alchemists.io/projects/pipeable",
16
+ "funding_uri" => "https://github.com/sponsors/bkuhlmann",
17
+ "label" => "Pipeable",
18
+ "rubygems_mfa_required" => "true",
19
+ "source_code_uri" => "https://github.com/bkuhlmann/pipeable"
20
+ }
21
+
22
+ spec.signing_key = Gem.default_key_path
23
+ spec.cert_chain = [Gem.default_cert_path]
24
+
25
+ spec.required_ruby_version = "~> 3.3"
26
+ spec.add_dependency "dry-container", "~> 0.11"
27
+ spec.add_dependency "dry-monads", "~> 1.6"
28
+ spec.add_dependency "marameters", "~> 3.2"
29
+ spec.add_dependency "refinements", "~> 12.1"
30
+ spec.add_dependency "zeitwerk", "~> 2.6"
31
+
32
+ spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
33
+ spec.files = Dir["*.gemspec", "lib/**/*"]
22
34
  end
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,99 +1,171 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipeable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Brandon Weaver
8
- autorequire:
7
+ - Brooke Kuhlmann
8
+ autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2014-01-31 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
14
+ a2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQBGRYC
15
+ aW8wHhcNMjMwMzIyMTYxNDQxWhcNMjUwMzIxMTYxNDQxWjBBMQ8wDQYDVQQDDAZi
16
+ cm9va2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQB
17
+ GRYCaW8wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCro8tj5/E1Hg88
18
+ f4qfiwPVd2zJQHvdYt4GHVvuHRRgx4HGhJuNp+4BId08RBn7V6V1MW6MY3kezRBs
19
+ M+7QOQ4b1xNLTvY7FYQB1wGK5a4x7TTokDrPYQxDB2jmsdDYCzVbIMrAvUfcecRi
20
+ khyGZCdByiiCl4fKv77P12tTT+NfsvXkLt/AYCGwjOUyGKTQ01Z6eC09T27GayPH
21
+ QQvIkakyFgcJtzSyGzs8bzK5q9u7wQ12MNTjJoXzW69lqp0oNvDylu81EiSUb5S6
22
+ QzzPxZBiRB1sgtbt1gUbVI262ZDq1gR+HxPFmp+Cgt7ZLIJZAtesQvtcMzseXpfn
23
+ hpmm0Sw22KGhRAy/mqHBRhDl5HqS1SJp2Ko3lcnpXeFResp0HNlt8NSu13vhC08j
24
+ GUHU9MyIXbFOsnp3K3ADrAVjPWop8EZkmUR3MV/CUm00w2cZHCSGiXl1KMpiVKvk
25
+ Ywr1gd2ZME4QLSo+EXUtLxDUa/W3xnBS8dBOuMMz02FPWYr3PN8CAwEAAaN7MHkw
26
+ CQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFAFgmv0tYMZnItuPycSM
27
+ F5wykJEVMB8GA1UdEQQYMBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMB8GA1UdEgQY
28
+ MBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMA0GCSqGSIb3DQEBCwUAA4IBgQAX+EGY
29
+ 9RLYGxF1VLZz+G1ACQc4uyrCB6kXwI06kzUa5dF9tPXqTX9ffnz3/W8ck2IQhKzu
30
+ MKO2FVijzbDWTsZeZGglS4E+4Jxpau1lU9HhOIcKolv6LeC6UdALTFudY+GLb8Xw
31
+ REXgaJkjzzhkUSILmEnRwEbY08dVSl7ZAaxVI679vfI2yapLlIwpbBgmQTiTvPr3
32
+ qyyLUno9flYEOv9fmGHunSrM+gE0/0niGTXa5GgXBXYGS2he4LQGgSBfGp/cTwMU
33
+ rDKJRcusZ12lNBeDfgqACz/BBJF8FLodgk6rGMRZz7+ZmjjHEmpG5bQpR6Q2BuWL
34
+ XMtYk/QzaWuhiR7pWjiF8jbdd7RO6or0ohq7iFkokz/5xrtQ/vPzU2RQ3Qc6YaKw
35
+ 3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
36
+ gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
37
+ -----END CERTIFICATE-----
38
+ date: 2024-03-03 00:00:00.000000000 Z
12
39
  dependencies:
13
40
  - !ruby/object:Gem::Dependency
14
- name: bundler
41
+ name: dry-container
15
42
  requirement: !ruby/object:Gem::Requirement
16
43
  requirements:
17
- - - ~>
44
+ - - "~>"
18
45
  - !ruby/object:Gem::Version
19
- version: '1.5'
20
- type: :development
46
+ version: '0.11'
47
+ type: :runtime
21
48
  prerelease: false
22
49
  version_requirements: !ruby/object:Gem::Requirement
23
50
  requirements:
24
- - - ~>
51
+ - - "~>"
25
52
  - !ruby/object:Gem::Version
26
- version: '1.5'
53
+ version: '0.11'
27
54
  - !ruby/object:Gem::Dependency
28
- name: rake
55
+ name: dry-monads
29
56
  requirement: !ruby/object:Gem::Requirement
30
57
  requirements:
31
- - - '>='
58
+ - - "~>"
32
59
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
60
+ version: '1.6'
61
+ type: :runtime
35
62
  prerelease: false
36
63
  version_requirements: !ruby/object:Gem::Requirement
37
64
  requirements:
38
- - - '>='
65
+ - - "~>"
39
66
  - !ruby/object:Gem::Version
40
- version: '0'
67
+ version: '1.6'
41
68
  - !ruby/object:Gem::Dependency
42
- name: rspec
69
+ name: marameters
43
70
  requirement: !ruby/object:Gem::Requirement
44
71
  requirements:
45
- - - '>='
72
+ - - "~>"
46
73
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
74
+ version: '3.2'
75
+ type: :runtime
49
76
  prerelease: false
50
77
  version_requirements: !ruby/object:Gem::Requirement
51
78
  requirements:
52
- - - '>='
79
+ - - "~>"
53
80
  - !ruby/object:Gem::Version
54
- version: '0'
55
- description:
81
+ version: '3.2'
82
+ - !ruby/object:Gem::Dependency
83
+ name: refinements
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '12.1'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '12.1'
96
+ - !ruby/object:Gem::Dependency
97
+ name: zeitwerk
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.6'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.6'
110
+ description:
56
111
  email:
57
- - keystonelemur@gmail.com
112
+ - brooke@alchemists.io
58
113
  executables: []
59
114
  extensions: []
60
- extra_rdoc_files: []
115
+ extra_rdoc_files:
116
+ - README.adoc
117
+ - LICENSE.adoc
61
118
  files:
62
- - .gitignore
63
- - .travis.yml
64
- - Gemfile
65
- - LICENSE.txt
66
- - README.md
67
- - Rakefile
119
+ - LICENSE.adoc
120
+ - README.adoc
68
121
  - lib/pipeable.rb
69
- - lib/pipeable/version.rb
122
+ - lib/pipeable/composable.rb
123
+ - lib/pipeable/pipe.rb
124
+ - lib/pipeable/stepable.rb
125
+ - lib/pipeable/steps/abstract.rb
126
+ - lib/pipeable/steps/as.rb
127
+ - lib/pipeable/steps/bind.rb
128
+ - lib/pipeable/steps/check.rb
129
+ - lib/pipeable/steps/container.rb
130
+ - lib/pipeable/steps/fmap.rb
131
+ - lib/pipeable/steps/insert.rb
132
+ - lib/pipeable/steps/map.rb
133
+ - lib/pipeable/steps/merge.rb
134
+ - lib/pipeable/steps/or.rb
135
+ - lib/pipeable/steps/tee.rb
136
+ - lib/pipeable/steps/to.rb
137
+ - lib/pipeable/steps/try.rb
138
+ - lib/pipeable/steps/use.rb
139
+ - lib/pipeable/steps/validate.rb
70
140
  - pipeable.gemspec
71
- - spec/pipeable_spec.rb
72
- - spec/spec_helper.rb
73
- homepage: https://www.github.com/baweaver/pipeable
141
+ homepage: https://alchemists.io/projects/pipeable
74
142
  licenses:
75
- - MIT
76
- metadata: {}
77
- post_install_message:
143
+ - Hippocratic-2.1
144
+ metadata:
145
+ bug_tracker_uri: https://github.com/bkuhlmann/pipeable/issues
146
+ changelog_uri: https://alchemists.io/projects/pipeable/versions
147
+ documentation_uri: https://alchemists.io/projects/pipeable
148
+ funding_uri: https://github.com/sponsors/bkuhlmann
149
+ label: Pipeable
150
+ rubygems_mfa_required: 'true'
151
+ source_code_uri: https://github.com/bkuhlmann/pipeable
152
+ post_install_message:
78
153
  rdoc_options: []
79
154
  require_paths:
80
155
  - lib
81
156
  required_ruby_version: !ruby/object:Gem::Requirement
82
157
  requirements:
83
- - - '>='
158
+ - - "~>"
84
159
  - !ruby/object:Gem::Version
85
- version: '0'
160
+ version: '3.3'
86
161
  required_rubygems_version: !ruby/object:Gem::Requirement
87
162
  requirements:
88
- - - '>='
163
+ - - ">="
89
164
  - !ruby/object:Gem::Version
90
165
  version: '0'
91
166
  requirements: []
92
- rubyforge_project:
93
- rubygems_version: 2.2.1
94
- signing_key:
167
+ rubygems_version: 3.5.6
168
+ signing_key:
95
169
  specification_version: 4
96
- summary: A Mock at Unix Piping in Ruby
97
- test_files:
98
- - spec/pipeable_spec.rb
99
- - spec/spec_helper.rb
170
+ summary: An implementation of the Railway Pattern for functional composable pipelines.
171
+ test_files: []
metadata.gz.sig ADDED
Binary file
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
data/.travis.yml DELETED
@@ -1 +0,0 @@
1
- language: ruby
data/Gemfile DELETED
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pipeable.gemspec
4
- gemspec
5
- gem 'coveralls', require: false
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2014 Brandon Weaver
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,46 +0,0 @@
1
- # Pipeable
2
-
3
- A play at Unix Piping in Ruby for kicks. It helps to break up some more exotic logic and chaining.
4
-
5
- It can be used to play with a value in a method chain and return whatever you want out of the block. Personally I'm
6
- still toying with how it can be used and working to find clever tricks with it.
7
-
8
- _That being said, this is a 5 minute hack. You've been warned._
9
-
10
- Piping is simple, we take the object and put a pipe on it:
11
- ```ruby
12
- 1.pipe { |x| "#{x} is great!" }
13
- # => '1 is great!'
14
- ```
15
-
16
- How do you get going with pipe?
17
- ```ruby
18
- include Pipeable
19
- ```
20
- ...and your object is ready to go!
21
-
22
- ## Installation
23
-
24
- Add this line to your application's Gemfile:
25
-
26
- gem 'pipeable'
27
-
28
- And then execute:
29
-
30
- $ bundle
31
-
32
- Or install it yourself as:
33
-
34
- $ gem install pipeable
35
-
36
- ## Usage
37
-
38
- Slap a pipe on the end of it!
39
-
40
- ## Contributing
41
-
42
- 1. Fork it ( http://github.com/baweaver/pipeable/fork )
43
- 2. Create your feature branch (`git checkout -b my-new-feature`)
44
- 3. Commit your changes (`git commit -am 'Add some feature'`)
45
- 4. Push to the branch (`git push origin my-new-feature`)
46
- 5. Create new Pull Request
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"