extree 0.0.1
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 +7 -0
- data/lib/extree/branch.rb +21 -0
- data/lib/extree/root.rb +29 -0
- data/lib/extree/seed.rb +83 -0
- data/lib/extree/version.rb +3 -0
- data/lib/extree.rb +12 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c08f00f910330599797def6b035e6f072f469da3f8033c399a891986ac68e8ef
|
4
|
+
data.tar.gz: 7c5e92efa60b8194a76354cb5782202b9cd005fe7a209626e3b77050df5627f3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 462f8db0f7b508acee6c10318469957f5daa986ef1dd2c9e041066af81acda8db677d9e8685ce530a6b61980ef48450c93928d9fa8731e924982451adb78fa05
|
7
|
+
data.tar.gz: 3455cba5ed93434daa09c458cf2c136026b6911fd5279034a3b914607b6f82fd2b90721a5af94387b378e1af1fb6ce0276739d7177d99a8534ba26104cdd924f
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'seed'
|
2
|
+
|
3
|
+
module Extree
|
4
|
+
module Branch
|
5
|
+
def def! name, &b
|
6
|
+
define_method "#{Seed::BRANCH_METHOD_PREFIX}#{name}", &b
|
7
|
+
end
|
8
|
+
|
9
|
+
@@redef_index = 0
|
10
|
+
|
11
|
+
def redef! name, &b
|
12
|
+
@@redef_index = index = @@redef_index.next
|
13
|
+
redefined = "#{Seed::BRANCH_METHOD_PREFIX}#{index}_#{name}"
|
14
|
+
branch_method = "#{Seed::BRANCH_METHOD_PREFIX}#{name}"
|
15
|
+
alias_method redefined, branch_method
|
16
|
+
define_method branch_method do |*a, **na, &bl|
|
17
|
+
b.call redefined, *a, **na, &bl
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/extree/root.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'seed'
|
2
|
+
|
3
|
+
module Extree
|
4
|
+
module Root
|
5
|
+
include Seed
|
6
|
+
|
7
|
+
def respond_to? name
|
8
|
+
super || (name.end_with?("!") && extree_respond_to?(name[...-1]))
|
9
|
+
end
|
10
|
+
|
11
|
+
def method_missing name, *a, **na, &b
|
12
|
+
if name.end_with? "!"
|
13
|
+
extree_method_missing name[...-1], *a, **na, &b
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def host! *a, **na, &b
|
20
|
+
a.each do |k|
|
21
|
+
send("#{k}=", SINGLETON)
|
22
|
+
end
|
23
|
+
na.each do |k, v|
|
24
|
+
send("#{k}=", v)
|
25
|
+
end
|
26
|
+
super(&b)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/extree/seed.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
module Extree
|
2
|
+
module Seed
|
3
|
+
BRANCH_METHOD_PREFIX = "extree_branch_".freeze
|
4
|
+
|
5
|
+
@@call_stack = []
|
6
|
+
@@call_roots = []
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def stack
|
10
|
+
@@call_stack
|
11
|
+
end
|
12
|
+
|
13
|
+
def roots
|
14
|
+
@@call_roots
|
15
|
+
end
|
16
|
+
|
17
|
+
def current root
|
18
|
+
@@call_roots.include?(root) ? @@call_stack.last : root
|
19
|
+
end
|
20
|
+
|
21
|
+
def push object
|
22
|
+
@@call_stack.push object
|
23
|
+
end
|
24
|
+
|
25
|
+
def pop
|
26
|
+
@@call_stack.pop
|
27
|
+
end
|
28
|
+
|
29
|
+
def open_scope object
|
30
|
+
@@call_roots << object
|
31
|
+
end
|
32
|
+
|
33
|
+
def close_scope object
|
34
|
+
@@call_roots.delete_at @@call_roots.index(object)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self!
|
39
|
+
Seed.current self
|
40
|
+
end
|
41
|
+
|
42
|
+
def extree_respond_to? name
|
43
|
+
top = Seed.current self
|
44
|
+
top.respond_to?("#{name}=") || top.respond_to?("#{BRANCH_METHOD_PREFIX}#{name}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def extree_method_missing name, *a, **na, &b
|
48
|
+
top = Seed.current self
|
49
|
+
branch_method = "#{BRANCH_METHOD_PREFIX}#{name}".to_sym
|
50
|
+
return top.send(branch_method, *a, **na, &b) if top.respond_to? branch_method
|
51
|
+
setter = "#{name}=".to_sym
|
52
|
+
if top.respond_to? setter
|
53
|
+
return top.send(setter, a) if !a.empty?
|
54
|
+
return top.send(setter, na) if !na.empty?
|
55
|
+
return top.send(setter, b) if block_given?
|
56
|
+
return top.send(setter)
|
57
|
+
end
|
58
|
+
no_method_error = NoMethodError.new("extree method missing `#{name}!` for #{top.class}")
|
59
|
+
raise no_method_error
|
60
|
+
end
|
61
|
+
|
62
|
+
def send! method, *a, **na, &b
|
63
|
+
send "#{BRANCH_METHOD_PREFIX}#{method}", *a, **na, &b
|
64
|
+
end
|
65
|
+
|
66
|
+
def host! &b
|
67
|
+
return self if !b
|
68
|
+
Seed.push self
|
69
|
+
result = b.call self
|
70
|
+
Seed.pop
|
71
|
+
result
|
72
|
+
end
|
73
|
+
|
74
|
+
def scope! scoped = nil, *a, **na, &b
|
75
|
+
scoped ||= self
|
76
|
+
Seed.open_scope self
|
77
|
+
scoped.host! *a, **na, &b
|
78
|
+
Seed.close_scope self
|
79
|
+
scoped
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/lib/extree.rb
ADDED
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: extree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Łukasz Pomietło
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-02-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: " \n"
|
14
|
+
email: oficjalnyadreslukasza@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/extree.rb
|
20
|
+
- lib/extree/branch.rb
|
21
|
+
- lib/extree/root.rb
|
22
|
+
- lib/extree/seed.rb
|
23
|
+
- lib/extree/version.rb
|
24
|
+
homepage: https://github.com/lpogic/extree
|
25
|
+
licenses:
|
26
|
+
- Zlib
|
27
|
+
metadata:
|
28
|
+
documentation_uri: https://github.com/lpogic/extree/blob/main/doc/wiki/README.md
|
29
|
+
homepage_uri: https://github.com/lpogic/extree
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 3.2.2
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubygems_version: 3.5.6
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: DSL for building trees
|
49
|
+
test_files: []
|