Class: Scaffold

Inherits:
Object
  • Object
show all
Extended by:
FileUtils
Defined in:
lib/glimmer/scaffold.rb

Constant Summary collapse

VERSION =
File.read(File.expand_path('../../../VERSION', __FILE__)).strip
RUBY_VERSION =
File.read(File.expand_path('../../../RUBY_VERSION', __FILE__)).strip
GITIGNORE =

TODO externalize all constants into scaffold/files

<<~MULTI_LINE_STRING
  *.gem
  *.rbc
  /.config
  /coverage/
  /InstalledFiles
  /pkg/
  /spec/reports/
  /spec/examples.txt
  /test/tmp/
  /test/version_tmp/
  /tmp/
  
  # Used by dotenv library to load environment variables.
  # .env
  
  ## Specific to RubyMotion:
  .dat*
  .repl_history
  build/
  *.bridgesupport
  build-iPhoneOS/
  build-iPhoneSimulator/
  
  ## Specific to RubyMotion (use of CocoaPods):
  #
  # We recommend against adding the Pods directory to your .gitignore. However
  # you should judge for yourself, the pros and cons are mentioned at:
  # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
  #
  # vendor/Pods/
  
  ## Documentation cache and generated files:
  /.yardoc/
  /_yardoc/
  /doc/
  /rdoc/
  
  ## Environment normalization:
  /.bundle/
  /vendor/bundle
  /lib/bundler/man/
  
  # for a library or gem, you might want to ignore these files since the code is
  # intended to run in multiple environments; otherwise, check them in:
  Gemfile.lock
  # .ruby-version
  # .ruby-gemset
  
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
  .rvmrc
  
  # Mac
  .DS_Store
  
  # Gladiator (Glimmer Editor)
  .gladiator
  
  # Glimmer
  dist
  packages      
MULTI_LINE_STRING
GEMFILE_APP =
<<~MULTI_LINE_STRING
  # frozen_string_literal: true
  
  source "https://rubygems.org"
  
  git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
  
  gem 'glimmer', '~> #{VERSION}'
  
  group :test do
    gem 'rspec'
  end
MULTI_LINE_STRING
GEMFILE_GEM =
<<~MULTI_LINE_STRING
  # frozen_string_literal: true
  
  source "https://rubygems.org"
  
  git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
  
  gem 'glimmer', '~> #{VERSION}'
  
  group :development do
    gem "rspec", "~> 3.5.0"
    gem "jeweler", "2.3.9"
    gem "simplecov", ">= 0"
  end
MULTI_LINE_STRING
RAKEFILE =
<<~MULTI_LINE_STRING
  require 'glimmer/rake_task'
  
  ## Uncomment the following section if you would like to customize javapackager
  ## arguments for `glimmer package` command.
  #
  # Glimmer::Package.javapackager_extra_args =
  #   " -BlicenseType=" +
  #   " -Bmac.CFBundleIdentifier=" +
  #   " -Bmac.category=" +
  #   " -Bmac.signing-key-developer-id-app="
MULTI_LINE_STRING
RVM_FUNCTION =
<<~MULTI_LINE_STRING
  # Load RVM into a shell session *as a function*
  if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  
    # First try to load from a user install
    source "$HOME/.rvm/scripts/rvm"
  
  elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
  
    # Then try to load from a root install
    source "/usr/local/rvm/scripts/rvm"
  
  fi
MULTI_LINE_STRING

Class Method Summary collapse

Class Method Details

.app(app_name) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/glimmer/scaffold.rb', line 135

def app(app_name)
  mkdir app_name
  cd app_name
  write '.gitignore', GITIGNORE
  write '.ruby-version', RUBY_VERSION        
  write '.ruby-gemset', app_name
  write 'VERSION', '1.0.0'
  write 'LICENSE.txt', "Copyright (c) #{Time.now.year} #{app_name}"
  write 'Gemfile', GEMFILE_APP
  write 'Rakefile', RAKEFILE
  mkdir 'app'
  write "app/#{file_name(app_name)}.rb", app_main_file(app_name)
  mkdir 'app/models'
  mkdir 'app/views'
  custom_shell('AppView', current_dir_name)
  if OS.mac?
    mkdir_p 'package/macosx'
    icon_file = "package/macosx/#{human_name(app_name)}.icns"
    cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
    puts "Created #{current_dir_name}/#{icon_file}"
  end
  mkdir 'bin'
  write "bin/#{file_name(app_name)}", app_bin_file(app_name)
  FileUtils.chmod 0755, "bin/#{app_name.underscore}"
  system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
  system "open packages/bundles/#{human_name(app_name).gsub(' ', '\ ')}.app"
  # TODO generate rspec test suite
end

.custom_shell(custom_shell_name, namespace) ⇒ Object



164
165
166
167
168
169
170
# File 'lib/glimmer/scaffold.rb', line 164

def custom_shell(custom_shell_name, namespace)
  namespace ||= current_dir_name
  root_dir = File.exists?('app') ? 'app' : 'lib'
  parent_dir = "#{root_dir}/views/#{file_name(namespace)}"
  mkdir_p parent_dir unless File.exists?(parent_dir)
  write "#{parent_dir}/#{file_name(custom_shell_name)}.rb", custom_shell_file(custom_shell_name, namespace)
end

.custom_shell_gem(custom_shell_name, namespace) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/glimmer/scaffold.rb', line 180

def custom_shell_gem(custom_shell_name, namespace)
  gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
  gem_summary = "Glimmer Custom Widget - #{human_name(custom_shell_name)}"
  if namespace
    gem_name += "-#{compact_name(namespace)}"
    gem_summary += " (#{human_name(namespace)})"
  else
    namespace = 'glimmer'
  end
  system "jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}" 
  cd gem_name
  write '.gitignore', GITIGNORE
  write '.ruby-version', RUBY_VERSION        
  write '.ruby-gemset', gem_name
  write 'VERSION', '1.0.0'
  write 'Gemfile', GEMFILE_GEM      
  write 'Rakefile', gem_rakefile
  append "lib/#{gem_name}.rb", gem_main_file(custom_shell_name, namespace)
  mkdir 'lib/views'
  custom_shell(custom_shell_name, namespace)
  system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n'"
  puts "Finished creating #{gem_name} Ruby gem."
  puts 'Edit Rakefile to configure gem details.'
  puts 'Run `rake` to execute specs.'
  puts 'Run `rake build` to build gem.'
  puts 'Run `rake release` to release into rubygems.org once ready.'
end

.custom_widget(custom_widget_name, namespace) ⇒ Object



172
173
174
175
176
177
178
# File 'lib/glimmer/scaffold.rb', line 172

def custom_widget(custom_widget_name, namespace)
  namespace ||= current_dir_name
  root_dir = File.exists?('app') ? 'app' : 'lib'
  parent_dir = "#{root_dir}/views/#{file_name(namespace)}"
  mkdir_p parent_dir unless File.exists?(parent_dir)
  write "#{parent_dir}/#{file_name(custom_widget_name)}.rb", custom_widget_file(custom_widget_name, namespace)
end

.custom_widget_gem(custom_widget_name, namespace) ⇒ Object



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/glimmer/scaffold.rb', line 208

def custom_widget_gem(custom_widget_name, namespace)
  gem_name = "glimmer-cw-#{compact_name(custom_widget_name)}"
  gem_summary = "Glimmer Custom Widget - #{human_name(custom_widget_name)}"
  if namespace
    gem_name += "-#{compact_name(namespace)}"
    gem_summary += " (#{human_name(namespace)})"
  else
    namespace = 'glimmer'
  end
  system "jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}" 
  cd gem_name
  write '.gitignore', GITIGNORE
  write '.ruby-version', RUBY_VERSION        
  write '.ruby-gemset', gem_name
  write 'VERSION', '1.0.0'
  write 'Gemfile', GEMFILE_GEM      
  write 'Rakefile', gem_rakefile
  write 'spec/spec_helper.rb', spec_helper_file
  append "lib/#{gem_name}.rb", gem_main_file(custom_widget_name, namespace)
  mkdir 'lib/views'
  custom_widget(custom_widget_name, namespace)
  system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n'"
  puts "Finished creating #{gem_name} Ruby gem."
  puts 'Edit Rakefile to configure gem details.'
  puts 'Run `rake` to execute specs.'
  puts 'Run `rake build` to build gem.'
  puts 'Run `rake release` to release into rubygems.org once ready.'
end