Class: Origen::Application::Environment
- Defined in:
- lib/origen/application/environment.rb
Overview
Class to control the environment.
The environment is a Ruby file that is loaded prior to generating every piece of output. It is optional, and is loaded before the target, thereby allowing targets to override environment settings.
A typical use case for the environment is to setup the test platform, or to set Origen to run in debug or simulation mode. It can generally be thought of as a global target.
All environment definition files must live in Origen.root/environment.
An instance of this class is automatically instantiated and available globally as Origen.environment.
Constant Summary collapse
- DIR =
:nodoc:
"#{Origen.root}/environment"
- SAVE_FILE =
:nodoc:
"#{DIR}/.default"
- DEFAULT_FILE =
:nodoc:
"#{DIR}/default.rb"
Instance Method Summary collapse
-
#all_environments ⇒ Object
Returns Array of all environments available.
-
#default=(name) ⇒ Object
As #temporary= except that the given environment will be set to the workspace default.
-
#default_file ⇒ Object
Load the default file from the workspace default if it exists and return it, otherwise returns nil.
-
#describe ⇒ Object
Prints out the current environment details to the command line.
-
#exists?(name) ⇒ Boolean
(also: #exist?)
Returns true if the environment exists, this can be used to test for the presence of an environment before calling one of the other methods to actually apply it.
-
#file ⇒ Object
Returns the environment file (a Pathname object) if it has been defined, otherwise nil.
-
#file! ⇒ Object
As file except will raise an exception if it hasn’t been defined yet.
-
#file=(path) ⇒ Object
:nodoc:.
-
#find(name) ⇒ Object
Returns an array of matching environment file paths.
-
#forget ⇒ Object
Remove the workspace default environment.
-
#name ⇒ Object
Returns the name (the filename) of the current environment.
-
#save ⇒ Object
Saves the current environment as the workspace default, i.e.
-
#temporary=(name) ⇒ Object
(also: #switch, #switch_to)
Switch to the supplied environment, name can be a fragment as long as it allows a unique environment to be identified.
-
#temporary? ⇒ Boolean
Returns true if running with a temporary environment, i.e.
-
#unique?(name) ⇒ Boolean
Similar to the exists? method, this will return true only if the given name resolves to a single valid environment.
Instance Method Details
#all_environments ⇒ Object
Returns Array of all environments available
27 28 29 30 31 32 33 |
# File 'lib/origen/application/environment.rb', line 27 def all_environments envs = [] find('').sort.each do |file| envs << File.basename(file) end envs end |
#default=(name) ⇒ Object
As #temporary= except that the given environment will be set to the workspace default
81 82 83 84 85 86 87 88 |
# File 'lib/origen/application/environment.rb', line 81 def default=(name) if name self.temporary = name else @file = nil end save end |
#default_file ⇒ Object
Load the default file from the workspace default if it exists and return it, otherwise returns nil
134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/origen/application/environment.rb', line 134 def default_file return @default_file if @default_file if File.exist?(SAVE_FILE) File.open(SAVE_FILE) do |f| @default_file = Marshal.load(f) end elsif File.exist?(DEFAULT_FILE) @default_file = Pathname.new(DEFAULT_FILE) end @default_file end |
#describe ⇒ Object
Prints out the current environment details to the command line
91 92 93 94 95 96 97 98 99 |
# File 'lib/origen/application/environment.rb', line 91 def describe f = file! puts "Current environment: #{f.basename}" puts '*' * 70 File.open(f).each do |line| puts " #{line}" end puts '*' * 70 end |
#exists?(name) ⇒ Boolean Also known as: exist?
Returns true if the environment exists, this can be used to test for the presence of an environment before calling one of the other methods to actually apply it.
It will return true if one or more environments are found matching the given name, use the unique? method to test if the given name uniquely identifies a valid environment.
41 42 43 44 |
# File 'lib/origen/application/environment.rb', line 41 def exists?(name) envs = find(name) envs.size > 0 end |
#file ⇒ Object
Returns the environment file (a Pathname object) if it has been defined, otherwise nil
148 149 150 151 152 153 154 |
# File 'lib/origen/application/environment.rb', line 148 def file # :nodoc: return @file if @file if default_file && File.exist?(default_file) @file = default_file end end |
#file! ⇒ Object
As file except will raise an exception if it hasn’t been defined yet
157 158 159 160 161 162 163 164 165 |
# File 'lib/origen/application/environment.rb', line 157 def file! # :nodoc: unless file puts 'No environment has been specified!' puts 'To specify an environment use the -e switch.' puts 'Look in the environment directory for a list of available environment names.' exit 1 end file end |
#file=(path) ⇒ Object
:nodoc:
167 168 169 170 171 172 173 |
# File 'lib/origen/application/environment.rb', line 167 def file=(path) # :nodoc: if path @file = Pathname.new(path) else @file = nil end end |
#find(name) ⇒ Object
Returns an array of matching environment file paths
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/origen/application/environment.rb', line 102 def find(name) if name name = name.gsub('*', '') if File.exist?(name) [name] elsif File.exist?("#{Origen.root}/environment/#{name}") && name != '' ["#{Origen.root}/environment/#{name}"] else # The below weirdness is to make it recurse into symlinked directories Dir.glob("#{DIR}/**{,/*/**}/*").sort.uniq.select do |file| File.basename(file) =~ /#{name}/ && file !~ /.*\.rb.+$/ end end else [nil] end end |
#forget ⇒ Object
Remove the workspace default environment
176 177 178 179 |
# File 'lib/origen/application/environment.rb', line 176 def forget File.delete(SAVE_FILE) if File.exist?(SAVE_FILE) @default_file = nil end |
#name ⇒ Object
Returns the name (the filename) of the current environment
22 23 24 |
# File 'lib/origen/application/environment.rb', line 22 def name file.basename('.rb').to_s if file end |
#save ⇒ Object
Saves the current environment as the workspace default, i.e. the current environment will be used by Origen the next time if no other environment is specified
122 123 124 125 126 127 128 129 130 |
# File 'lib/origen/application/environment.rb', line 122 def save # :nodoc: if @file File.open(SAVE_FILE, 'w') do |f| Marshal.dump(file, f) end else forget end end |
#temporary=(name) ⇒ Object Also known as: switch, switch_to
Switch to the supplied environment, name can be a fragment as long as it allows a unique environment to be identified.
Calling this method does not affect the default environment setting in the workspace.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/origen/application/environment.rb', line 58 def temporary=(name) envs = find(name) if envs.size == 0 puts "Sorry no environments were found matching '#{name}'!" puts 'Here are the available options:' find('').sort.each do |file| puts File.basename(file) end exit 1 elsif envs.size > 1 puts 'Please try again with one of the following environments:' envs.sort.each do |file| puts File.basename(file) end exit 1 else self.file = envs[0] end end |
#temporary? ⇒ Boolean
Returns true if running with a temporary environment, i.e. if the current environment is not the same as the default environment
183 184 185 |
# File 'lib/origen/application/environment.rb', line 183 def temporary? @file == @default_file end |
#unique?(name) ⇒ Boolean
Similar to the exists? method, this will return true only if the given name resolves to a single valid environment.
49 50 51 52 |
# File 'lib/origen/application/environment.rb', line 49 def unique?(name) envs = find(name) envs.size == 1 end |