ryo.rb 0.5.3 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/specs.yml +2 -2
- data/README.md +6 -7
- data/Rakefile.rb +13 -0
- data/lib/ryo/reflect.rb +2 -2
- data/lib/ryo/version.rb +1 -1
- data/lib/ryo/yaml.rb +45 -0
- data/ryo.rb.gemspec +1 -0
- data/spec/ryo_json_spec.rb +31 -13
- data/spec/ryo_yaml_spec.rb +44 -0
- metadata +6 -4
- data/.gitlab-ci.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c611c0e990fe0cdfd09ede551e1b457e93af7765de379d64b5dbdf6495e2b766
|
4
|
+
data.tar.gz: 24406b552991b2459da63847ff4b65071eb2e03cd846956e4a030f506fd5b908
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28dca6bc48b5aab85c3e08698a60e460142114623b3f914db25bbe83fa767cdd70bcb8bb4bf68d07188cc884840d696cbba81b96683d10a690d939979e0f5dfc
|
7
|
+
data.tar.gz: 325e58af48dc0cc6e85344ecedc006b6b331a2011432bc76069c374288bd676d2d918eee9807ee0194e8d2e31c0fe1dcbeda38b9c6a0f8982a1ea26ca0588457
|
data/.github/workflows/specs.yml
CHANGED
@@ -12,7 +12,7 @@ jobs:
|
|
12
12
|
fail-fast: false
|
13
13
|
matrix:
|
14
14
|
os: [ubuntu-latest]
|
15
|
-
ruby: [3.
|
15
|
+
ruby: [3.2, 3.3]
|
16
16
|
runs-on: ${{ matrix.os }}
|
17
17
|
steps:
|
18
18
|
- uses: actions/checkout@v2
|
@@ -20,4 +20,4 @@ jobs:
|
|
20
20
|
with:
|
21
21
|
ruby-version: ${{ matrix.ruby }}
|
22
22
|
- run: bundle install
|
23
|
-
- run:
|
23
|
+
- run: rake ci
|
data/README.md
CHANGED
@@ -301,17 +301,16 @@ p ryo.then { 34 } # => 34
|
|
301
301
|
#### Duck typing
|
302
302
|
|
303
303
|
The documentation has used simple terms to describe the objects that Ryo works
|
304
|
-
with: Hash and Array objects. But
|
305
|
-
that implements `#each_pair`
|
306
|
-
implements `#each`
|
304
|
+
with: Hash and Array objects. But that doesn't quite capture the fact that Ryo
|
305
|
+
uses duck typing: any object that implements `#each_pair` is similar to a Hash,
|
306
|
+
and any object that implements `#each` is similar to an Array. Note that only
|
307
307
|
[Ryo.from](https://0x1eef.github.io/x/ryo.rb/Ryo.html#from-class_method),
|
308
308
|
[Ryo::Object.from](https://0x1eef.github.io/x/ryo.rb/Ryo/Object.html#from-class_method)
|
309
309
|
and
|
310
310
|
[Ryo::BasicObject.from](https://0x1eef.github.io/x/ryo.rb/Ryo/BasicObject.html#from-class_method)
|
311
|
-
can handle Array
|
311
|
+
can handle Array-like objects.
|
312
312
|
|
313
|
-
|
314
|
-
`#each_pair`, into a Ryo object:
|
313
|
+
The following example implements `#each_pair`:
|
315
314
|
|
316
315
|
``` ruby
|
317
316
|
require "ryo"
|
@@ -353,7 +352,7 @@ Ryo can be installed via rubygems.org:
|
|
353
352
|
|
354
353
|
Thanks to
|
355
354
|
[@awfulcooking (mooff)](https://github.com/awfulcooking)
|
356
|
-
for the helpful discussions
|
355
|
+
for the helpful discussions
|
357
356
|
|
358
357
|
## License
|
359
358
|
|
data/Rakefile.rb
ADDED
data/lib/ryo/reflect.rb
CHANGED
@@ -220,9 +220,9 @@ module Ryo::Reflect
|
|
220
220
|
#
|
221
221
|
# @return [::Object, ::BasicObject]
|
222
222
|
# Returns the return value of the method call.
|
223
|
-
def call_method(ryo, method,
|
223
|
+
def call_method(ryo, method, *, &b)
|
224
224
|
kernel(:__send__)
|
225
|
-
.bind_call(ryo, method,
|
225
|
+
.bind_call(ryo, method, *, &b)
|
226
226
|
end
|
227
227
|
|
228
228
|
##
|
data/lib/ryo/version.rb
CHANGED
data/lib/ryo/yaml.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
##
|
4
|
+
# The {Ryo::YAML Ryo::YAML} module provides a number of methods
|
5
|
+
# for coercing YAML data into a Ryo object. It must be required
|
6
|
+
# separately to Ryo (ie: require "ryo/yaml"), and the methods of
|
7
|
+
# this module are then available on the {Ryo Ryo} module.
|
8
|
+
module Ryo::YAML
|
9
|
+
require "yaml"
|
10
|
+
extend self
|
11
|
+
|
12
|
+
##
|
13
|
+
# @example
|
14
|
+
# Ryo.from_yaml(path: "/foo/bar/baz.yaml")
|
15
|
+
# Ryo.from_yaml(string: "---\nfoo: bar\n")
|
16
|
+
#
|
17
|
+
# @param [String] path
|
18
|
+
# The path to a YAML file
|
19
|
+
#
|
20
|
+
# @param [String] string
|
21
|
+
# A blob of YAML
|
22
|
+
#
|
23
|
+
# @param [Ryo] object
|
24
|
+
# {Ryo::Object Ryo::Object}, or {Ryo::BasicObject Ryo::BasicObject}
|
25
|
+
# Defaults to {Ryo::Object Ryo::Object}
|
26
|
+
#
|
27
|
+
# @raise [SystemCallError]
|
28
|
+
# Might raise a number of Errno exceptions
|
29
|
+
#
|
30
|
+
# @return [Ryo::Object, Ryo::BasicObject]
|
31
|
+
# Returns a Ryo object
|
32
|
+
def from_yaml(path: nil, string: nil, object: Ryo::Object)
|
33
|
+
if path && string
|
34
|
+
raise ArgumentError, "Provide a path or string but not both"
|
35
|
+
elsif path
|
36
|
+
object.from YAML.load_file(path)
|
37
|
+
elsif string
|
38
|
+
object.from YAML.load(string)
|
39
|
+
else
|
40
|
+
raise ArgumentError, "No path or string provided"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Ryo.extend(self)
|
45
|
+
end
|
data/ryo.rb.gemspec
CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.require_paths = ["lib"]
|
13
13
|
gem.description = "Ryo implements prototype-based inheritance, in Ruby"
|
14
14
|
gem.summary = gem.description
|
15
|
+
gem.required_ruby_version = ">= 3.2"
|
15
16
|
gem.add_development_dependency "yard", "~> 0.9"
|
16
17
|
gem.add_development_dependency "redcarpet", "~> 3.5"
|
17
18
|
gem.add_development_dependency "rspec", "~> 3.10"
|
data/spec/ryo_json_spec.rb
CHANGED
@@ -5,22 +5,40 @@ require "ryo/json"
|
|
5
5
|
require "fileutils"
|
6
6
|
|
7
7
|
RSpec.describe Ryo::JSON do
|
8
|
-
describe ".
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
describe ".from_json" do
|
9
|
+
context "with a path" do
|
10
|
+
subject(:ryo) { described_class.from_json(path:, object:) }
|
11
|
+
before { File.binwrite path, JSON.dump(x: 20, y: 40) }
|
12
|
+
after { FileUtils.rm(path) }
|
13
|
+
let(:path) { File.join(__dir__, "test.json") }
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
context "with Ryo::Object" do
|
16
|
+
let(:object) { Ryo::Object }
|
17
|
+
it { is_expected.to be_instance_of(Ryo::Object) }
|
18
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with Ryo::BasicObject" do
|
22
|
+
let(:object) { Ryo::BasicObject }
|
23
|
+
it { expect(Ryo::BasicObject === ryo).to be(true) }
|
24
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
|
-
context "with
|
21
|
-
|
22
|
-
|
23
|
-
|
28
|
+
context "with a string" do
|
29
|
+
subject(:ryo) { described_class.from_json(string: "{\"x\": 20, \"y\": 40}", object:) }
|
30
|
+
|
31
|
+
context "with Ryo::Object" do
|
32
|
+
let(:object) { Ryo::Object }
|
33
|
+
it { is_expected.to be_instance_of(Ryo::Object) }
|
34
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with Ryo::BasicObject" do
|
38
|
+
let(:object) { Ryo::BasicObject }
|
39
|
+
it { expect(Ryo::BasicObject === ryo).to be(true) }
|
40
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
41
|
+
end
|
24
42
|
end
|
25
43
|
end
|
26
44
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "setup"
|
4
|
+
require "ryo/yaml"
|
5
|
+
require "fileutils"
|
6
|
+
|
7
|
+
RSpec.describe Ryo::YAML do
|
8
|
+
describe ".from_yaml" do
|
9
|
+
context "with a path" do
|
10
|
+
subject(:ryo) { described_class.from_yaml(path:, object:) }
|
11
|
+
before { File.binwrite path, YAML.dump(x: 20, y: 40) }
|
12
|
+
after { FileUtils.rm(path) }
|
13
|
+
let(:path) { File.join(__dir__, "test.yaml") }
|
14
|
+
|
15
|
+
context "with Ryo::Object" do
|
16
|
+
let(:object) { Ryo::Object }
|
17
|
+
it { is_expected.to be_instance_of(Ryo::Object) }
|
18
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with Ryo::BasicObject" do
|
22
|
+
let(:object) { Ryo::BasicObject }
|
23
|
+
it { expect(Ryo::BasicObject === ryo).to be(true) }
|
24
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with a string" do
|
29
|
+
subject(:ryo) { described_class.from_yaml(string: "---\nx: 20\ny: 40\n", object:) }
|
30
|
+
|
31
|
+
context "with Ryo::Object" do
|
32
|
+
let(:object) { Ryo::Object }
|
33
|
+
it { is_expected.to be_instance_of(Ryo::Object) }
|
34
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with Ryo::BasicObject" do
|
38
|
+
let(:object) { Ryo::BasicObject }
|
39
|
+
it { expect(Ryo::BasicObject === ryo).to be(true) }
|
40
|
+
it { is_expected.to eq("x" => 20, "y" => 40) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ryo.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '0x1eef'
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -104,13 +104,13 @@ files:
|
|
104
104
|
- ".bundle/config"
|
105
105
|
- ".github/workflows/specs.yml"
|
106
106
|
- ".gitignore"
|
107
|
-
- ".gitlab-ci.yml"
|
108
107
|
- ".projectile"
|
109
108
|
- ".rubocop.yml"
|
110
109
|
- ".yardopts"
|
111
110
|
- Gemfile
|
112
111
|
- LICENSE
|
113
112
|
- README.md
|
113
|
+
- Rakefile.rb
|
114
114
|
- lib/ryo.rb
|
115
115
|
- lib/ryo/basic_object.rb
|
116
116
|
- lib/ryo/builder.rb
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/ryo/object.rb
|
123
123
|
- lib/ryo/reflect.rb
|
124
124
|
- lib/ryo/version.rb
|
125
|
+
- lib/ryo/yaml.rb
|
125
126
|
- ryo.rb.gemspec
|
126
127
|
- share/ryo.rb/examples/1.0_prototypes_point_object.rb
|
127
128
|
- share/ryo.rb/examples/1.1_prototypes_ryo_fn.rb
|
@@ -146,6 +147,7 @@ files:
|
|
146
147
|
- spec/ryo_prototypes_spec.rb
|
147
148
|
- spec/ryo_reflect_spec.rb
|
148
149
|
- spec/ryo_spec.rb
|
150
|
+
- spec/ryo_yaml_spec.rb
|
149
151
|
- spec/setup.rb
|
150
152
|
homepage: https://github.com/0x1eef/ryo.rb#readme
|
151
153
|
licenses:
|
@@ -159,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
161
|
requirements:
|
160
162
|
- - ">="
|
161
163
|
- !ruby/object:Gem::Version
|
162
|
-
version: '
|
164
|
+
version: '3.2'
|
163
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
166
|
requirements:
|
165
167
|
- - ">="
|