extree 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|