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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bgem +1 -1
  3. data/lib/bgem.rb +207 -55
  4. metadata +9 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9dd5cdb3ff9091a51601230896ac2ea854d3844c422000ce223b83d69e98d7bc
4
- data.tar.gz: fb6ba38b8f63bb1c0537bee6769654772dc33545744c2507ee14ff0b8ec56aa7
3
+ metadata.gz: 9298c8361ba7b012178c101f0fd572726305ce892a35ae0dedc35ad5f4c3d0ab
4
+ data.tar.gz: 2b471ee714a1e266f93010a4f665b1755a2bf43123d7bb105c219d06676b72e6
5
5
  SHA512:
6
- metadata.gz: 9dac7f98b123fd0f0c13bd4d271672471feada32915cd6a819bb688147f75b358cda34a0e10a2ef7f25fc93d2501e1768ab7a82a288d523b233d21640a2b3e5b
7
- data.tar.gz: 31c9c88df1d4eba032cf5945873c11ced2edbbad73ca0b54556e1add0ca479e36bec4fc10f376698b3a9d685f0cc3863f1ad3b3d9cc19738b40fa4082713bad1
6
+ metadata.gz: 957d72e96fbd1bc35811beb79799e811527366029ed88c5ad62a07df638ad6ea43f65d707cba78e2726c41bfd6bfb0ac9006c0db8e621573b0be8bb257402bc9
7
+ data.tar.gz: bd60ed05e9714ba87cfde9aea6bc80d6f86a4f153dddab96f4271dd1dfc8cc71613512142e2e77f00533704ec358527452a096742e9286855a72ed9b7a69200d
data/bin/bgem CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'bgem'
4
- Bgem.run
4
+ Bgem::CLI.run
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
- attr_accessor :entry, :output, :scope
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
- def pre
50
- pattern = @dir.join "#{__method__}.#{@name}/*.rb"
51
- concatenate pattern
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
- def post
55
- patterns = ["#{@name}/*.rb", "post.#{@name}/*.rb"].map do |pattern|
56
- @dir.join pattern
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
- def concatenate *patterns
63
- Dir[*patterns].sort.map do |file|
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 RB
71
- def self.new dir:, source:, chain:
72
- unless chain.size == 2
73
- fail "#{chain}' size should be 2"
74
- end
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
- name, type = chain
77
- constant = type.capitalize
183
+ setup
184
+ end
78
185
 
79
- if self.const_defined? constant
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
- type.new dir: dir, source: source, name: name
188
+ def ext
189
+ file_extension
86
190
  end
87
191
 
88
- def initialize dir:, source:, name:
89
- @dir, @source, @name = dir, source, name
90
- setup
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 to_s
94
- "#{head}#{source}end"
237
+ def self.default
238
+ 'module'
95
239
  end
96
240
 
97
- private
98
- def setup
99
- end
241
+ attr_reader :head
100
242
 
101
- include StandardHooks
243
+ def to_s
244
+ "#{head}#{body}end"
245
+ end
102
246
 
103
- def source
104
- source = @source.indent INDENT
105
- source.prepend "#{pre}\n\n" unless pre.empty?
106
- source.concat "\n#{post}\n" unless post.empty?
107
- source
108
- end
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
- *chain, last = file.basename.to_s.split '.'
144
- name = last.upcase
145
- source = file.read
146
- dir = file.dirname
291
+ parts = file.basename.to_s.split '.'
147
292
 
148
- if Ext.const_defined? name
149
- ext = Ext.const_get name
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 "Don't know what to do with #{file}. Bgem::Output::Ext::#{name} is not defined."
299
+ fail "#{file} has more than two dots in its name."
152
300
  end
153
301
 
154
- @output = ext.new dir: dir, source: source, chain: chain
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.13
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: 2021-04-29 00:00:00.000000000 Z
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.1.6
56
- signing_key:
55
+ rubygems_version: 3.4.20
56
+ signing_key:
57
57
  specification_version: 4
58
- summary: A tool to build single-file Ruby gems with less ends.
58
+ summary: To make Ruby gems from macros.
59
59
  test_files: []