extree 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Extree
2
+ VERSION = "0.0.1"
3
+ end
data/lib/extree.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative 'extree/root'
2
+ require_relative 'extree/branch'
3
+
4
+ module Extree
5
+ include Root
6
+
7
+ SINGLETON = Object.new
8
+
9
+ def self.included(mod)
10
+ mod.extend Branch
11
+ end
12
+ end
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: []