glimmer-dsl-libui 0.8.0 → 0.9.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 +4 -4
- data/CHANGELOG.md +11 -1
- data/README.md +359 -126
- data/RUBY_VERSION +1 -0
- data/VERSION +1 -1
- data/bin/girb +1 -1
- data/bin/glimmer +30 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/icons/scaffold_app.icns +0 -0
- data/icons/scaffold_app.ico +0 -0
- data/icons/scaffold_app.png +0 -0
- data/lib/glimmer/Rakefile +26 -0
- data/lib/glimmer/launcher.rb +231 -0
- data/lib/glimmer/rake_task/list.rb +105 -0
- data/lib/glimmer/rake_task/scaffold.rb +799 -0
- data/lib/glimmer/rake_task.rb +189 -0
- metadata +105 -40
@@ -0,0 +1,799 @@
|
|
1
|
+
# Copyright (c) 2021-2023 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'fileutils'
|
23
|
+
require 'os'
|
24
|
+
require 'facets'
|
25
|
+
|
26
|
+
# TODO refactor to nest under RakeTask namespace
|
27
|
+
|
28
|
+
MAIN_OBJECT = self
|
29
|
+
|
30
|
+
module Glimmer
|
31
|
+
module RakeTask
|
32
|
+
class Scaffold
|
33
|
+
class << self
|
34
|
+
include FileUtils
|
35
|
+
|
36
|
+
VERSION = File.read(File.expand_path('../../../../VERSION', __FILE__)).strip
|
37
|
+
RUBY_VERSION = File.read(File.expand_path('../../../../RUBY_VERSION', __FILE__)).strip
|
38
|
+
|
39
|
+
# TODO externalize all constants into scaffold/files
|
40
|
+
|
41
|
+
GITIGNORE = <<~MULTI_LINE_STRING
|
42
|
+
*.gem
|
43
|
+
*.rbc
|
44
|
+
/.config
|
45
|
+
/.mvn/
|
46
|
+
/coverage/
|
47
|
+
/InstalledFiles
|
48
|
+
/pkg/
|
49
|
+
/spec/reports/
|
50
|
+
/spec/examples.txt
|
51
|
+
/test/tmp/
|
52
|
+
/test/version_tmp/
|
53
|
+
/tmp/
|
54
|
+
|
55
|
+
# Used by dotenv library to load environment variables.
|
56
|
+
# .env
|
57
|
+
|
58
|
+
## Specific to RubyMotion:
|
59
|
+
.dat*
|
60
|
+
.repl_history
|
61
|
+
build/
|
62
|
+
*.bridgesupport
|
63
|
+
build-iPhoneOS/
|
64
|
+
build-iPhoneSimulator/
|
65
|
+
|
66
|
+
## Specific to RubyMotion (use of CocoaPods):
|
67
|
+
#
|
68
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
69
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
70
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
71
|
+
#
|
72
|
+
# vendor/Pods/
|
73
|
+
|
74
|
+
## Documentation cache and generated files:
|
75
|
+
/.yardoc/
|
76
|
+
/_yardoc/
|
77
|
+
/doc/
|
78
|
+
/rdoc/
|
79
|
+
|
80
|
+
## Environment normalization:
|
81
|
+
/.bundle/
|
82
|
+
/vendor/bundle
|
83
|
+
/lib/bundler/man/
|
84
|
+
|
85
|
+
# for a library or gem, you might want to ignore these files since the code is
|
86
|
+
# intended to run in multiple environments; otherwise, check them in:
|
87
|
+
# Gemfile.lock
|
88
|
+
# .ruby-version
|
89
|
+
# .ruby-gemset
|
90
|
+
|
91
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
92
|
+
.rvmrc
|
93
|
+
|
94
|
+
# Mac
|
95
|
+
.DS_Store
|
96
|
+
|
97
|
+
# Gladiator (Glimmer Editor)
|
98
|
+
.gladiator
|
99
|
+
.gladiator-scratchpad
|
100
|
+
|
101
|
+
# Glimmer
|
102
|
+
/dist/
|
103
|
+
/packages/
|
104
|
+
MULTI_LINE_STRING
|
105
|
+
|
106
|
+
GEMFILE_PREFIX = <<~MULTI_LINE_STRING
|
107
|
+
# frozen_string_literal: true
|
108
|
+
|
109
|
+
source 'https://rubygems.org'
|
110
|
+
|
111
|
+
git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
|
112
|
+
MULTI_LINE_STRING
|
113
|
+
GEMFILE_APP_MIDFIX = <<~MULTI_LINE_STRING
|
114
|
+
|
115
|
+
gem 'glimmer-dsl-libui', '~> #{VERSION}'
|
116
|
+
MULTI_LINE_STRING
|
117
|
+
GEMFILE_GEM_MIDFIX = <<~MULTI_LINE_STRING
|
118
|
+
|
119
|
+
gem 'glimmer-dsl-libui', '~> #{VERSION.split('.')[0...2].join('.')}'
|
120
|
+
MULTI_LINE_STRING
|
121
|
+
GEMFILE_SUFFIX = <<~MULTI_LINE_STRING
|
122
|
+
|
123
|
+
group :development do
|
124
|
+
gem 'rspec', '~> 3.5.0'
|
125
|
+
gem 'juwelier', '2.4.9'
|
126
|
+
gem 'simplecov', '>= 0'
|
127
|
+
end
|
128
|
+
MULTI_LINE_STRING
|
129
|
+
APP_GEMFILE = GEMFILE_PREFIX + GEMFILE_APP_MIDFIX + GEMFILE_SUFFIX
|
130
|
+
GEM_GEMFILE = GEMFILE_PREFIX + GEMFILE_GEM_MIDFIX + GEMFILE_SUFFIX
|
131
|
+
|
132
|
+
def app(app_name)
|
133
|
+
common_app(app_name)
|
134
|
+
end
|
135
|
+
|
136
|
+
def common_app(app_name, window_type = :app, window_options = {})
|
137
|
+
gem_name = file_name(app_name)
|
138
|
+
gem_summary = human_name(app_name)
|
139
|
+
return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
|
140
|
+
# system "ruby -S gem install bundler --no-document" if OS.windows? # resolves freezing issue with warbler and bundler 2.2.29 included in JRuby
|
141
|
+
system "ruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exist?
|
142
|
+
system "ruby -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
|
143
|
+
return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? || `git config --get user.name`.strip.empty?
|
144
|
+
cd gem_name
|
145
|
+
rm_rf 'lib'
|
146
|
+
write '.gitignore', GITIGNORE
|
147
|
+
write '.ruby-version', RUBY_VERSION
|
148
|
+
write '.ruby-gemset', app_name
|
149
|
+
write 'VERSION', '1.0.0'
|
150
|
+
write 'LICENSE.txt', "Copyright (c) #{Time.now.year} #{app_name}"
|
151
|
+
write 'Gemfile', gemfile(window_type)
|
152
|
+
write 'Rakefile', gem_rakefile(app_name, nil, gem_name)
|
153
|
+
mkdir 'app'
|
154
|
+
write "app/#{file_name(app_name)}.rb", app_main_file(app_name)
|
155
|
+
mkdir_p "app/#{file_name(app_name)}/model"
|
156
|
+
mkdir_p "app/#{file_name(app_name)}/view"
|
157
|
+
custom_window(class_name(app_name), current_dir_name, window_type, custom_window_class_name: 'Application')
|
158
|
+
|
159
|
+
mkdir_p 'icons/windows'
|
160
|
+
icon_file = "icons/windows/#{human_name(app_name)}.ico"
|
161
|
+
cp File.expand_path('../../../../icons/scaffold_app.ico', __FILE__), icon_file
|
162
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
163
|
+
|
164
|
+
mkdir_p 'icons/macosx'
|
165
|
+
icon_file = "icons/macosx/#{human_name(app_name)}.icns"
|
166
|
+
cp File.expand_path('../../../../icons/scaffold_app.icns', __FILE__), icon_file
|
167
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
168
|
+
|
169
|
+
mkdir_p 'icons/linux'
|
170
|
+
icon_file = "icons/linux/#{human_name(app_name)}.png"
|
171
|
+
cp File.expand_path('../../../../icons/scaffold_app.png', __FILE__), icon_file
|
172
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
173
|
+
|
174
|
+
mkdir_p "app/#{file_name(app_name)}"
|
175
|
+
write "app/#{file_name(app_name)}/launch.rb", app_launch_file(app_name)
|
176
|
+
mkdir_p 'bin'
|
177
|
+
write "bin/#{file_name(app_name)}", app_bin_command_file(app_name)
|
178
|
+
FileUtils.chmod 0755, "bin/#{file_name(app_name)}"
|
179
|
+
if OS.windows?
|
180
|
+
system "bundle"
|
181
|
+
system "rspec --init"
|
182
|
+
else
|
183
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
|
184
|
+
end
|
185
|
+
write 'spec/spec_helper.rb', spec_helper_file
|
186
|
+
if OS.mac? || OS.linux?
|
187
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n glimmer run\n'"
|
188
|
+
else
|
189
|
+
system "glimmer run"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def custom_window(custom_window_name, namespace, window_type = nil, window_options = {})
|
194
|
+
namespace ||= current_dir_name
|
195
|
+
root_dir = File.exist?('app') ? 'app' : 'lib'
|
196
|
+
parent_dir = "#{root_dir}/#{file_name(namespace)}/view"
|
197
|
+
return puts("The file '#{parent_dir}/#{file_name(custom_window_name)}.rb' already exists. Please either remove or pick a different name.") if File.exist?("#{parent_dir}/#{file_name(custom_window_name)}.rb")
|
198
|
+
mkdir_p parent_dir unless File.exist?(parent_dir)
|
199
|
+
write "#{parent_dir}/#{file_name(custom_window_name)}.rb", custom_window_file(custom_window_name, namespace, window_type, window_options)
|
200
|
+
end
|
201
|
+
|
202
|
+
def custom_control(custom_control_name, namespace)
|
203
|
+
namespace ||= current_dir_name
|
204
|
+
root_dir = File.exist?('app') ? 'app' : 'lib'
|
205
|
+
parent_dir = "#{root_dir}/#{file_name(namespace)}/view"
|
206
|
+
return puts("The file '#{parent_dir}/#{file_name(custom_control_name)}.rb' already exists. Please either remove or pick a different name.") if File.exist?("#{parent_dir}/#{file_name(custom_control_name)}.rb")
|
207
|
+
mkdir_p parent_dir unless File.exist?(parent_dir)
|
208
|
+
write "#{parent_dir}/#{file_name(custom_control_name)}.rb", custom_control_file(custom_control_name, namespace)
|
209
|
+
end
|
210
|
+
|
211
|
+
def custom_shape(custom_shape_name, namespace)
|
212
|
+
namespace ||= current_dir_name
|
213
|
+
root_dir = File.exist?('app') ? 'app' : 'lib'
|
214
|
+
parent_dir = "#{root_dir}/#{file_name(namespace)}/view"
|
215
|
+
return puts("The file '#{parent_dir}/#{file_name(custom_shape_name)}.rb' already exists. Please either remove or pick a different name.") if File.exist?("#{parent_dir}/#{file_name(custom_shape_name)}.rb")
|
216
|
+
mkdir_p parent_dir unless File.exist?(parent_dir)
|
217
|
+
write "#{parent_dir}/#{file_name(custom_shape_name)}.rb", custom_shape_file(custom_shape_name, namespace)
|
218
|
+
end
|
219
|
+
|
220
|
+
def custom_window_gem(custom_window_name, namespace)
|
221
|
+
gem_name = "glimmer-cs-#{compact_name(custom_window_name)}"
|
222
|
+
gem_summary = "#{human_name(custom_window_name)} - Glimmer Custom Window"
|
223
|
+
begin
|
224
|
+
custom_window_keyword = dsl_control_name(custom_window_name)
|
225
|
+
MAIN_OBJECT.method(custom_window_keyword)
|
226
|
+
return puts("CustomWindow keyword `#{custom_window_keyword}` is unavailable (occupied by a built-in Ruby method)! Please pick a different name.")
|
227
|
+
rescue NameError
|
228
|
+
# No Op (keyword is not taken by a built in Ruby method)
|
229
|
+
end
|
230
|
+
if namespace
|
231
|
+
gem_name += "-#{compact_name(namespace)}"
|
232
|
+
gem_summary += " (#{human_name(namespace)})"
|
233
|
+
else
|
234
|
+
return puts('Namespace is required! Usage: glimmer scaffold:gem:customwindow[name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
|
235
|
+
namespace = 'glimmer'
|
236
|
+
end
|
237
|
+
return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
|
238
|
+
# system "ruby -S gem install bundler --no-document" if OS.windows? # resolves freezing issue with warbler and bundler 2.2.29 included in JRuby
|
239
|
+
system "ruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exist?
|
240
|
+
system "ruby -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
|
241
|
+
return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
|
242
|
+
cd gem_name
|
243
|
+
write '.gitignore', GITIGNORE
|
244
|
+
write '.ruby-version', RUBY_VERSION
|
245
|
+
write '.ruby-gemset', gem_name
|
246
|
+
write 'VERSION', '1.0.0'
|
247
|
+
write 'Gemfile', GEM_GEMFILE
|
248
|
+
write 'Rakefile', gem_rakefile(custom_window_name, namespace, gem_name)
|
249
|
+
append "lib/#{gem_name}.rb", gem_main_file(custom_window_name, namespace)
|
250
|
+
custom_window(custom_window_name, namespace, :gem)
|
251
|
+
|
252
|
+
mkdir_p "lib/#{gem_name}"
|
253
|
+
write "lib/#{gem_name}/launch.rb", gem_launch_file(gem_name, custom_window_name, namespace)
|
254
|
+
mkdir_p 'bin'
|
255
|
+
write "bin/#{file_name(custom_window_name)}", app_bin_command_file(gem_name, custom_window_name, namespace)
|
256
|
+
FileUtils.chmod 0755, "bin/#{file_name(custom_window_name)}"
|
257
|
+
if OS.windows?
|
258
|
+
system "bundle"
|
259
|
+
system "rspec --init"
|
260
|
+
else
|
261
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
|
262
|
+
end
|
263
|
+
write 'spec/spec_helper.rb', spec_helper_file
|
264
|
+
|
265
|
+
mkdir_p 'icons/windows'
|
266
|
+
icon_file = "icons/windows/#{human_name(gem_name)}.ico"
|
267
|
+
cp File.expand_path('../../../../icons/scaffold_app.ico', __FILE__), icon_file
|
268
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
269
|
+
|
270
|
+
mkdir_p 'icons/macosx'
|
271
|
+
icon_file = "icons/macosx/#{human_name(gem_name)}.icns"
|
272
|
+
cp File.expand_path('../../../../icons/scaffold_app.icns', __FILE__), icon_file
|
273
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
274
|
+
|
275
|
+
mkdir_p 'icons/linux'
|
276
|
+
icon_file = "icons/linux/#{human_name(gem_name)}.png"
|
277
|
+
cp File.expand_path('../../../../icons/scaffold_app.png', __FILE__), icon_file
|
278
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
279
|
+
|
280
|
+
if OS.mac? || OS.linux?
|
281
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n glimmer run\n'"
|
282
|
+
else
|
283
|
+
system "glimmer run"
|
284
|
+
end
|
285
|
+
puts "Finished creating #{gem_name} Ruby gem."
|
286
|
+
puts 'Edit Rakefile to configure gem details.'
|
287
|
+
puts 'Run `rake` to execute specs.'
|
288
|
+
puts 'Run `rake build` to build gem.'
|
289
|
+
puts 'Run `rake release` to release into rubygems.org once ready.'
|
290
|
+
end
|
291
|
+
|
292
|
+
def custom_control_gem(custom_control_name, namespace)
|
293
|
+
gem_name = "glimmer-cw-#{compact_name(custom_control_name)}"
|
294
|
+
gem_summary = "#{human_name(custom_control_name)} - Glimmer Custom Control"
|
295
|
+
if namespace
|
296
|
+
gem_name += "-#{compact_name(namespace)}"
|
297
|
+
gem_summary += " (#{human_name(namespace)})"
|
298
|
+
else
|
299
|
+
return puts('Namespace is required! Usage: glimmer scaffold:custom_control_gem[custom_control_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
|
300
|
+
namespace = 'glimmer'
|
301
|
+
end
|
302
|
+
|
303
|
+
return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
|
304
|
+
# system "ruby -S gem install bundler --no-document" if OS.windows? # resolves freezing issue with warbler and bundler 2.2.29 included in JRuby
|
305
|
+
system "ruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exist?
|
306
|
+
system "ruby -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
|
307
|
+
return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
|
308
|
+
cd gem_name
|
309
|
+
write '.gitignore', GITIGNORE
|
310
|
+
write '.ruby-version', RUBY_VERSION
|
311
|
+
write '.ruby-gemset', gem_name
|
312
|
+
write 'VERSION', '1.0.0'
|
313
|
+
write 'Gemfile', GEM_GEMFILE
|
314
|
+
write 'Rakefile', gem_rakefile
|
315
|
+
append "lib/#{gem_name}.rb", gem_main_file(custom_control_name, namespace)
|
316
|
+
custom_control(custom_control_name, namespace)
|
317
|
+
if OS.windows?
|
318
|
+
system "bundle"
|
319
|
+
system "rspec --init"
|
320
|
+
else
|
321
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
|
322
|
+
end
|
323
|
+
write 'spec/spec_helper.rb', spec_helper_file
|
324
|
+
puts "Finished creating #{gem_name} Ruby gem."
|
325
|
+
puts 'Edit Rakefile to configure gem details.'
|
326
|
+
puts 'Run `rake` to execute specs.'
|
327
|
+
puts 'Run `rake build` to build gem.'
|
328
|
+
puts 'Run `rake release` to release into rubygems.org once ready.'
|
329
|
+
end
|
330
|
+
|
331
|
+
def custom_shape_gem(custom_shape_name, namespace)
|
332
|
+
gem_name = "glimmer-cp-#{compact_name(custom_shape_name)}"
|
333
|
+
gem_summary = "#{human_name(custom_shape_name)} - Glimmer Custom Shape"
|
334
|
+
if namespace
|
335
|
+
gem_name += "-#{compact_name(namespace)}"
|
336
|
+
gem_summary += " (#{human_name(namespace)})"
|
337
|
+
else
|
338
|
+
return puts('Namespace is required! Usage: glimmer scaffold:custom_shape_gem[custom_shape_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
|
339
|
+
namespace = 'glimmer'
|
340
|
+
end
|
341
|
+
|
342
|
+
return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
|
343
|
+
# system "ruby -S gem install bundler --no-document" if OS.windows? # resolves freezing issue with warbler and bundler 2.2.29 included in JRuby
|
344
|
+
system "ruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exist?
|
345
|
+
system "ruby -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
|
346
|
+
return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
|
347
|
+
cd gem_name
|
348
|
+
write '.gitignore', GITIGNORE
|
349
|
+
write '.ruby-version', RUBY_VERSION
|
350
|
+
write '.ruby-gemset', gem_name
|
351
|
+
write 'VERSION', '1.0.0'
|
352
|
+
write 'Gemfile', GEM_GEMFILE
|
353
|
+
write 'Rakefile', gem_rakefile
|
354
|
+
append "lib/#{gem_name}.rb", gem_main_file(custom_shape_name, namespace)
|
355
|
+
custom_shape(custom_shape_name, namespace)
|
356
|
+
if OS.windows?
|
357
|
+
system "bundle"
|
358
|
+
system "rspec --init"
|
359
|
+
else
|
360
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
|
361
|
+
end
|
362
|
+
write 'spec/spec_helper.rb', spec_helper_file
|
363
|
+
puts "Finished creating #{gem_name} Ruby gem."
|
364
|
+
puts 'Edit Rakefile to configure gem details.'
|
365
|
+
puts 'Run `rake` to execute specs.'
|
366
|
+
puts 'Run `rake build` to build gem.'
|
367
|
+
puts 'Run `rake release` to release into rubygems.org once ready.'
|
368
|
+
end
|
369
|
+
|
370
|
+
private
|
371
|
+
|
372
|
+
def juwelier_exist?
|
373
|
+
OS.windows? ? system('where juwelier') : system('which juwelier')
|
374
|
+
end
|
375
|
+
|
376
|
+
def write(file, content)
|
377
|
+
File.write file, content
|
378
|
+
file_path = File.expand_path(file)
|
379
|
+
puts "Created #{current_dir_name}/#{file}"
|
380
|
+
end
|
381
|
+
|
382
|
+
def append(file, content)
|
383
|
+
File.open(file, 'a') do |f|
|
384
|
+
f.write(content)
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
def current_dir_name
|
389
|
+
File.basename(File.expand_path('.'))
|
390
|
+
end
|
391
|
+
|
392
|
+
def class_name(app_name)
|
393
|
+
app_name.underscore.camelcase(:upper)
|
394
|
+
end
|
395
|
+
|
396
|
+
def file_name(app_name)
|
397
|
+
app_name.underscore
|
398
|
+
end
|
399
|
+
alias dsl_control_name file_name
|
400
|
+
|
401
|
+
def human_name(app_name)
|
402
|
+
app_name.underscore.titlecase
|
403
|
+
end
|
404
|
+
|
405
|
+
def compact_name(gem_name)
|
406
|
+
gem_name.underscore.camelcase.downcase
|
407
|
+
end
|
408
|
+
|
409
|
+
def gemfile(window_type)
|
410
|
+
APP_GEMFILE
|
411
|
+
end
|
412
|
+
|
413
|
+
def app_main_file(app_name)
|
414
|
+
<<~MULTI_LINE_STRING
|
415
|
+
$LOAD_PATH.unshift(File.expand_path('..', __FILE__))
|
416
|
+
|
417
|
+
begin
|
418
|
+
require 'bundler/setup'
|
419
|
+
Bundler.require(:default)
|
420
|
+
rescue StandardError, Gem::LoadError
|
421
|
+
# this runs when packaged as a gem (no bundler)
|
422
|
+
require 'glimmer-dsl-libui'
|
423
|
+
# add more gems if needed
|
424
|
+
end
|
425
|
+
|
426
|
+
class #{class_name(app_name)}
|
427
|
+
include Glimmer
|
428
|
+
|
429
|
+
APP_ROOT = File.expand_path('../..', __FILE__)
|
430
|
+
VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
|
431
|
+
LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
|
432
|
+
end
|
433
|
+
|
434
|
+
require '#{file_name(app_name)}/view/#{file_name(app_name)}'
|
435
|
+
MULTI_LINE_STRING
|
436
|
+
end
|
437
|
+
|
438
|
+
def gem_main_file(custom_control_name, namespace = nil)
|
439
|
+
custom_control_file_path = ''
|
440
|
+
custom_control_file_path += "#{file_name(namespace)}/" if namespace
|
441
|
+
custom_control_file_path += "view"
|
442
|
+
custom_control_file_path += "/#{file_name(custom_control_name)}"
|
443
|
+
|
444
|
+
<<~MULTI_LINE_STRING
|
445
|
+
$LOAD_PATH.unshift(File.expand_path('..', __FILE__))
|
446
|
+
|
447
|
+
require 'glimmer-dsl-libui'
|
448
|
+
require '#{custom_control_file_path}'
|
449
|
+
MULTI_LINE_STRING
|
450
|
+
end
|
451
|
+
|
452
|
+
def app_launch_file(app_name)
|
453
|
+
<<~MULTI_LINE_STRING
|
454
|
+
require_relative '../#{file_name(app_name)}'
|
455
|
+
|
456
|
+
#{class_name(app_name)}::View::#{class_name(app_name)}.launch
|
457
|
+
MULTI_LINE_STRING
|
458
|
+
end
|
459
|
+
|
460
|
+
def app_bin_command_file(app_name_or_gem_name, custom_window_name=nil, namespace=nil)
|
461
|
+
if custom_window_name.nil?
|
462
|
+
runner = "File.expand_path('../../app/#{file_name(app_name_or_gem_name)}/launch.rb', __FILE__)"
|
463
|
+
else
|
464
|
+
runner = "File.expand_path('../../lib/#{app_name_or_gem_name}/launch.rb', __FILE__)"
|
465
|
+
end
|
466
|
+
<<~MULTI_LINE_STRING
|
467
|
+
#!/usr/bin/env ruby
|
468
|
+
|
469
|
+
runner = #{runner}
|
470
|
+
|
471
|
+
require 'glimmer/launcher'
|
472
|
+
|
473
|
+
launcher = Glimmer::Launcher.new([runner] + ARGV)
|
474
|
+
launcher.launch
|
475
|
+
MULTI_LINE_STRING
|
476
|
+
end
|
477
|
+
|
478
|
+
def gem_launch_file(gem_name, custom_window_name, namespace)
|
479
|
+
# TODO change this so that it does not mix Glimmer unto the main object
|
480
|
+
<<~MULTI_LINE_STRING
|
481
|
+
require_relative '../#{gem_name}'
|
482
|
+
|
483
|
+
#{class_name(namespace)}::View::#{class_name(custom_window_name)}.launch
|
484
|
+
MULTI_LINE_STRING
|
485
|
+
end
|
486
|
+
|
487
|
+
def gem_rakefile(custom_window_name = nil, namespace = nil, gem_name = nil)
|
488
|
+
rakefile_content = File.read('Rakefile')
|
489
|
+
lines = rakefile_content.split("\n")
|
490
|
+
require_rake_line_index = lines.index(lines.detect {|l| l.include?("require 'rake'") })
|
491
|
+
lines.insert(require_rake_line_index, "require 'glimmer/launcher'")
|
492
|
+
gem_files_line_index = lines.index(lines.detect {|l| l.include?('# dependencies defined in Gemfile') })
|
493
|
+
if custom_window_name
|
494
|
+
lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'app/**/*', 'bin/**/*', 'config/**/*', 'db/**/*', 'docs/**/*', 'fonts/**/*', 'icons/**/*', 'images/**/*', 'lib/**/*', 'script/**/*', 'sounds/**/*', 'videos/**/*']")
|
495
|
+
lines.insert(gem_files_line_index+1, " gem.require_paths = ['lib', 'app']")
|
496
|
+
lines.insert(gem_files_line_index+2, " gem.executables = ['#{file_name(custom_window_name)}']") if custom_window_name
|
497
|
+
else
|
498
|
+
lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*']")
|
499
|
+
end
|
500
|
+
lines << "\nrequire 'glimmer/rake_task'\n"
|
501
|
+
lines.join("\n")
|
502
|
+
end
|
503
|
+
|
504
|
+
def spec_helper_file
|
505
|
+
content = File.read('spec/spec_helper.rb')
|
506
|
+
lines = content.split("\n")
|
507
|
+
require_line_index = lines.index(lines.detect {|l| l.include?('RSpec.configure do') })
|
508
|
+
lines[require_line_index...require_line_index] = [
|
509
|
+
"require 'bundler/setup'",
|
510
|
+
'Bundler.require(:default, :development)',
|
511
|
+
]
|
512
|
+
configure_block_line_index = lines.index(lines.detect {|l| l.include?('RSpec.configure do') }) + 1
|
513
|
+
lines[configure_block_line_index...configure_block_line_index] = [
|
514
|
+
' # The following ensures rspec tests that instantiate and set Glimmer DSL controls in @target get cleaned after',
|
515
|
+
' config.after do',
|
516
|
+
' @target.dispose if @target && @target.respond_to?(:dispose)',
|
517
|
+
' Glimmer::DSL::Engine.reset',
|
518
|
+
' end',
|
519
|
+
]
|
520
|
+
|
521
|
+
lines << "\nrequire 'glimmer/rake_task'\n"
|
522
|
+
lines.join("\n")
|
523
|
+
end
|
524
|
+
|
525
|
+
def custom_window_file(custom_window_name, namespace, window_type, window_options = {})
|
526
|
+
window_options ||= {}
|
527
|
+
window_options[:custom_window_class_name] ||= 'CustomWindow'
|
528
|
+
namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
|
529
|
+
|
530
|
+
custom_window_file_content = <<-MULTI_LINE_STRING
|
531
|
+
#{namespace_type} #{class_name(namespace)}
|
532
|
+
module View
|
533
|
+
class #{class_name(custom_window_name)}
|
534
|
+
include Glimmer::LibUI::#{window_options[:custom_window_class_name]}
|
535
|
+
|
536
|
+
MULTI_LINE_STRING
|
537
|
+
|
538
|
+
if window_type == :gem
|
539
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
540
|
+
APP_ROOT = File.expand_path('../../../..', __FILE__)
|
541
|
+
VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
|
542
|
+
LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
|
543
|
+
MULTI_LINE_STRING
|
544
|
+
end
|
545
|
+
|
546
|
+
if %i[gem app].include?(window_type)
|
547
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
548
|
+
GREETINGS = [
|
549
|
+
'Hello, World!',
|
550
|
+
'Howdy, Partner!'
|
551
|
+
]
|
552
|
+
MULTI_LINE_STRING
|
553
|
+
end
|
554
|
+
|
555
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
556
|
+
|
557
|
+
## Add options like the following to configure CustomWindow by outside consumers
|
558
|
+
#
|
559
|
+
# options :title, :background_color
|
560
|
+
# option :width, default: 320
|
561
|
+
# option :height, default: 240
|
562
|
+
MULTI_LINE_STRING
|
563
|
+
|
564
|
+
if %i[gem app].include?(window_type)
|
565
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
566
|
+
|
567
|
+
# GREETING Array selected index
|
568
|
+
option :greeting_index, default: 0
|
569
|
+
MULTI_LINE_STRING
|
570
|
+
end
|
571
|
+
|
572
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
573
|
+
|
574
|
+
## Use before_body block to pre-initialize variables to use in body and
|
575
|
+
# to setup application menu
|
576
|
+
#
|
577
|
+
MULTI_LINE_STRING
|
578
|
+
|
579
|
+
if %i[gem app].include?(window_type)
|
580
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
581
|
+
before_body do
|
582
|
+
menu('File') {
|
583
|
+
menu_item('Preferences...') {
|
584
|
+
on_clicked do
|
585
|
+
display_preferences_dialog
|
586
|
+
end
|
587
|
+
}
|
588
|
+
|
589
|
+
# Enables quitting with CMD+Q on Mac with Mac Quit menu item
|
590
|
+
quit_menu_item if OS.mac?
|
591
|
+
}
|
592
|
+
menu('Help') {
|
593
|
+
if OS.mac?
|
594
|
+
about_menu_item {
|
595
|
+
on_clicked do
|
596
|
+
display_about_dialog
|
597
|
+
end
|
598
|
+
}
|
599
|
+
end
|
600
|
+
|
601
|
+
menu_item('About') {
|
602
|
+
on_clicked do
|
603
|
+
display_about_dialog
|
604
|
+
end
|
605
|
+
}
|
606
|
+
}
|
607
|
+
end
|
608
|
+
MULTI_LINE_STRING
|
609
|
+
else
|
610
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
611
|
+
# before_body do
|
612
|
+
#
|
613
|
+
# end
|
614
|
+
MULTI_LINE_STRING
|
615
|
+
end
|
616
|
+
|
617
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
618
|
+
|
619
|
+
## Use after_body block to setup observers for controls in body
|
620
|
+
#
|
621
|
+
# after_body do
|
622
|
+
#
|
623
|
+
# end
|
624
|
+
|
625
|
+
## Add control content inside custom window body
|
626
|
+
## Top-most control must be a window or another custom window
|
627
|
+
#
|
628
|
+
body {
|
629
|
+
window {
|
630
|
+
# Replace example content below with custom window content
|
631
|
+
content_size 240, 240
|
632
|
+
title '#{human_name(namespace)}'
|
633
|
+
|
634
|
+
margined true
|
635
|
+
|
636
|
+
label {
|
637
|
+
text <= [self, :greeting_index, on_read: -> { greeting }]
|
638
|
+
}
|
639
|
+
}
|
640
|
+
}
|
641
|
+
MULTI_LINE_STRING
|
642
|
+
|
643
|
+
if %i[gem app].include?(window_type)
|
644
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
645
|
+
|
646
|
+
def greeting
|
647
|
+
GREETINGS[greeting_index]
|
648
|
+
end
|
649
|
+
|
650
|
+
def display_about_dialog
|
651
|
+
message = "#{human_name(namespace)}#{" - #{human_name(custom_window_name)}" if window_type == :gem} \#{VERSION}\\n\\n\#{LICENSE}"
|
652
|
+
msg_box('About', message)
|
653
|
+
end
|
654
|
+
|
655
|
+
MULTI_LINE_STRING
|
656
|
+
end
|
657
|
+
|
658
|
+
if %i[gem app].include?(window_type)
|
659
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
660
|
+
def display_preferences_dialog
|
661
|
+
window {
|
662
|
+
title 'Preferences'
|
663
|
+
content_size 200, 100
|
664
|
+
|
665
|
+
margined true
|
666
|
+
|
667
|
+
vertical_box {
|
668
|
+
padded true
|
669
|
+
|
670
|
+
label('Greeting:') {
|
671
|
+
stretchy false
|
672
|
+
}
|
673
|
+
|
674
|
+
radio_buttons {
|
675
|
+
stretchy false
|
676
|
+
|
677
|
+
items GREETINGS
|
678
|
+
selected <=> [self, :greeting_index]
|
679
|
+
}
|
680
|
+
}
|
681
|
+
}.show
|
682
|
+
end
|
683
|
+
MULTI_LINE_STRING
|
684
|
+
end
|
685
|
+
|
686
|
+
custom_window_file_content += <<-MULTI_LINE_STRING
|
687
|
+
end
|
688
|
+
end
|
689
|
+
end
|
690
|
+
MULTI_LINE_STRING
|
691
|
+
end
|
692
|
+
|
693
|
+
def custom_control_file(custom_control_name, namespace)
|
694
|
+
namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
|
695
|
+
|
696
|
+
<<-MULTI_LINE_STRING
|
697
|
+
#{namespace_type} #{class_name(namespace)}
|
698
|
+
module View
|
699
|
+
class #{class_name(custom_control_name)}
|
700
|
+
include Glimmer::LibUI::CustomControl
|
701
|
+
|
702
|
+
## Add options like the following to configure CustomControl by outside consumers
|
703
|
+
#
|
704
|
+
# options :custom_text, :background_color
|
705
|
+
# option :foreground_color, default: :red
|
706
|
+
|
707
|
+
## Use before_body block to pre-initialize variables to use in body
|
708
|
+
#
|
709
|
+
#
|
710
|
+
# before_body do
|
711
|
+
#
|
712
|
+
# end
|
713
|
+
|
714
|
+
## Use after_body block to setup observers for controls in body
|
715
|
+
#
|
716
|
+
# after_body do
|
717
|
+
#
|
718
|
+
# end
|
719
|
+
|
720
|
+
## Add control content under custom control body
|
721
|
+
##
|
722
|
+
## If you want to add a window as the top-most control,
|
723
|
+
## consider creating a custom window instead
|
724
|
+
## (Glimmer::LibUI::CustomWindow offers window convenience methods, like show and hide)
|
725
|
+
#
|
726
|
+
body {
|
727
|
+
# Replace example content below with custom control content
|
728
|
+
label {
|
729
|
+
background :red
|
730
|
+
}
|
731
|
+
}
|
732
|
+
|
733
|
+
end
|
734
|
+
end
|
735
|
+
end
|
736
|
+
MULTI_LINE_STRING
|
737
|
+
end
|
738
|
+
|
739
|
+
def custom_shape_file(custom_shape_name, namespace)
|
740
|
+
namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
|
741
|
+
|
742
|
+
<<-MULTI_LINE_STRING
|
743
|
+
#{namespace_type} #{class_name(namespace)}
|
744
|
+
module View
|
745
|
+
class #{class_name(custom_shape_name)}
|
746
|
+
include Glimmer::LibUI::CustomShape
|
747
|
+
|
748
|
+
## Add options like the following to configure CustomShape by outside consumers
|
749
|
+
#
|
750
|
+
# options :option1, option2, option3
|
751
|
+
option :background_color, default: :red
|
752
|
+
option :size_width, default: 100
|
753
|
+
option :size_height, default: 100
|
754
|
+
option :location_x, default: 0
|
755
|
+
option :location_y, default: 0
|
756
|
+
|
757
|
+
## Use before_body block to pre-initialize variables to use in body
|
758
|
+
#
|
759
|
+
#
|
760
|
+
# before_body do
|
761
|
+
#
|
762
|
+
# end
|
763
|
+
|
764
|
+
## Use after_body block to setup observers for shapes in body
|
765
|
+
#
|
766
|
+
# after_body do
|
767
|
+
#
|
768
|
+
# end
|
769
|
+
|
770
|
+
## Add shape content under custom shape body
|
771
|
+
#
|
772
|
+
body {
|
773
|
+
# Replace example content below with custom shape content
|
774
|
+
shape(location_x, location_y) {
|
775
|
+
path {
|
776
|
+
background background_color
|
777
|
+
cubic size_width - size_width*0.66, size_height/2 - size_height*0.33, size_width*0.65 - size_width*0.66, 0 - size_height*0.33, size_width/2 - size_width*0.66, size_height*0.75 - size_height*0.33, size_width - size_width*0.66, size_height - size_height*0.33
|
778
|
+
}
|
779
|
+
|
780
|
+
path {
|
781
|
+
background background_color
|
782
|
+
cubic size_width - size_width*0.66, size_height/2 - size_height*0.33, size_width*1.35 - size_width*0.66, 0 - size_height*0.33, size_width*1.5 - size_width*0.66, size_height*0.75 - size_height*0.33, size_width - size_width*0.66, size_height - size_height*0.33
|
783
|
+
}
|
784
|
+
}
|
785
|
+
}
|
786
|
+
|
787
|
+
end
|
788
|
+
end
|
789
|
+
end
|
790
|
+
MULTI_LINE_STRING
|
791
|
+
end
|
792
|
+
|
793
|
+
end
|
794
|
+
|
795
|
+
end
|
796
|
+
|
797
|
+
end
|
798
|
+
|
799
|
+
end
|