Module: Origen::CodeGenerators::Actions
Overview
Common helpers available to all Origen code generators. Some of these have been copied from Rails and don’t make a lot of sense in an Origen context, however they are being kept around for now as they serve as good examples of how to write generator helpers.
Defined Under Namespace
Modules: Helpers
Instance Method Summary collapse
- #add_acronyms ⇒ Object
-
#add_autoload(name, options = {}) ⇒ Object
Adds an autoload statement for the given resource name into
app/lib/my_app_name.rb
. -
#add_config(name, value, options = {}) ⇒ Object
Adds an entry into
config/application.rb
. -
#add_source(source, _options = {}) ⇒ Object
Add the given source to
Gemfile
. -
#camelcase(name) ⇒ Object
Equivalent to calling name.camelcase, but this will identify the need to register any acronyms necessary to ensure the camelcased name can be translated back to the original name by the underscore method.
-
#comment_config(name, options = {}) ⇒ Object
Removes (comments out) the specified configuration setting from
config/application.rb
. - #config ⇒ Object
-
#environment(data = nil, options = {}) ⇒ Object
(also: #application)
Adds a line inside the Application class for
config/application.rb
. -
#gem(name, version, options = {}) ⇒ Object
Adds an entry into
Gemfile
for the supplied gem. -
#gem_group(*names, &block) ⇒ Object
Wraps gem entries inside a group.
-
#generate(what, *args) ⇒ Object
Generate something using a generator from Rails or a plugin.
-
#git(commands = {}) ⇒ Object
Run a command in git.
-
#initialize(*args) ⇒ Object
:nodoc:.
-
#lib(filename, data = nil, &block) ⇒ Object
Create a new file in the lib/ directory.
-
#rakefile(filename, data = nil, &block) ⇒ Object
Create a new
Rakefile
with the provided code (either in a block or a string). -
#readme(path) ⇒ Object
Reads the given file at the source root and prints it in the console.
- #underscored_app_namespace ⇒ Object
Methods included from Helpers
#add_type_to_namespaces, #class_name_to_blocks_dir, #class_name_to_lib_file, #internal_depth, #resource_path, #resource_path_to_blocks_dir, #resource_path_to_class, #resource_path_to_lib_file, #unless_has_method, #unless_valid_underscored_identifier, #validate_resource_path
Instance Method Details
#add_acronyms ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/origen/code_generators/actions.rb', line 43 def add_acronyms unless @required_acronyms.empty? top_level_file = File.join('app', 'lib', "#{underscored_app_namespace}.rb") if File.exist?(top_level_file) require_origen = "require 'origen'\n" prepend_to_file top_level_file, require_origen comment = "# The following acronyms are required to ensure that auto-loading works\n# properly with some of this application's class names\n" insert_into_file top_level_file, comment, after: require_origen @required_acronyms.each do |acronym| insert_into_file top_level_file, "Origen.register_acronym '#{acronym}'\n", after: comment end end end end |
#add_autoload(name, options = {}) ⇒ Object
Adds an autoload statement for the given resource name into app/lib/my_app_name.rb
An array of namespaces can optionally be supplied in the arguments. The name and namespaces should all be lower cased and underscored.
add_autoload "my_model", namespaces: ["my_namespace", "my_other_namespace"]
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/origen/code_generators/actions.rb', line 64 def add_autoload(name, = {}) namespaces = Array([:namespaces]) # Remove the app namespace if present, we will add the autoload inside the top-level module block namespaces.shift if namespaces.first == app_namespace top_level_file = File.join('app', 'lib', "#{underscored_app_namespace}.rb") if namespaces.empty? line = " autoload :#{camelcase(name)}, '#{underscored_app_namespace}/#{name}'\n" insert_into_file top_level_file, line, after: /module #{Origen.app.namespace}\n/ else contents = File.read(top_level_file) regex = "module #{Origen.app.namespace}\s*(#.*)?\n" indent = '' namespaces.each do |namespace| indent += ' ' new_regex = regex + "(\n|.)*^\s*module #{camelcase(namespace)}\s*(#.*)?\n" unless contents =~ Regexp.new(new_regex) lines = "#{indent}module #{camelcase(namespace)}\n" lines << "#{indent}end\n" insert_into_file top_level_file, lines, after: Regexp.new(regex), force: true end regex = new_regex end line = "#{indent} autoload :#{camelcase(name)}, '#{underscored_app_namespace}/#{namespaces.join('/')}/#{name}'\n" insert_into_file top_level_file, line, after: Regexp.new(regex) end end |
#add_config(name, value, options = {}) ⇒ Object
Adds an entry into config/application.rb
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/origen/code_generators/actions.rb', line 103 def add_config(name, value, = {}) # Set the message to be shown in logs = name.to_s if value ||= .delete(:value) << " (#{value})" end log :insert, file = File.join(Origen.root, 'config', 'application.rb') value = quote(value) if value.is_a?(String) value = ":#{value}" if value.is_a?(Symbol) insert_into_file file, " config.#{name} = #{value}\n\n", after: /^\s*class.*\n/ end |
#add_source(source, _options = {}) ⇒ Object
Add the given source to Gemfile
add_source "http://gems.github.com/"
169 170 171 172 173 174 175 |
# File 'lib/origen/code_generators/actions.rb', line 169 def add_source(source, = {}) log :source, source in_root do prepend_file 'Gemfile', "source #{quote(source)}\n", verbose: false end end |
#camelcase(name) ⇒ Object
Equivalent to calling name.camelcase, but this will identify the need to register any acronyms necessary to ensure the camelcased name can be translated back to the original name by the underscore method. The required acronyms will be saved to an instance variable, @required_acronyms, and calling the add_acronyms will add the code to register them to the current application.
33 34 35 36 37 38 39 40 41 |
# File 'lib/origen/code_generators/actions.rb', line 33 def camelcase(name) name = name.to_s name.split('_').each do |n| # Numbers won't be recognized as a split point when going back to underscore, so need to # register this field beginning with a number as an acronym @required_acronyms << n if n =~ /^\d/ end name.camelcase end |
#comment_config(name, options = {}) ⇒ Object
Removes (comments out) the specified configuration setting from config/application.rb
comment_config :semantically_version
94 95 96 97 98 99 100 |
# File 'lib/origen/code_generators/actions.rb', line 94 def comment_config(name, = {}) # Set the message to be shown in logs log :comment, name file = File.join(Origen.root, 'config', 'application.rb') comment_lines(file, /^\s*config.#{name}\s*=.*\n/) end |
#config ⇒ Object
20 21 22 |
# File 'lib/origen/code_generators/actions.rb', line 20 def config @config end |
#environment(data = nil, options = {}) ⇒ Object Also known as: application
Adds a line inside the Application class for config/application.rb
.
If options :env
is specified, the line is appended to the corresponding file in config/environments
.
environment do
"config.autoload_paths += %W(#{config.root}/extras)"
end
environment(nil, env: "development") do
"config.autoload_paths += %W(#{config.root}/extras)"
end
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/origen/code_generators/actions.rb', line 189 def environment(data = nil, = {}) sentinel = /class [a-z_:]+ < Rails::Application/i env_file_sentinel = /Rails\.application\.configure do/ data = yield if !data && block_given? in_root do if [:env].nil?.map(&:camelcase).join('::') inject_into_file 'config/application.rb', "\n #{data}", after: sentinel, verbose: false else Array([:env]).each do |env| inject_into_file "config/environments/#{env}.rb", "\n #{data}", after: env_file_sentinel, verbose: false end end end end |
#gem(name, version, options = {}) ⇒ Object
Adds an entry into Gemfile
for the supplied gem.
gem "rspec", group: :test
gem "technoweenie-restful-authentication", lib: "restful-authentication", source: "http://gems.github.com/"
gem "rails", "3.0", git: "git://github.com/rails/rails"
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/origen/code_generators/actions.rb', line 122 def gem(name, version, = {}) # Set the message to be shown in logs. Uses the git repo if one is given, # otherwise use name (version). parts, = [quote(name)], name if version ||= .delete(:version) parts << quote(version) << " (#{version})" end = [:git] if [:git] log :gemfile, .each do |option, value| parts << "#{option}: #{quote(value)}" end in_root do str = "gem #{parts.join(', ')}" str = ' ' + str if @in_group str = "\n" + str append_file 'Gemfile', str, verbose: false end end |
#gem_group(*names, &block) ⇒ Object
Wraps gem entries inside a group.
gem_group :development, :test do
gem "rspec-rails"
end
151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/origen/code_generators/actions.rb', line 151 def gem_group(*names, &block) name = names.map(&:inspect).join(', ') log :gemfile, "group #{name}" in_root do append_file 'Gemfile', "\ngroup #{name} do", force: true @in_group = true instance_eval(&block) @in_group = false append_file 'Gemfile', "\nend\n", force: true end end |
#generate(what, *args) ⇒ Object
Generate something using a generator from Rails or a plugin. The second parameter is the argument string that is passed to the generator or an Array that is joined.
generate(:authenticated, "user session")
259 260 261 262 263 264 |
# File 'lib/origen/code_generators/actions.rb', line 259 def generate(what, *args) log :generate, what argument = args.flat_map(&:to_s).join(' ') in_root { run_ruby_script("bin/rails generate #{what} #{argument}", verbose: false) } end |
#git(commands = {}) ⇒ Object
Run a command in git.
git :init
git add: "this.file that.rb"
git add: "onefile.rb", rm: "badfile.cxx"
211 212 213 214 215 216 217 218 219 |
# File 'lib/origen/code_generators/actions.rb', line 211 def git(commands = {}) if commands.is_a?(Symbol) run "git #{commands}" else commands.each do |cmd, | run "git #{cmd} #{}" end end end |
#initialize(*args) ⇒ Object
:nodoc:
11 12 13 14 15 16 17 18 |
# File 'lib/origen/code_generators/actions.rb', line 11 def initialize(*args) # :nodoc: if args.last.is_a?(Hash) @config = args.last.delete(:config) || {} end @required_acronyms = Set.new super @in_group = nil end |
#lib(filename, data = nil, &block) ⇒ Object
Create a new file in the lib/ directory. Code can be specified in a block or a data string can be given.
lib("crypto.rb") do
"crypted_special_value = '#{rand}--#{Time.now}--#{rand(1337)}--'"
end
lib("foreign.rb", "# Foreign code is fun")
229 230 231 232 |
# File 'lib/origen/code_generators/actions.rb', line 229 def lib(filename, data = nil, &block) log :lib, filename create_file("lib/#{filename}", data, verbose: false, &block) end |
#rakefile(filename, data = nil, &block) ⇒ Object
Create a new Rakefile
with the provided code (either in a block or a string).
rakefile("bootstrap.rake") do
project = ask("What is the UNIX name of your project?")
<<-TASK
namespace :#{project} do
task :bootstrap do
puts "I like boots!"
end
end
TASK
end
rakefile('seed.rake', 'puts "Planting seeds"')
249 250 251 252 |
# File 'lib/origen/code_generators/actions.rb', line 249 def rakefile(filename, data = nil, &block) log :rakefile, filename create_file("lib/tasks/#{filename}", data, verbose: false, &block) end |
#readme(path) ⇒ Object
Reads the given file at the source root and prints it in the console.
readme "README"
269 270 271 |
# File 'lib/origen/code_generators/actions.rb', line 269 def readme(path) log File.read(find_in_source_paths(path)) end |