Module: Courtier::Interface
- Included in:
- Courtier
- Defined in:
- lib/courtier/interface.rb
Overview
The Interface module extends Courtier module.
A tool can control Courtier configuration by loading courtier and calling the
toplevel court or Courtier.setup method with a block that handles the
configuration for the feature as provided by a project's config file.
The block will often need to be conditioned on the current profile and/or the then current command. This is easy enough to do with #profile? and #command? methods.
require 'courtier'
Courtier.setup('rspec') do |config|
if config.profile?
RSpec.configure(&config)
end
end
Constant Summary collapse
- FILE_PATTERN =
Configuration file pattern. The standard configuration file name is
Config.rb, and that name should be used in most cases. However,.config.rbcan also be use and will take precedence if found. Conversely,config.rb(lowercase form) can also be used but has the least precedence.Config files looked for in the order or precedence:
* `.config.rb` or `.confile.rb` * `Config.rb` or `Confile.rb` * `config.rb` or `confile.rb`Yes, there are really too many choices here, but we haven't been able to settle on a smaller list just yet. Please come argue with us about what's best.
'{.c,C,c}on{fig.rb,file,file.rb}'- TWEAKS_DIR =
The tweaks directory is where special augementation script reside the are used to adjust behavior of certain popular tools to work with Courtier that would not otherwise do so.
File.dirname(__FILE__) + '/tweaks'
Instance Method Summary collapse
- #_configure(command) ⇒ Object private
-
#autoconfigure ⇒ Object
private
Copnfgure current commnad.
-
#bootstrap ⇒ Object
private
Setup courtier system.
-
#bootstrap_require ⇒ Object
private
Override require.
-
#cache ⇒ Object
Library configuration cache.
-
#clear! ⇒ Object
Clear the library configuration cache.
-
#configuration(gem = nil) ⇒ Configuration
Load library configuration for a given
gem. - #configure(tool, options = {}, &setup) ⇒ Object
-
#court(tool, options = {}, &block) ⇒ Object
Define a specialized configuration handler.
-
#current_profile ⇒ Object
Get current profile.
-
#current_profile=(profile) ⇒ Object
Set current profile.
-
#current_tool ⇒ Object
(also: #current_command)
Get current tool.
-
#current_tool=(tool) ⇒ Object
(also: #current_command=)
Set current tool.
-
#profile_names(tool = nil, opts = {}) ⇒ Object
Return a list of names of defined profiles for a given
tool. -
#profile_switch(command, *switches) ⇒ Object
Set current profile via ARGV switch.
-
#properties ⇒ Object
Properties of the current project.
-
#switch(command, switches = {}) ⇒ Object
Set enviroment variable(s) to command line switch value(s).
- #tweak(command) ⇒ Object private
Instance Method Details
#_configure(command) ⇒ Object (private)
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/courtier/interface.rb', line 281 def _configure(command) #, &setup) tweak(command) command_config = Courtier.configuration[command] return unless command_config setup = Courtier.court(command) command_config.each do |config| next if config.onload? # not command config next unless config.apply? config.require_feature setup ? setup.call(config) : config.call end end |
#autoconfigure ⇒ Object (private)
Copnfgure current commnad. This is used by the rc script.
274 275 276 |
# File 'lib/courtier/interface.rb', line 274 def autoconfigure _configure(current_command) end |
#bootstrap ⇒ Object (private)
Setup courtier system.
243 244 245 246 247 248 249 |
# File 'lib/courtier/interface.rb', line 243 def bootstrap @bootstrap ||= ( properties # prime global properties bootstrap_require true ) end |
#bootstrap_require ⇒ Object (private)
Override require.
256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/courtier/interface.rb', line 256 def bootstrap_require def Kernel.required(feature) config = Courtier.configuration[feature] if config setup = Courtier.court(feature) # FIXME: how to differentiate feature from command setup ? config.each do |config| next unless config.onload? # only command config next unless config.apply? setup ? setup.call(config) : config.call end end super(feature) if defined?(super) end end |
#cache ⇒ Object
Library configuration cache. Since configuration can be imported from other libraries, we keep a cache for each library.
65 66 67 |
# File 'lib/courtier/interface.rb', line 65 def cache @cache ||= {} end |
#clear! ⇒ Object
Clear the library configuration cache. This is mostly used for testing.
73 74 75 |
# File 'lib/courtier/interface.rb', line 73 def clear! @cache = {} end |
#configuration(gem = nil) ⇒ Configuration
Load library configuration for a given gem. If no gem is
specified then the current project's configuration is used.
83 84 85 86 |
# File 'lib/courtier/interface.rb', line 83 def configuration(gem=nil) key = gem ? gem.to_s : nil #Dir.pwd cache[key] ||= Configuration.load(:from=>gem) end |
#configure(tool, options = {}, &setup) ⇒ Object
233 234 235 236 |
# File 'lib/courtier/interface.rb', line 233 def configure(tool, ={}, &setup) court(tool, , &setup) _configure(tool) end |
#court(tool, options = {}, &block) ⇒ Object
Define a specialized configuration handler.
168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/courtier/interface.rb', line 168 def court(tool, ={}, &block) @setup ||= {} tool = tool.to_s if block @setup[tool] = Setup.new(tool, , &block) #path = Find.load_path(tool, :absolute=>true) #if path # if $LOADED_FEATURES.include?(path) # configure(tool) # end #end end @setup[tool.to_s] end |
#current_profile ⇒ Object
Get current profile.
136 137 138 |
# File 'lib/courtier/interface.rb', line 136 def current_profile ENV['profile'] || ENV['p'] || 'default' end |
#current_profile=(profile) ⇒ Object
Set current profile.
143 144 145 146 147 148 149 |
# File 'lib/courtier/interface.rb', line 143 def current_profile=(profile) if profile ENV['profile'] = profile.to_s else ENV['profile'] = nil end end |
#current_tool ⇒ Object Also known as: current_command
Not so sure ENV['tool'] is a good idea.
Get current tool.
120 121 122 |
# File 'lib/courtier/interface.rb', line 120 def current_tool File.basename(ENV['tool'] || $0) end |
#current_tool=(tool) ⇒ Object Also known as: current_command=
Set current tool.
128 129 130 |
# File 'lib/courtier/interface.rb', line 128 def current_tool=(tool) ENV['tool'] = tool.to_s end |
#profile_names(tool = nil, opts = {}) ⇒ Object
Return a list of names of defined profiles for a given tool.
104 105 106 107 108 109 110 111 112 113 |
# File 'lib/courtier/interface.rb', line 104 def profile_names(tool=nil, opts={}) if Hash === tool opts, tool = tool, nil end tool = tool || current_tool gem = opts[:from] configuration(gem).profile_names(tool) end |
#profile_switch(command, *switches) ⇒ Object
Set current profile via ARGV switch. This is done immediately,
setting ENV['profile'] to the switch value if this setup is
for the current commandline tool. The reason it is done immediately,
rather than assigning it in bootstrap, is b/c option parsers somtimes
consume ARGV as they parse it, and by then it would too late.
193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/courtier/interface.rb', line 193 def profile_switch(command, *switches) return unless command.to_s == Courtier.current_command switches.each do |switch, envar| if index = ARGV.index(switch) self.current_profile = ARGV[index+1] elsif arg = ARGV.find{ |a| a =~ /#{switch}=(.*?)/ } value = $1 value = value[1..-2] if value.start_with?('"') && value.end_with?('"') value = value[1..-2] if value.start_with?("'") && value.end_with?("'") self.currrent_profile = value end end end |
#properties ⇒ Object
Properties of the current project. These can be used in a project's config file to make configuration more interchangeable. Presently project properties are gathered from .ruby YAML or .gemspec.
NOTE: How properties are gathered will be refined in the future.
161 162 163 |
# File 'lib/courtier/interface.rb', line 161 def properties $properties ||= Properties.new end |
#switch(command, switches = {}) ⇒ Object
Set enviroment variable(s) to command line switch value(s). This is a more general form of #profile_switch and will probably not get much use in this context.
215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/courtier/interface.rb', line 215 def switch(command, switches={}) return unless command.to_s == Courtier.current_command switches.each do |switch, envar| if index = ARGV.index(switch) ENV[envar] = ARGV[index+1] elsif arg = ARGV.find{ |a| a =~ /#{switch}=(.*?)/ } value = $1 value = value[1..-2] if value.start_with?('"') && value.end_with?('"') value = value[1..-2] if value.start_with?("'") && value.end_with?("'") ENV[envar] = value end end end |
#tweak(command) ⇒ Object (private)
301 302 303 304 305 306 |
# File 'lib/courtier/interface.rb', line 301 def tweak(command) tweak = File.join(TWEAKS_DIR, command + '.rb') if File.exist?(tweak) require tweak end end |