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 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: []