ov 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 680d9c554fc5e652b5a39ce3b8f5e032e61f0909
4
- data.tar.gz: 02692a0a2e5f41156ef406813bccca36b4f2d0a9
3
+ metadata.gz: 2a8c79de0b03e449c81d57dd343ca495ea2ce6de
4
+ data.tar.gz: ee617eb2f68fdaa704ccda36f462f393c9a7955c
5
5
  SHA512:
6
- metadata.gz: eef0b62ea689f296e39c79ffe803d6aaf75f0ff1ed039b2d8b6b50b24c526492cc59456db57a669999a3612fbd28340c0d575d1267ef7bd2edb8899b89a958b2
7
- data.tar.gz: c47c21193d7bd5b66e87fa90f6d118886cfcfa69ff8e121d892db0bc2c51ea659d4c3ea88aaa5018e05b25c60897d22551e919edbdbc0bec1feb19083ed7a158
6
+ metadata.gz: bc98e314109927c96c1bf543491448c8a027cc0ad081d593072ae85e8e3f3d2d2b5c792adaf014099ed3d25a3353ce81996b8005df6972927b5a8b9ad77df6cd
7
+ data.tar.gz: c4a1bd66e76174296c7bbd03a1753607b5606ec6f242b71219b1727fa20661fa8df35a98acdb709d539fcc495be58619ebba520ef1fe72e5d2f33cbc86a409e6
data/README.md CHANGED
@@ -16,6 +16,72 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install ov
18
18
 
19
+
20
+ ## Some examples:
21
+
22
+ ```ruby
23
+ require 'ov'
24
+
25
+ # ====== Define methods
26
+
27
+ class Foo
28
+ include Ov
29
+
30
+ let :foo, String do |str|
31
+ # some code
32
+ end
33
+ end
34
+
35
+ foo = Foo.new
36
+ foo.foo("foo") # => ok
37
+ foo.foo(123) # => Method `foo` in `#<Foo:0x007fe423c19dc8>` class with types `Fixnum` not implemented. (Ov::NotImplementError)
38
+
39
+ # ====== Custom Equality for Ruby Types
40
+
41
+
42
+ class String
43
+ include Ov
44
+ let :is_equal, String do |str|
45
+ self == str
46
+ end
47
+
48
+ let :is_equal, Any do |other|
49
+ raise TypeError.new("Only for string")
50
+ end
51
+ end
52
+
53
+ str = "foo"
54
+
55
+ p str == 123 # false, but this different types
56
+ p str.is_equal("bar") # false
57
+ p str.is_equal("foo") # true
58
+ p str.is_equal(123) # TypeError
59
+
60
+
61
+ # ====== Use Ov::Ext for matching
62
+
63
+ require 'kleisli'
64
+
65
+ include Ov::Ext
66
+
67
+ match(Try{1/0}) {
68
+ try(Kleisli::Try::Success) { puts "ok" }
69
+ try(Kleisli::Try::Failure) { puts "error" }
70
+ }
71
+
72
+ result = match(Net::HTTP.get_response(URI("http://google.com"))) do
73
+ try(Net::HTTPOK) {|r| r.header }
74
+ try(Net::HTTPMovedPermanently) {|r| r.header }
75
+ otherwise { "error" }
76
+ end
77
+
78
+ puts result
79
+
80
+ ```
81
+
82
+
83
+
84
+
19
85
  ## Usage
20
86
 
21
87
  Firstly include `Ov` in you class
@@ -109,10 +175,69 @@ b.test(123) # => only for fixnum
109
175
 
110
176
  ```
111
177
 
178
+ Call method:
179
+
180
+ ```ruby
181
+
182
+ class A
183
+ include Ov
184
+
185
+ let :test, Fixnum do |num|
186
+ test("#{num}") # call with string argument
187
+ end
188
+
189
+ let :test, String do |str|
190
+ p str
191
+ end
192
+ end
193
+
194
+ a = A.new
195
+ a.test(123) # => "123"
196
+
197
+ ```
198
+
199
+
200
+ Work with blocks
201
+
202
+ ```ruby
203
+ class MyClass
204
+ include Ov
205
+ let :my_method, Fixnum do |num, block| # instead of |num, &block|
206
+ p num
207
+ block.call
208
+ end
209
+ end
210
+
211
+ MyClass.new.my_method(1) do
212
+ p "123"
213
+ end
214
+ # => 1
215
+ # => 123
216
+ ```
217
+
112
218
  Examples
113
219
  --------
114
220
  see [link](https://github.com/fntzr/ov/blob/master/samples)
115
221
 
222
+ ## TODO
223
+
224
+ 1. work with symbol method names: `+, -, *, etc`
225
+ 2. some ideas
226
+
227
+ ```ruby
228
+ # multiple arguments
229
+ let :test, Fixnum, [String] # signature: Fixnum, and others must be String
230
+
231
+ let :test, Multiple #any types
232
+
233
+ let :test, :foo # Type must have :foo method
234
+
235
+ let :test, Or[Fixnum, String] # work for String or Fixnum
236
+
237
+ ```
238
+
239
+
240
+
116
241
  ## Contributing
117
242
 
118
243
  1. Fork it
data/lib/ov.rb CHANGED
@@ -3,7 +3,7 @@ require "ov/ov_array"
3
3
  require "ov/ov_method"
4
4
  require "ov/ov_any"
5
5
  require "ov/exception"
6
-
6
+ require 'ov/ext/matching'
7
7
 
8
8
  ##
9
9
  # `Ov` module provides functional for creating methods
@@ -74,6 +74,25 @@ require "ov/exception"
74
74
  # MyClass.cool_method(1) #=> 2
75
75
  # MyClass.cool_method("test") #=> "test"
76
76
  #
77
+ #
78
+ # == Work with blocks
79
+ #
80
+ # Blocks, should be pass given without ampersand (&)
81
+ #
82
+ # class MyClass
83
+ #
84
+ # let :my_method, Fixnum do |num, block| # instead of |num, &block|
85
+ # p num
86
+ # block.call
87
+ # end
88
+ #
89
+ # end
90
+ #
91
+ # MyClass.new.my_method(1) do
92
+ # p "123"
93
+ # end
94
+ # # => 1
95
+ # # => 123
77
96
  module Ov
78
97
 
79
98
  def self.included(base) # :nodoc:
@@ -98,7 +117,7 @@ module Ov
98
117
  #
99
118
  def let(name, *types, &block)
100
119
  included = false
101
-
120
+
102
121
  if self.instance_methods.include?(name)
103
122
  included = true
104
123
  class_eval "alias :ov_old_#{name.to_s} #{name}"
@@ -129,7 +148,9 @@ module Ov
129
148
  raise Ov::NotImplementError.new("Method `#{name}` in `#{self}` class with types `#{types.join(', ')}` not implemented.")
130
149
  end
131
150
  else
132
- instance_exec(*args, &z.body)
151
+ k = *args
152
+ k << block if !block.nil?
153
+ instance_exec(*k, &z.body)
133
154
  end
134
155
  end
135
156
  end
@@ -0,0 +1,38 @@
1
+ module Ov
2
+ module Ext
3
+ #
4
+ # Add `match` method, which work like `case` statement but for types
5
+ #
6
+ # == Usage
7
+ #
8
+ # include Ov::Ext
9
+ #
10
+ # match("String", "dsa") do
11
+ # try(String, Array) {|str, arr| "#{str} #{arr}" }
12
+ # try(String) {|str| "#{str}" }
13
+ # otherwise { "none" }
14
+ # end
15
+ #
16
+ #
17
+ def match(*args, &block)
18
+ z = Module.new do
19
+ include Ov
20
+ extend self
21
+ def try(*args, &block)
22
+ let :anon_method, *args, &block
23
+ end
24
+ def otherwise(&block)
25
+ let :otherwise, &block
26
+ end
27
+ instance_eval &block
28
+ end
29
+ begin
30
+ z.anon_method(*args)
31
+ rescue Ov::NotImplementError => e
32
+ z.otherwise
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+
@@ -1,3 +1,3 @@
1
1
  module Ov
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,28 +1,8 @@
1
1
  require "ov"
2
2
 
3
- module Matching
4
- def match(*args, &block)
5
- z = Module.new do
6
- include Ov
7
- extend self
8
- def try(*args, &block)
9
- let :anon_method, *args, &block
10
- end
11
- def otherwise(&block)
12
- let :otherwise, &block
13
- end
14
- instance_eval &block
15
- end
16
- begin
17
- z.anon_method(*args)
18
- rescue Ov::NotImplementError => e
19
- z.otherwise
20
- end
21
- end
22
- end
23
3
 
24
4
 
25
- include Matching
5
+ include Ov::Ext
26
6
 
27
7
 
28
8
 
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ov::Ext do
4
+
5
+ include Ov::Ext
6
+
7
+ it "#match method" do
8
+ result = match("String", [123]) do
9
+ try(String, Array) {|str, arr| 1 }
10
+ try(String) {|str| 2 }
11
+ otherwise { 3 }
12
+ end
13
+
14
+ expect(result).to eq(1)
15
+ end
16
+ end
17
+
18
+
19
+
@@ -80,7 +80,7 @@ end
80
80
 
81
81
  module TestModule
82
82
  include Ov
83
- extend self
83
+
84
84
 
85
85
  let :my_instance_method, Array, String do |arr, str|
86
86
  arr << str
@@ -96,3 +96,18 @@ module TestModule
96
96
  end
97
97
  end
98
98
 
99
+ class ClassWithBlock
100
+ include Ov
101
+
102
+
103
+ let :test, Fixnum do |num, block|
104
+ num + block.call
105
+ end
106
+
107
+ class << self
108
+ include Ov
109
+ let :test, String do |str, block|
110
+ str << block.call
111
+ end
112
+ end
113
+ end
@@ -152,6 +152,26 @@ describe Ov do
152
152
  end
153
153
  end
154
154
  end
155
+
156
+ describe "work with blocks" do
157
+ let(:instance){ClassWithBlock.new}
158
+ let(:klass){ClassWithBlock}
159
+
160
+ it "should pass block in instance method" do
161
+ result = instance.test(3) do
162
+ 3
163
+ end
164
+ expect(result).to eq(6)
165
+ end
166
+
167
+ it "should pass block in class method" do
168
+ result = klass.test("foo") do
169
+ "bar"
170
+ end
171
+ expect(result).to eq("foobar")
172
+ end
173
+ end
174
+
155
175
  end
156
176
 
157
177
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - fntzr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-06 00:00:00.000000000 Z
11
+ date: 2014-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,7 @@ files:
66
66
  - Rakefile
67
67
  - lib/ov.rb
68
68
  - lib/ov/exception.rb
69
+ - lib/ov/ext/matching.rb
69
70
  - lib/ov/ov_any.rb
70
71
  - lib/ov/ov_array.rb
71
72
  - lib/ov/ov_method.rb
@@ -77,6 +78,7 @@ files:
77
78
  - samples/pm.rb
78
79
  - samples/rack.rb
79
80
  - samples/service.rb
81
+ - spec/fixtures/ext_spec.rb
80
82
  - spec/fixtures/fixture_classes.rb
81
83
  - spec/override_spec.rb
82
84
  - spec/spec_helper.rb
@@ -100,12 +102,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
102
  version: '0'
101
103
  requirements: []
102
104
  rubyforge_project:
103
- rubygems_version: 2.2.2
105
+ rubygems_version: 2.4.5
104
106
  signing_key:
105
107
  specification_version: 4
106
108
  summary: ov gem provides hacks for write multimemethods in Ruby.
107
109
  test_files:
110
+ - spec/fixtures/ext_spec.rb
108
111
  - spec/fixtures/fixture_classes.rb
109
112
  - spec/override_spec.rb
110
113
  - spec/spec_helper.rb
111
- has_rdoc: