lazy_object 0.0.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/.ruby-version +1 -1
- data/lazy_object.gemspec +9 -8
- data/lib/lazy_object.rb +12 -8
- data/spec/lazy_object_spec.rb +69 -6
- data/spec/spec_helper.rb +2 -0
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da5663885eb9cd9651c97f3433ffe9b0b69f2f305bbf8d2d4c2a3fa29364cfbb
|
4
|
+
data.tar.gz: 5dcd597961dfd4e68160f831e2730099ffd7e9969414d6eebb6aa95470bfa91a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fab73e859d5c5a19dc4588e519864762e16a5548b8454d0b758240f482493136d3527b9e3f04af4914f127a2bf23de582164801221dfe7f16ee8ec673a11a41
|
7
|
+
data.tar.gz: 57f3aa04c035ba86bb4431864a33e706af8fa225c13b564cbb60fe4e564107b5af8c838ff6448ead2ba0d10c3af27069d0e2dae1125a6805844aa58948f63478
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0
|
data/lazy_object.gemspec
CHANGED
@@ -4,14 +4,15 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'lazy_object'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
11
|
-
spec.summary
|
12
|
-
spec.description
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
7
|
+
spec.name = "lazy_object"
|
8
|
+
spec.version = LazyObject.version
|
9
|
+
spec.authors = ["Arthur Shagall", "Sergey Potapov"]
|
10
|
+
spec.email = ["arthur.shagall@gmail.com"]
|
11
|
+
spec.summary = %q{Lazily initialized object wrapper.}
|
12
|
+
spec.description = %q{It's an object wrapper that forwards all calls to the reference object. This object is not created until the first method dispatch.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">= 3.0.0"
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0")
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
data/lib/lazy_object.rb
CHANGED
@@ -10,19 +10,19 @@
|
|
10
10
|
# lazy.get_expensive_results(foo, bar) # Initializes VeryExpensiveObject and calls 'get_expensive_results' on it, passing in foo and bar
|
11
11
|
class LazyObject < BasicObject
|
12
12
|
def self.version
|
13
|
-
'0.0
|
13
|
+
'0.2.0'
|
14
14
|
end
|
15
15
|
|
16
16
|
def initialize(&callable)
|
17
17
|
@__callable__ = callable
|
18
18
|
end
|
19
19
|
|
20
|
-
def ==(
|
21
|
-
__target_object__ ==
|
20
|
+
def ==(other)
|
21
|
+
__target_object__ == other
|
22
22
|
end
|
23
23
|
|
24
|
-
def !=(
|
25
|
-
__target_object__ !=
|
24
|
+
def !=(other)
|
25
|
+
__target_object__ != other
|
26
26
|
end
|
27
27
|
|
28
28
|
def !
|
@@ -31,11 +31,15 @@ class LazyObject < BasicObject
|
|
31
31
|
|
32
32
|
# Cached target object.
|
33
33
|
def __target_object__
|
34
|
-
@__target_object__
|
34
|
+
if defined?(@__target_object__)
|
35
|
+
@__target_object__
|
36
|
+
else
|
37
|
+
@__target_object__ = @__callable__.call
|
38
|
+
end
|
35
39
|
end
|
36
40
|
|
37
41
|
# Forwards all method calls to the target object.
|
38
|
-
def method_missing(method_name,
|
39
|
-
__target_object__.send(method_name,
|
42
|
+
def method_missing(method_name, ...)
|
43
|
+
__target_object__.send(method_name, ...)
|
40
44
|
end
|
41
45
|
end
|
data/spec/lazy_object_spec.rb
CHANGED
@@ -8,26 +8,89 @@ RSpec.describe LazyObject do
|
|
8
8
|
def method_with_yield(foo)
|
9
9
|
yield foo
|
10
10
|
end
|
11
|
+
|
12
|
+
def method_with_kwargs(**kwargs)
|
13
|
+
kwargs
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_with_kwargs_and_block(**kwargs, &block)
|
17
|
+
block.call **kwargs
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_with_kwargs_and_yield(**kwargs)
|
21
|
+
yield **kwargs
|
22
|
+
end
|
11
23
|
end
|
12
24
|
|
13
25
|
let(:lazy_object) {
|
14
26
|
LazyObject.new do
|
15
|
-
targ
|
27
|
+
targ = TargetObject.new
|
16
28
|
targ.value = :foo
|
17
29
|
targ
|
18
30
|
end
|
19
31
|
}
|
20
32
|
|
21
|
-
it
|
22
|
-
expect(
|
33
|
+
it "should call the init block and forward methods to the target object" do
|
34
|
+
expect(lazy_object.value).to eq(:foo)
|
23
35
|
lazy_object.value = :bar
|
24
|
-
expect(
|
36
|
+
expect(lazy_object.value).to eq(:bar)
|
37
|
+
|
38
|
+
expect(
|
39
|
+
lazy_object.method_with_yield(:baz) { |foo| "--#{foo}--" }
|
40
|
+
).to eq("--baz--")
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when target object methods use keyword arguments" do
|
44
|
+
subject(:target_method) { lazy_object.method_with_kwargs(foo: "bar") }
|
45
|
+
|
46
|
+
let(:lazy_object) { LazyObject.new { TargetObject.new } }
|
47
|
+
|
48
|
+
it "should not raise an exception and properly delegate to the target object" do
|
49
|
+
expect { target_method }.not_to raise_exception
|
50
|
+
expect(target_method).to eq({ foo: "bar" })
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when target object uses kwargs and a block" do
|
55
|
+
let(:lazy_object) { LazyObject.new { TargetObject.new } }
|
25
56
|
|
26
|
-
|
57
|
+
it "will delegate the call to the block" do
|
58
|
+
result = lazy_object.method_with_kwargs_and_block(foo: "bar") { |foo:| { bar: foo.reverse } }
|
59
|
+
|
60
|
+
expect(result).to eq({ bar: "rab" })
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when target object uses kwargs and an implicit block" do
|
65
|
+
let(:lazy_object) { LazyObject.new { TargetObject.new } }
|
66
|
+
|
67
|
+
it "will delegate the call to the block" do
|
68
|
+
result = lazy_object.method_with_kwargs_and_yield(foo: "bar") { |foo:| { bar: foo.reverse } }
|
69
|
+
|
70
|
+
expect(result).to eq({ bar: "rab" })
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when target object evaluates to a falsy value" do
|
75
|
+
let(:lazy_object) { LazyObject.new { TargetObject.new } }
|
76
|
+
|
77
|
+
it "evaluates the block exactly once for false" do
|
78
|
+
TargetObject.should_receive(:new).once.and_return(false)
|
79
|
+
3.times do
|
80
|
+
expect(lazy_object).to eq(false)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "evaluates the block exactly once for nil" do
|
85
|
+
TargetObject.should_receive(:new).once.and_return(nil)
|
86
|
+
3.times do
|
87
|
+
expect(lazy_object).to eq(nil)
|
88
|
+
end
|
89
|
+
end
|
27
90
|
end
|
28
91
|
|
29
92
|
context "equality operators" do
|
30
|
-
it
|
93
|
+
it "should return correct value when comparing" do
|
31
94
|
one = LazyObject.new { 1 }
|
32
95
|
expect(one).to eq(1)
|
33
96
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arthur Shagall
|
8
8
|
- Sergey Potapov
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-08-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -77,7 +77,7 @@ homepage: ''
|
|
77
77
|
licenses:
|
78
78
|
- MIT
|
79
79
|
metadata: {}
|
80
|
-
post_install_message:
|
80
|
+
post_install_message:
|
81
81
|
rdoc_options: []
|
82
82
|
require_paths:
|
83
83
|
- lib
|
@@ -85,16 +85,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
88
|
+
version: 3.0.0
|
89
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
91
|
- - ">="
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
95
|
-
|
96
|
-
|
97
|
-
signing_key:
|
95
|
+
rubygems_version: 3.2.33
|
96
|
+
signing_key:
|
98
97
|
specification_version: 4
|
99
98
|
summary: Lazily initialized object wrapper.
|
100
99
|
test_files:
|