bgem 0.0.13 → 0.1.0
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 +4 -4
- data/bin/bgem +1 -1
- data/lib/bgem.rb +207 -55
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9298c8361ba7b012178c101f0fd572726305ce892a35ae0dedc35ad5f4c3d0ab
|
4
|
+
data.tar.gz: 2b471ee714a1e266f93010a4f665b1755a2bf43123d7bb105c219d06676b72e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 957d72e96fbd1bc35811beb79799e811527366029ed88c5ad62a07df638ad6ea43f65d707cba78e2726c41bfd6bfb0ac9006c0db8e621573b0be8bb257402bc9
|
7
|
+
data.tar.gz: bd60ed05e9714ba87cfde9aea6bc80d6f86a4f153dddab96f4271dd1dfc8cc71613512142e2e77f00533704ec358527452a096742e9286855a72ed9b7a69200d
|
data/bin/bgem
CHANGED
data/lib/bgem.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
module Bgem
|
2
|
+
module CLI
|
3
|
+
def self.run
|
4
|
+
case ARGV[0]
|
5
|
+
when '-v', '--version'
|
6
|
+
puts VERSION
|
7
|
+
else
|
8
|
+
Bgem.run
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
VERSION = '0.1.0'
|
14
|
+
|
2
15
|
require 'pathname'
|
3
16
|
require 'string/indent'
|
4
17
|
|
@@ -16,96 +29,231 @@ module Bgem
|
|
16
29
|
end
|
17
30
|
|
18
31
|
class Config
|
32
|
+
attr_accessor :entry, :output, :scope
|
19
33
|
def initialize config_file
|
20
34
|
@entry, @output, @scope = SOURCE_FILE, 'output.rb', nil
|
21
35
|
DSL.new self, (IO.read config_file)
|
22
|
-
end
|
23
36
|
|
24
|
-
|
37
|
+
@dir = Pathname File.dirname config_file
|
38
|
+
define_macros
|
39
|
+
end
|
25
40
|
|
41
|
+
def define_macros
|
42
|
+
Output::Ext.file_extensions.map do |type|
|
43
|
+
dir = @dir + type.to_s
|
44
|
+
MacroDir.new(type, dir) if dir.directory?
|
45
|
+
end.compact.each do |macro_dir|
|
46
|
+
macro_dir.define_macros
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
26
50
|
class DSL
|
27
51
|
def initialize config, code
|
28
52
|
@config = config
|
29
53
|
instance_eval code
|
30
54
|
end
|
31
|
-
|
55
|
+
|
32
56
|
def entry file
|
33
57
|
@config.entry = file
|
34
58
|
end
|
35
|
-
|
59
|
+
|
36
60
|
def output file
|
37
61
|
@config.output = file
|
38
62
|
end
|
39
|
-
|
63
|
+
|
40
64
|
def inside *headers
|
41
65
|
@config.scope = headers
|
42
66
|
end
|
43
67
|
end
|
68
|
+
|
69
|
+
class MacroDir
|
70
|
+
def initialize type, dir
|
71
|
+
@type, @dir = type, dir
|
72
|
+
@constant = Output::Exts.const_get @type.upcase
|
73
|
+
end
|
74
|
+
|
75
|
+
def define_macros
|
76
|
+
files = @dir.glob '*.rb'
|
77
|
+
|
78
|
+
files.each do |file|
|
79
|
+
n = file.basename.to_s.split('.').first
|
80
|
+
constant = @constant; k = Class.new { include constant }
|
81
|
+
to_s = "define_method :to_s do\n#{file.read}\nend"
|
82
|
+
k.instance_eval to_s
|
83
|
+
constant.const_set n.capitalize, k
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
44
87
|
end
|
45
88
|
|
46
89
|
class Output
|
47
90
|
class Ext
|
48
91
|
module StandardHooks
|
49
|
-
|
50
|
-
|
51
|
-
|
92
|
+
module DSL
|
93
|
+
def hook hook_name, default: false
|
94
|
+
define_method hook_name do
|
95
|
+
directory = @dir + "#{hook_name}.#{@name}"
|
96
|
+
|
97
|
+
if default
|
98
|
+
default_directory = @dir + @name
|
99
|
+
directory = default_directory unless directory.directory?
|
100
|
+
end
|
101
|
+
|
102
|
+
concatenate sorted_files_in directory
|
103
|
+
end
|
104
|
+
end
|
52
105
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
106
|
+
|
107
|
+
module Helpers
|
108
|
+
def concatenate files
|
109
|
+
files.map do |file|
|
110
|
+
Output.new(file, indent: INDENT).to_s
|
111
|
+
end.join "\n\n"
|
112
|
+
end
|
113
|
+
|
114
|
+
def sorted_files_in directory
|
115
|
+
patterns = Ext.file_extensions.map do |ext|
|
116
|
+
directory.join "*.#{ext}"
|
117
|
+
end
|
118
|
+
|
119
|
+
files = Dir[*patterns]
|
120
|
+
order_file = directory.join 'order'
|
121
|
+
|
122
|
+
if order_file.exist?
|
123
|
+
sort_with_order_file order_file, files
|
124
|
+
else
|
125
|
+
files.sort
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def sort_with_order_file order_file, files
|
130
|
+
order = order_file.readlines.map &:chomp
|
131
|
+
|
132
|
+
files_ordered_to_be_first = order.inject([]) do |array, name|
|
133
|
+
files_starting_with_name = files.select do |file|
|
134
|
+
basename = File.basename file
|
135
|
+
basename.start_with? "#{name}."
|
136
|
+
end
|
137
|
+
array += files_starting_with_name
|
138
|
+
end
|
139
|
+
|
140
|
+
other_files = files - files_ordered_to_be_first
|
141
|
+
files_ordered_to_be_first += other_files.sort
|
57
142
|
end
|
58
|
-
|
59
|
-
concatenate *patterns
|
60
143
|
end
|
144
|
+
|
145
|
+
extend DSL
|
146
|
+
include Helpers
|
61
147
|
|
62
|
-
|
63
|
-
|
64
|
-
Output.new(file, indent: INDENT).to_s
|
65
|
-
end.join "\n\n"
|
66
|
-
end
|
148
|
+
hook :post, default: true
|
149
|
+
hook :pre
|
67
150
|
end
|
68
151
|
|
152
|
+
def self.file_extensions
|
153
|
+
Exts.constants.map &:downcase
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.new file_extension:, type:, name:, dir:, code:
|
157
|
+
parent_constant = Exts.const_get file_extension.upcase
|
158
|
+
|
159
|
+
type ||= if parent_constant.respond_to? :default
|
160
|
+
parent_constant.default
|
161
|
+
else
|
162
|
+
'default'
|
163
|
+
end
|
164
|
+
constant_name = type.capitalize
|
165
|
+
|
166
|
+
if parent_constant.const_defined? constant_name
|
167
|
+
child_constant = parent_constant.const_get constant_name
|
168
|
+
else
|
169
|
+
fail "Don't know what to do with '#{type}'. #{parent_constant}::#{constant_name} is not defined."
|
170
|
+
end
|
171
|
+
|
172
|
+
child_constant.new file_extension: file_extension, type: type, name: name, dir: dir, code: code
|
173
|
+
end
|
69
174
|
|
70
|
-
module
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
175
|
+
module Common
|
176
|
+
def initialize **kwargs
|
177
|
+
@file_extension = kwargs[:file_extension]
|
178
|
+
@type = kwargs[:type]
|
179
|
+
@name = kwargs[:name]
|
180
|
+
@dir = kwargs[:dir]
|
181
|
+
@code = kwargs[:code]
|
75
182
|
|
76
|
-
|
77
|
-
|
183
|
+
setup
|
184
|
+
end
|
78
185
|
|
79
|
-
|
80
|
-
type = self.const_get constant
|
81
|
-
else
|
82
|
-
fail "Don't know what to do with '#{type}'. #{self}::#{constant} is not defined."
|
83
|
-
end
|
186
|
+
attr_reader :file_extension, :type, :name, :dir, :code
|
84
187
|
|
85
|
-
|
188
|
+
def ext
|
189
|
+
file_extension
|
86
190
|
end
|
87
191
|
|
88
|
-
def
|
89
|
-
|
90
|
-
|
192
|
+
def setup
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
module Exts
|
198
|
+
|
199
|
+
module ERB
|
200
|
+
include Ext::Common
|
201
|
+
|
202
|
+
class Default
|
203
|
+
include ERB
|
204
|
+
|
205
|
+
def to_s
|
206
|
+
<<~S
|
207
|
+
module #{@name}
|
208
|
+
class Context
|
209
|
+
def env
|
210
|
+
binding
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def self.[] params
|
215
|
+
env = Context.new.env
|
216
|
+
params.each do |name, value|
|
217
|
+
env.local_variable_set name, value
|
218
|
+
end
|
219
|
+
|
220
|
+
template = <<~TEMPLATE
|
221
|
+
#{@code}TEMPLATE
|
222
|
+
|
223
|
+
require 'erb'
|
224
|
+
renderer = ERB.new template
|
225
|
+
renderer.result env
|
226
|
+
end
|
227
|
+
end
|
228
|
+
S
|
229
|
+
end
|
91
230
|
end
|
231
|
+
end
|
232
|
+
|
233
|
+
module RB
|
234
|
+
include Ext::Common
|
235
|
+
include Ext::StandardHooks
|
92
236
|
|
93
|
-
def
|
94
|
-
|
237
|
+
def self.default
|
238
|
+
'module'
|
95
239
|
end
|
96
240
|
|
97
|
-
|
98
|
-
def setup
|
99
|
-
end
|
241
|
+
attr_reader :head
|
100
242
|
|
101
|
-
|
243
|
+
def to_s
|
244
|
+
"#{head}#{body}end"
|
245
|
+
end
|
102
246
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
247
|
+
def body
|
248
|
+
wrap code
|
249
|
+
end
|
250
|
+
|
251
|
+
def wrap code
|
252
|
+
code = @code.indent INDENT
|
253
|
+
code.prepend "#{pre}\n\n" unless pre.empty?
|
254
|
+
code.concat "\n#{post}\n" unless post.empty?
|
255
|
+
code
|
256
|
+
end
|
109
257
|
|
110
258
|
class Class
|
111
259
|
include RB
|
@@ -140,18 +288,22 @@ module Bgem
|
|
140
288
|
def initialize file = SOURCE_FILE, indent: 0
|
141
289
|
file, @indent = (Pathname file), indent
|
142
290
|
|
143
|
-
|
144
|
-
name = last.upcase
|
145
|
-
source = file.read
|
146
|
-
dir = file.dirname
|
291
|
+
parts = file.basename.to_s.split '.'
|
147
292
|
|
148
|
-
|
149
|
-
|
293
|
+
case parts.size
|
294
|
+
when 3
|
295
|
+
name, type, file_extension = parts
|
296
|
+
when 2
|
297
|
+
name, file_extension = parts
|
150
298
|
else
|
151
|
-
fail "
|
299
|
+
fail "#{file} has more than two dots in its name."
|
152
300
|
end
|
153
301
|
|
154
|
-
|
302
|
+
if Exts.const_defined? file_extension.upcase
|
303
|
+
@output = Ext.new file_extension: file_extension, type: type, name: name, dir: file.dirname, code: file.read
|
304
|
+
else
|
305
|
+
fail "Don't know what to do with #{file}. Bgem::Output::Exts::#{file_extension.upcase} is not defined."
|
306
|
+
end
|
155
307
|
end
|
156
308
|
|
157
309
|
def to_s
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bgem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anatoly Chernov
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: string-indent
|
@@ -24,8 +24,8 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.0.1
|
27
|
-
description:
|
28
|
-
email:
|
27
|
+
description:
|
28
|
+
email:
|
29
29
|
executables:
|
30
30
|
- bgem
|
31
31
|
extensions: []
|
@@ -37,7 +37,7 @@ homepage: https://github.com/ch1c0t/bgem
|
|
37
37
|
licenses:
|
38
38
|
- ISC
|
39
39
|
metadata: {}
|
40
|
-
post_install_message:
|
40
|
+
post_install_message:
|
41
41
|
rdoc_options: []
|
42
42
|
require_paths:
|
43
43
|
- lib
|
@@ -52,8 +52,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
|
-
rubygems_version: 3.
|
56
|
-
signing_key:
|
55
|
+
rubygems_version: 3.4.20
|
56
|
+
signing_key:
|
57
57
|
specification_version: 4
|
58
|
-
summary:
|
58
|
+
summary: To make Ruby gems from macros.
|
59
59
|
test_files: []
|