chainable_methods 0.1.3 → 0.2.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 +4 -4
- data/README.md +42 -20
- data/bin/console +1 -0
- data/chainable_methods.gemspec +5 -2
- data/fixtures/vcr_cassettes/github-test.yml +1533 -0
- data/lib/chainable_methods.rb +29 -24
- data/lib/chainable_methods/version.rb +1 -1
- metadata +65 -4
data/lib/chainable_methods.rb
CHANGED
@@ -1,42 +1,52 @@
|
|
1
1
|
require "chainable_methods/version"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# easier shortcut
|
4
|
+
def CM(initial_state, context = ChainableMethods::Nil)
|
5
|
+
ChainableMethods::Link.new(initial_state, context)
|
6
|
+
end
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
module ChainableMethods
|
9
|
+
# TODO placeholder context to always delegate method missing to the state object
|
10
|
+
module Nil; end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(self)
|
14
|
+
begin
|
15
|
+
# this way the module doesn't have to declare all methods as class methods
|
16
|
+
base.extend(base) if base.kind_of?(Module)
|
17
|
+
rescue TypeError
|
18
|
+
# wrong argument type Class (expected Module)
|
19
|
+
end
|
10
20
|
end
|
11
21
|
|
12
|
-
def
|
22
|
+
def chain_from(initial_state, context = self)
|
13
23
|
ChainableMethods::Link.new(initial_state, context)
|
14
24
|
end
|
15
25
|
|
16
26
|
class Link
|
17
|
-
attr_reader :state, :context
|
18
|
-
|
19
27
|
def initialize(object, context)
|
20
28
|
@state = object
|
21
29
|
@context = context
|
22
30
|
end
|
23
31
|
|
24
32
|
def chain(&block)
|
25
|
-
new_state = block.call(state)
|
26
|
-
ChainableMethods::Link.new( new_state, context )
|
33
|
+
new_state = block.call(@state)
|
34
|
+
ChainableMethods::Link.new( new_state, @context )
|
27
35
|
end
|
28
36
|
|
29
|
-
def method_missing(
|
30
|
-
local_response = state.respond_to?(
|
31
|
-
context_response = context.respond_to?(
|
37
|
+
def method_missing(method_name, *args, &block)
|
38
|
+
local_response = @state.respond_to?(method_name)
|
39
|
+
context_response = @context.respond_to?(method_name)
|
32
40
|
|
33
41
|
# if the state itself has the means to respond, delegate to it
|
34
42
|
# but if the context has the behavior, it has priority over the delegation
|
35
|
-
if local_response && !context_response
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
new_state = if local_response && !context_response
|
44
|
+
@state.send(method_name, *args, &block)
|
45
|
+
else
|
46
|
+
@context.send(method_name, *args.unshift(@state), &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
ChainableMethods::Link.new( new_state, @context )
|
40
50
|
end
|
41
51
|
|
42
52
|
def unwrap
|
@@ -44,8 +54,3 @@ module ChainableMethods
|
|
44
54
|
end
|
45
55
|
end
|
46
56
|
end
|
47
|
-
|
48
|
-
# easier shortcut
|
49
|
-
def CM(initial_state, context = ChainableMethods::Nil)
|
50
|
-
ChainableMethods.wrap(context, initial_state)
|
51
|
-
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chainable_methods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AkitaOnRails
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,11 +52,28 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.3
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: nokogiri
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.6'
|
76
|
+
- - ">="
|
60
77
|
- !ruby/object:Gem::Version
|
61
78
|
version: 1.6.8
|
62
79
|
type: :development
|
@@ -64,8 +81,51 @@ dependencies:
|
|
64
81
|
version_requirements: !ruby/object:Gem::Requirement
|
65
82
|
requirements:
|
66
83
|
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '1.6'
|
86
|
+
- - ">="
|
67
87
|
- !ruby/object:Gem::Version
|
68
88
|
version: 1.6.8
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: vcr
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.0'
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 3.0.3
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '3.0'
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 3.0.3
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: webmock
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '2.1'
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 2.1.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2.1'
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: 2.1.0
|
69
129
|
description: The idea is to allow for a more functional way of organizing code within
|
70
130
|
a module and being able to chain those methdos together, where the result of the
|
71
131
|
first method serves as the first argument of the next method in the chain.
|
@@ -85,6 +145,7 @@ files:
|
|
85
145
|
- bin/console
|
86
146
|
- bin/setup
|
87
147
|
- chainable_methods.gemspec
|
148
|
+
- fixtures/vcr_cassettes/github-test.yml
|
88
149
|
- lib/chainable_methods.rb
|
89
150
|
- lib/chainable_methods/version.rb
|
90
151
|
homepage: http://www.codeminer42.com
|
@@ -110,6 +171,6 @@ rubyforge_project:
|
|
110
171
|
rubygems_version: 2.5.1
|
111
172
|
signing_key:
|
112
173
|
specification_version: 4
|
113
|
-
summary: Just a simple experiment to allow for a behavior similar to Elixir's
|
114
|
-
Operator but within Ruby's semantics.
|
174
|
+
summary: Just a simple experiment to allow for a behavior similar to [Elixir|Haskell|F#]'s
|
175
|
+
Pipe Operator but within Ruby's semantics.
|
115
176
|
test_files: []
|