origen 0.0.1 → 0.0.2
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/bin/ctags +0 -0
- data/bin/origen +165 -1
- data/bin/rgen +2 -0
- data/config/application.rb +141 -0
- data/config/commands.rb +72 -0
- data/config/development.rb +7 -0
- data/config/environment.rb +0 -0
- data/config/rgen.policy +7 -0
- data/config/rubocop/easy.yml +620 -0
- data/config/rubocop/easy_disabled.yml +271 -0
- data/config/rubocop/easy_enabled.yml +731 -0
- data/config/rubocop/strict.yml +620 -0
- data/config/rubocop/strict_disabled.yml +247 -0
- data/config/rubocop/strict_enabled.yml +755 -0
- data/config/users.rb +20 -0
- data/config/version.rb +1 -1
- data/helpers/url.rb +68 -0
- data/lib/c99/doc_interface.rb +56 -0
- data/lib/c99/j750_interface.rb +85 -0
- data/lib/c99/nvm.rb +89 -0
- data/lib/c99/target/mock2.rb +1 -0
- data/lib/c99/target/subdir/mock3.rb +1 -0
- data/lib/option_parser/optparse.rb +12 -0
- data/lib/origen/acronyms.rb +60 -0
- data/lib/origen/application/command_dispatcher.rb +12 -0
- data/lib/origen/application/configuration.rb +206 -0
- data/lib/origen/application/configuration_manager.rb +78 -0
- data/lib/origen/application/deployer.rb +367 -0
- data/lib/origen/application/environment.rb +186 -0
- data/lib/origen/application/lsf.rb +145 -0
- data/lib/origen/application/lsf_manager.rb +657 -0
- data/lib/origen/application/plugins_manager.rb +280 -0
- data/lib/origen/application/release.rb +359 -0
- data/lib/origen/application/runner.rb +246 -0
- data/lib/origen/application/statistics.rb +191 -0
- data/lib/origen/application/target.rb +374 -0
- data/lib/origen/application/version_tracker.rb +59 -0
- data/lib/origen/application/workspace_manager.rb +151 -0
- data/lib/origen/application.rb +746 -0
- data/lib/origen/bugs/bug.rb +36 -0
- data/lib/origen/bugs.rb +45 -0
- data/lib/origen/callbacks.rb +35 -0
- data/lib/origen/chip_mode.rb +118 -0
- data/lib/origen/chip_package.rb +461 -0
- data/lib/origen/client.rb +87 -0
- data/lib/origen/code_generators/actions.rb +258 -0
- data/lib/origen/code_generators/base.rb +57 -0
- data/lib/origen/code_generators/bundler.rb +17 -0
- data/lib/origen/code_generators/gem_setup.rb +49 -0
- data/lib/origen/code_generators/rake.rb +13 -0
- data/lib/origen/code_generators/rspec.rb +12 -0
- data/lib/origen/code_generators/semver.rb +39 -0
- data/lib/origen/code_generators/timever.rb +37 -0
- data/lib/origen/code_generators.rb +111 -0
- data/lib/origen/commands/add.rb +12 -0
- data/lib/origen/commands/compile.rb +62 -0
- data/lib/origen/commands/ctags.rb +9 -0
- data/lib/origen/commands/dispatch.rb +22 -0
- data/lib/origen/commands/environment.rb +11 -0
- data/lib/origen/commands/fetch.rb +63 -0
- data/lib/origen/commands/generate.rb +130 -0
- data/lib/origen/commands/interactive.rb +73 -0
- data/lib/origen/commands/lint.rb +82 -0
- data/lib/origen/commands/lsf.rb +93 -0
- data/lib/origen/commands/merge.rb +55 -0
- data/lib/origen/commands/modifications.rb +12 -0
- data/lib/origen/commands/new.rb +113 -0
- data/lib/origen/commands/plugin.rb +105 -0
- data/lib/origen/commands/program.rb +70 -0
- data/lib/origen/commands/rc.rb +442 -0
- data/lib/origen/commands/save.rb +56 -0
- data/lib/origen/commands/target.rb +27 -0
- data/lib/origen/commands/time.rb +127 -0
- data/lib/origen/commands/version.rb +17 -0
- data/lib/origen/commands/web.rb +221 -0
- data/lib/origen/commands.rb +272 -0
- data/lib/origen/commands_global.rb +76 -0
- data/lib/origen/controller.rb +94 -0
- data/lib/origen/core_ext/array.rb +23 -0
- data/lib/origen/core_ext/bignum.rb +36 -0
- data/lib/origen/core_ext/enumerable.rb +76 -0
- data/lib/origen/core_ext/fixnum.rb +46 -0
- data/lib/origen/core_ext/hash.rb +52 -0
- data/lib/origen/core_ext/module.rb +14 -0
- data/lib/origen/core_ext/numeric.rb +126 -0
- data/lib/origen/core_ext/object.rb +13 -0
- data/lib/origen/core_ext/range.rb +7 -0
- data/lib/origen/core_ext/string.rb +124 -0
- data/lib/origen/core_ext.rb +10 -0
- data/lib/origen/database/key_value_store.rb +111 -0
- data/lib/origen/database/key_value_stores.rb +108 -0
- data/lib/origen/database.rb +6 -0
- data/lib/origen/encodings.rb +102 -0
- data/lib/origen/features/feature.rb +22 -0
- data/lib/origen/features.rb +104 -0
- data/lib/origen/file_handler.rb +429 -0
- data/lib/origen/generator/comparator.rb +56 -0
- data/lib/origen/generator/compiler.rb +277 -0
- data/lib/origen/generator/flow.rb +49 -0
- data/lib/origen/generator/job.rb +131 -0
- data/lib/origen/generator/pattern.rb +356 -0
- data/lib/origen/generator/pattern_finder.rb +155 -0
- data/lib/origen/generator/pattern_iterator.rb +55 -0
- data/lib/origen/generator/renderer.rb +113 -0
- data/lib/origen/generator/resources.rb +40 -0
- data/lib/origen/generator/stage.rb +89 -0
- data/lib/origen/generator.rb +85 -0
- data/lib/origen/global_methods.rb +205 -0
- data/lib/origen/import_manager.rb +596 -0
- data/lib/origen/location/base.rb +116 -0
- data/lib/origen/location/map.rb +83 -0
- data/lib/origen/location.rb +6 -0
- data/lib/origen/log.rb +217 -0
- data/lib/origen/logger_methods.rb +56 -0
- data/lib/origen/mode.rb +61 -0
- data/lib/origen/model.rb +267 -0
- data/lib/origen/model_initializer.rb +45 -0
- data/lib/origen/nvm/block_array.rb +72 -0
- data/lib/origen/nvm.rb +6 -0
- data/lib/origen/parameters/live.rb +22 -0
- data/lib/origen/parameters/missing.rb +28 -0
- data/lib/origen/parameters/set.rb +144 -0
- data/lib/origen/parameters.rb +107 -0
- data/lib/origen/pdm.rb +218 -0
- data/lib/origen/pins/function_proxy.rb +36 -0
- data/lib/origen/pins/ground_pin.rb +6 -0
- data/lib/origen/pins/pin.rb +860 -0
- data/lib/origen/pins/pin_bank.rb +349 -0
- data/lib/origen/pins/pin_clock.rb +124 -0
- data/lib/origen/pins/pin_collection.rb +492 -0
- data/lib/origen/pins/pin_common.rb +206 -0
- data/lib/origen/pins/port.rb +268 -0
- data/lib/origen/pins/power_pin.rb +30 -0
- data/lib/origen/pins.rb +696 -0
- data/lib/origen/registers/bit.rb +562 -0
- data/lib/origen/registers/bit_collection.rb +787 -0
- data/lib/origen/registers/container.rb +288 -0
- data/lib/origen/registers/domain.rb +16 -0
- data/lib/origen/registers/reg.rb +1406 -0
- data/lib/origen/registers/reg_collection.rb +24 -0
- data/lib/origen/registers.rb +652 -0
- data/lib/origen/regression_manager.rb +251 -0
- data/lib/origen/remote_manager.rb +340 -0
- data/lib/origen/revision_control/base.rb +257 -0
- data/lib/origen/revision_control/design_sync.rb +276 -0
- data/lib/origen/revision_control/git.rb +243 -0
- data/lib/origen/revision_control/subversion.rb +6 -0
- data/lib/origen/revision_control.rb +44 -0
- data/lib/origen/ruby_version_check.rb +131 -0
- data/lib/origen/site_config.rb +61 -0
- data/lib/origen/specs/checkers.rb +103 -0
- data/lib/origen/specs/creation_info.rb +17 -0
- data/lib/origen/specs/doc_resource.rb +91 -0
- data/lib/origen/specs/exhibit.rb +17 -0
- data/lib/origen/specs/mode_select.rb +16 -0
- data/lib/origen/specs/note.rb +17 -0
- data/lib/origen/specs/override.rb +21 -0
- data/lib/origen/specs/power_supply.rb +13 -0
- data/lib/origen/specs/spec.rb +226 -0
- data/lib/origen/specs/version_history.rb +14 -0
- data/lib/origen/specs.rb +552 -0
- data/lib/origen/sub_blocks.rb +298 -0
- data/lib/origen/tester/api.rb +277 -0
- data/lib/origen/tester/bdm/bdm.rb +25 -0
- data/lib/origen/tester/command_based_tester.rb +46 -0
- data/lib/origen/tester/doc/doc.rb +226 -0
- data/lib/origen/tester/doc/generator/flow.rb +71 -0
- data/lib/origen/tester/doc/generator/flow_line.rb +203 -0
- data/lib/origen/tester/doc/generator/test.rb +68 -0
- data/lib/origen/tester/doc/generator/test_group.rb +66 -0
- data/lib/origen/tester/doc/generator/tests.rb +47 -0
- data/lib/origen/tester/doc/generator.rb +126 -0
- data/lib/origen/tester/doc/model.rb +162 -0
- data/lib/origen/tester/generator/flow_control_api.rb +606 -0
- data/lib/origen/tester/generator/identity_map.rb +25 -0
- data/lib/origen/tester/generator/placeholder.rb +13 -0
- data/lib/origen/tester/generator/test_numberer.rb +25 -0
- data/lib/origen/tester/generator.rb +271 -0
- data/lib/origen/tester/interface.rb +154 -0
- data/lib/origen/tester/j750/files.rb +45 -0
- data/lib/origen/tester/j750/generator/flow.rb +123 -0
- data/lib/origen/tester/j750/generator/flow_line.rb +288 -0
- data/lib/origen/tester/j750/generator/patgroup.rb +111 -0
- data/lib/origen/tester/j750/generator/patgroups.rb +41 -0
- data/lib/origen/tester/j750/generator/patset.rb +111 -0
- data/lib/origen/tester/j750/generator/patsets.rb +41 -0
- data/lib/origen/tester/j750/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/j750/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/j750/generator/test_instance.rb +846 -0
- data/lib/origen/tester/j750/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/j750/generator/test_instances.rb +182 -0
- data/lib/origen/tester/j750/generator.rb +203 -0
- data/lib/origen/tester/j750/j750.rb +845 -0
- data/lib/origen/tester/j750/j750_hpt.rb +35 -0
- data/lib/origen/tester/j750/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/j750/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/j750/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/j750/parser/descriptions.rb +340 -0
- data/lib/origen/tester/j750/parser/flow.rb +111 -0
- data/lib/origen/tester/j750/parser/flow_line.rb +207 -0
- data/lib/origen/tester/j750/parser/flows.rb +23 -0
- data/lib/origen/tester/j750/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/j750/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/j750/parser/test_instance.rb +322 -0
- data/lib/origen/tester/j750/parser/test_instances.rb +26 -0
- data/lib/origen/tester/j750/parser/timeset.rb +15 -0
- data/lib/origen/tester/j750/parser/timesets.rb +0 -0
- data/lib/origen/tester/j750/parser.rb +104 -0
- data/lib/origen/tester/jlink/jlink.rb +33 -0
- data/lib/origen/tester/parser/description_lookup.rb +64 -0
- data/lib/origen/tester/parser/searchable_array.rb +32 -0
- data/lib/origen/tester/parser/searchable_hash.rb +32 -0
- data/lib/origen/tester/parser.rb +24 -0
- data/lib/origen/tester/time.rb +338 -0
- data/lib/origen/tester/timing.rb +253 -0
- data/lib/origen/tester/ultraflex/files.rb +45 -0
- data/lib/origen/tester/ultraflex/generator/flow.rb +119 -0
- data/lib/origen/tester/ultraflex/generator/flow_line.rb +269 -0
- data/lib/origen/tester/ultraflex/generator/patgroup.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patgroups.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/patset.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patsets.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/ultraflex/generator/test_instance.rb +622 -0
- data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/ultraflex/generator/test_instances.rb +174 -0
- data/lib/origen/tester/ultraflex/generator.rb +200 -0
- data/lib/origen/tester/ultraflex/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/ultraflex/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/ultraflex/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/ultraflex/parser/descriptions.rb +342 -0
- data/lib/origen/tester/ultraflex/parser/flow.rb +111 -0
- data/lib/origen/tester/ultraflex/parser/flow_line.rb +207 -0
- data/lib/origen/tester/ultraflex/parser/flows.rb +23 -0
- data/lib/origen/tester/ultraflex/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/ultraflex/parser/test_instance.rb +262 -0
- data/lib/origen/tester/ultraflex/parser/test_instances.rb +26 -0
- data/lib/origen/tester/ultraflex/parser/timeset.rb +15 -0
- data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
- data/lib/origen/tester/ultraflex/parser.rb +104 -0
- data/lib/origen/tester/ultraflex/ultraflex.rb +759 -0
- data/lib/origen/tester/v93k/generator/flow.rb +63 -0
- data/lib/origen/tester/v93k/generator/flow_node/print.rb +10 -0
- data/lib/origen/tester/v93k/generator/flow_node.rb +17 -0
- data/lib/origen/tester/v93k/generator/pattern.rb +16 -0
- data/lib/origen/tester/v93k/generator/pattern_master.rb +54 -0
- data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +6 -0
- data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +11 -0
- data/lib/origen/tester/v93k/generator/templates/template.flow.erb +121 -0
- data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +9 -0
- data/lib/origen/tester/v93k/generator/test_function.rb +103 -0
- data/lib/origen/tester/v93k/generator/test_functions.rb +79 -0
- data/lib/origen/tester/v93k/generator/test_method.rb +46 -0
- data/lib/origen/tester/v93k/generator/test_methods.rb +75 -0
- data/lib/origen/tester/v93k/generator/test_suite.rb +54 -0
- data/lib/origen/tester/v93k/generator/test_suites.rb +65 -0
- data/lib/origen/tester/v93k/generator.rb +80 -0
- data/lib/origen/tester/v93k/v93k.rb +420 -0
- data/lib/origen/tester/vector.rb +86 -0
- data/lib/origen/tester/vector_generator.rb +633 -0
- data/lib/origen/tester/vector_pipeline.rb +150 -0
- data/lib/origen/tester.rb +56 -0
- data/lib/origen/top_level.rb +134 -0
- data/lib/origen/users/ldap.rb +65 -0
- data/lib/origen/users/user.rb +149 -0
- data/lib/origen/users.rb +30 -0
- data/lib/origen/utility/block_args.rb +93 -0
- data/lib/origen/utility/csv_data.rb +110 -0
- data/lib/origen/utility/design_sync.rb +494 -0
- data/lib/origen/utility/diff.rb +158 -0
- data/lib/origen/utility/input_capture.rb +121 -0
- data/lib/origen/utility/mailer.rb +143 -0
- data/lib/origen/utility/s_record.rb +205 -0
- data/lib/origen/utility/time_and_date.rb +30 -0
- data/lib/origen/utility.rb +12 -0
- data/lib/origen/version_checker.rb +117 -0
- data/lib/origen/version_string.rb +356 -0
- data/lib/origen.rb +648 -0
- data/lib/tasks/gem.rake +27 -22
- data/origen_site_config.yml +36 -0
- data/source_setup +17 -0
- data/spec/format/rgen_formatter.rb +14 -0
- data/templates/api_doc/README.txt.erb +24 -0
- data/templates/code_generators/gemfile_app.rb +4 -0
- data/templates/code_generators/gemfile_plugin.rb +6 -0
- data/templates/code_generators/gemspec.rb +33 -0
- data/templates/code_generators/rakefile.rb +10 -0
- data/templates/code_generators/spec_helper.rb +49 -0
- data/templates/code_generators/version.rb +8 -0
- data/templates/code_generators/version_time.rb +3 -0
- data/templates/git/gitignore.erb +33 -0
- data/templates/j750/_vt_flow.txt.erb +8 -0
- data/templates/j750/_vt_instances.txt.erb +4 -0
- data/templates/j750/program_sheet.txt.erb +9 -0
- data/templates/nanoc/Rules +74 -0
- data/templates/nanoc/config.yaml +77 -0
- data/templates/nanoc/content/favicon.ico +0 -0
- data/templates/nanoc/layouts/bootstrap.html.erb +63 -0
- data/templates/nanoc/layouts/bootstrap3.html.erb +71 -0
- data/templates/nanoc/layouts/freescale.html.erb +79 -0
- data/templates/nanoc/lib/bootstrap_filter.rb +49 -0
- data/templates/nanoc/lib/codeblocks_filter.rb +41 -0
- data/templates/nanoc/lib/default.rb +2 -0
- data/templates/nanoc/lib/gzip_filter.rb +16 -0
- data/templates/nanoc/lib/haml_code_filter.rb +41 -0
- data/templates/nanoc/lib/helpers.rb +1 -0
- data/templates/nanoc/lib/search_filter.rb +62 -0
- data/templates/nanoc_dynamic/content/search.js.erb +92 -0
- data/templates/shared/web/_logo.html +10 -0
- data/templates/test/_inline_sub.txt.erb +2 -0
- data/templates/test/environment.txt.erb +1 -0
- data/templates/test/inline.txt.erb +11 -0
- data/templates/test/inspections.txt.erb +19 -0
- data/templates/test/set1/_sub1.txt.erb +12 -0
- data/templates/test/set1/_sub4.txt.erb +1 -0
- data/templates/test/set1/_sub5.txt.erb +1 -0
- data/templates/test/set1/main.txt.erb +53 -0
- data/templates/test/set1/sub_dir/_sub2.txt.erb +20 -0
- data/templates/test/set1/sub_dir/_sub3.txt.erb +12 -0
- data/templates/test/set1/sub_dir/main2.txt.erb +4 -0
- data/templates/test/set2/template_with_no_erb_1.txt +9 -0
- data/templates/test/set2/template_with_no_erb_2.txt +9 -0
- data/templates/test/set3/_layout.html.erb +4 -0
- data/templates/test/set3/content.html.erb +6 -0
- data/templates/time/filter.rb.erb +15 -0
- data/templates/time/rules.rb.erb +45 -0
- metadata +639 -5
data/lib/origen/specs.rb
ADDED
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Specs
|
|
3
|
+
autoload :Spec, 'origen/specs/spec'
|
|
4
|
+
autoload :Note, 'origen/specs/note'
|
|
5
|
+
autoload :Exhibit, 'origen/specs/exhibit'
|
|
6
|
+
autoload :Doc_Resource, 'origen/specs/doc_resource.rb'
|
|
7
|
+
autoload :Override, 'origen/specs/override.rb'
|
|
8
|
+
autoload :Power_Supply, 'origen/specs/power_supply.rb'
|
|
9
|
+
autoload :Mode_Select, 'origen/specs/mode_select.rb'
|
|
10
|
+
autoload :Version_History, 'origen/specs/version_history.rb'
|
|
11
|
+
autoload :Creation_Info, 'origen/specs/creation_info.rb'
|
|
12
|
+
require_relative 'specs/checkers'
|
|
13
|
+
|
|
14
|
+
attr_accessor :_specs, :_notes, :_exhibits, :_doc_resources, :_overrides, :_power_supplies, :_mode_selects, :_version_history, :_creation_info
|
|
15
|
+
|
|
16
|
+
SPEC_TYPES = [:dc, :ac, :temperature, :supply]
|
|
17
|
+
|
|
18
|
+
NOTE_TYPES = [:spec, :doc, :mode, :feature, :sighting]
|
|
19
|
+
|
|
20
|
+
SpecTableAttr = Struct.new(:table_text, :show, :padding)
|
|
21
|
+
|
|
22
|
+
# Returns a hash of hash containing all specs/modes
|
|
23
|
+
# If no spec is specified then all specs are returned via inspect
|
|
24
|
+
# If a spec is specified, a spec object will be returned if found
|
|
25
|
+
# in the current mode. If a mode option is passed and no spec
|
|
26
|
+
# is passed it will filter the specs inspect display by the mode
|
|
27
|
+
# and visa-versa
|
|
28
|
+
def specs(s = nil, options = {})
|
|
29
|
+
options = {
|
|
30
|
+
type: nil,
|
|
31
|
+
sub_type: nil,
|
|
32
|
+
mode: current_mode.nil? ? nil : current_mode.name,
|
|
33
|
+
spec: nil,
|
|
34
|
+
verbose: false,
|
|
35
|
+
creating_spec: false
|
|
36
|
+
}.update(options)
|
|
37
|
+
_specs
|
|
38
|
+
if s.nil?
|
|
39
|
+
return show_specs(options)
|
|
40
|
+
elsif s.is_a? Hash # no spec was passed but some option was passed
|
|
41
|
+
options.update(s)
|
|
42
|
+
return show_specs(options)
|
|
43
|
+
else # a spec was passed
|
|
44
|
+
options[:spec] = s
|
|
45
|
+
return show_specs(options)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Define and instantiate a Spec object
|
|
50
|
+
def spec(name, type, mode = nil, &block)
|
|
51
|
+
_specs
|
|
52
|
+
name = name_audit(name)
|
|
53
|
+
fail 'Specification names must be of SPEC_TYPES Symbol or String and cannot start with a number' if name.nil?
|
|
54
|
+
fail "Spec type must be one of #{SPEC_TYPES.join(', ')}" unless SPEC_TYPES.include? type
|
|
55
|
+
type = type
|
|
56
|
+
mode = get_mode if mode.nil?
|
|
57
|
+
owner_name = ''
|
|
58
|
+
if self.respond_to?(:name) && send(:name)
|
|
59
|
+
owner_name = self.name.to_s.downcase.to_sym
|
|
60
|
+
elsif self == Origen.top_level
|
|
61
|
+
owner_name = self.class.to_s.split('::').last.downcase.to_sym
|
|
62
|
+
else
|
|
63
|
+
owner_name = self.class.to_s.split('::').last.downcase.to_sym
|
|
64
|
+
end
|
|
65
|
+
spec_placeholder = Spec
|
|
66
|
+
.new(name, type, mode, owner_name, &block)
|
|
67
|
+
# Check if the spec already exists
|
|
68
|
+
if has_spec?(name, type: type, mode: mode, sub_type: spec_placeholder.sub_type, creating_spec: true)
|
|
69
|
+
fail "Spec already exists for name: #{name}, type: #{type}, mode: #{mode} for object #{self}"
|
|
70
|
+
end
|
|
71
|
+
@_specs[name][mode][type][spec_placeholder.sub_type] = spec_placeholder
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns Boolean based on whether the calling object has any defined specs
|
|
75
|
+
# If the mode option is selected then the search is narrowed
|
|
76
|
+
def has_specs?(options = {})
|
|
77
|
+
_specs
|
|
78
|
+
options = {
|
|
79
|
+
type: nil,
|
|
80
|
+
sub_type: nil,
|
|
81
|
+
mode: current_mode.nil? ? nil : current_mode.name,
|
|
82
|
+
spec: nil,
|
|
83
|
+
verbose: false,
|
|
84
|
+
creating_spec: false
|
|
85
|
+
}.update(options)
|
|
86
|
+
if @_specs.nil? || @_specs == {}
|
|
87
|
+
return false
|
|
88
|
+
else
|
|
89
|
+
return !!show_specs(options)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def get_modes
|
|
94
|
+
@_modes
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Check if the current IP has a spec
|
|
98
|
+
def has_spec?(s, options = {})
|
|
99
|
+
_specs
|
|
100
|
+
options = {
|
|
101
|
+
type: nil,
|
|
102
|
+
sub_type: nil,
|
|
103
|
+
mode: current_mode.nil? ? nil : current_mode.name,
|
|
104
|
+
spec: nil,
|
|
105
|
+
verbose: false,
|
|
106
|
+
creating_spec: false
|
|
107
|
+
}.update(options)
|
|
108
|
+
options[:spec] = s
|
|
109
|
+
!!show_specs(options)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Define and instantiate a Note object
|
|
113
|
+
def note(id, type, options = {})
|
|
114
|
+
_notes
|
|
115
|
+
@_notes[id][type] = Note.new(id, type, options)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def exhibit(id, type, options = {})
|
|
119
|
+
_exhibits
|
|
120
|
+
@_exhibits[id][type] = Exhibit.new(id, type, options)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def doc_resource(selector = {}, table_title = {}, text = {}, options = {})
|
|
124
|
+
_doc_resources
|
|
125
|
+
mode = selector[:mode]
|
|
126
|
+
type = selector[:type]
|
|
127
|
+
sub_type = selector[:sub_type]
|
|
128
|
+
audience = selector[:audience]
|
|
129
|
+
@_doc_resources[mode][type][sub_type][audience] = Doc_Resource.new(selector, table_title, text, options)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def version_history(date, author, changes)
|
|
133
|
+
_version_history
|
|
134
|
+
tmp_ver_history = Version_History.new(date, author, changes)
|
|
135
|
+
@_version_history[date][author] = tmp_ver_history
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def override(block_options = {}, find_spec = {}, values = {}, options = {})
|
|
139
|
+
_overrides
|
|
140
|
+
block = block_options[:block]
|
|
141
|
+
spec_ref = find_spec[:spec_id]
|
|
142
|
+
mode_ref = find_spec[:mode_ref]
|
|
143
|
+
sub_type = find_spec[:sub_type]
|
|
144
|
+
audience = find_spec[:audience]
|
|
145
|
+
@_overrides[block][spec_ref][mode_ref][sub_type][audience] = Override.new(block_options, find_spec, values, options)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def power_supply(gen, act)
|
|
149
|
+
_power_supplies
|
|
150
|
+
@_power_supplies[gen][act] = Power_Supply.new(gen, act)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def mode_select(blk, use, mode_ref, support, loc)
|
|
154
|
+
_mode_selects
|
|
155
|
+
if use
|
|
156
|
+
@_mode_selects[blk][mode_ref] = Mode_Select.new(blk, use, mode_ref, support, loc)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def creation_info(author, date, src_info = {}, tool_info = {})
|
|
161
|
+
@_creation_info = Creation_Info.new(author, date, src_info, tool_info)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Returns a Note object from the notes hash
|
|
165
|
+
def notes(options = {})
|
|
166
|
+
options = {
|
|
167
|
+
id: nil,
|
|
168
|
+
type: nil
|
|
169
|
+
}.update(options)
|
|
170
|
+
notes_found = Hash.new do |h, k|
|
|
171
|
+
h[k] = {}
|
|
172
|
+
end
|
|
173
|
+
_notes.filter(options[:id]).each do |id, hash|
|
|
174
|
+
hash.filter(options[:type]).each do |type, note|
|
|
175
|
+
notes_found[id][type] = note
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
if notes_found.empty?
|
|
179
|
+
return nil
|
|
180
|
+
elsif notes_found.size == 1
|
|
181
|
+
notes_found.values.first.values.first
|
|
182
|
+
else
|
|
183
|
+
return notes_found
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def exhibits(options = {})
|
|
188
|
+
options = {
|
|
189
|
+
id: nil,
|
|
190
|
+
type: nil
|
|
191
|
+
}.update(options)
|
|
192
|
+
exhibits_found = Hash.new do|h, k|
|
|
193
|
+
h[k] = {}
|
|
194
|
+
end
|
|
195
|
+
_exhibits.filter(options[:id]).each do |id, hash|
|
|
196
|
+
hash.filter(options[:type]).each do |type, exhibit|
|
|
197
|
+
exhibits_found[id][type] = exhibit
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
if exhibits_found.empty?
|
|
201
|
+
return nil
|
|
202
|
+
elsif exhibits_found.size == 1
|
|
203
|
+
return exhibits_found.values.first.values.first
|
|
204
|
+
else
|
|
205
|
+
return exhibits_found
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def doc_resources(options = {})
|
|
210
|
+
options = {
|
|
211
|
+
mode: nil,
|
|
212
|
+
type: nil,
|
|
213
|
+
sub_type: nil,
|
|
214
|
+
audience: nil,
|
|
215
|
+
doc_resources_to_be_shown: []
|
|
216
|
+
}.update(options)
|
|
217
|
+
doc_resources_to_be_shown = options[:doc_resources_to_be_shown]
|
|
218
|
+
filter_hash(_doc_resources, options[:mode]).each do |_doc_resource, hash|
|
|
219
|
+
filter_hash(hash, options[:type]).each do |_type, hash_|
|
|
220
|
+
filter_hash(hash_, options[:sub_type]).each do |_sub_type, hash__|
|
|
221
|
+
filter_hash(hash__, options[:audience]).each do |_audience, spec|
|
|
222
|
+
doc_resources_to_be_shown << spec
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def overrides(options = {})
|
|
230
|
+
options = {
|
|
231
|
+
block: nil,
|
|
232
|
+
spec_ref: nil,
|
|
233
|
+
mode_ref: nil,
|
|
234
|
+
sub_type: nil,
|
|
235
|
+
audience: nil,
|
|
236
|
+
overrides: []
|
|
237
|
+
}.update(options)
|
|
238
|
+
overrides = options[:overrides]
|
|
239
|
+
filter_hash(_overrides, options[:block]).each do |_override, hash|
|
|
240
|
+
filter_hash(hash, options[:spec_ref]).each do |_spec_ref, hash_|
|
|
241
|
+
filter_hash(hash_, options[:mode_ref]).each do |_mode_ref, hash__|
|
|
242
|
+
filter_hash(hash__, options[:sub_type]).each do |_sub_type, hash___|
|
|
243
|
+
filter_hash(hash___, options[:audience]).each do |_audience, override|
|
|
244
|
+
overrides << override
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def mode_selects(options = {})
|
|
253
|
+
options = {
|
|
254
|
+
block: nil,
|
|
255
|
+
mode: nil
|
|
256
|
+
}.update(options)
|
|
257
|
+
modes_found = Hash.new do|h, k|
|
|
258
|
+
h[k] = {}
|
|
259
|
+
end
|
|
260
|
+
_mode_selects.filter(options[:block]).each do |block, hash|
|
|
261
|
+
hash.filter(options[:mode]).each do |mode, sel|
|
|
262
|
+
modes_found[block][mode] = sel
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
if modes_found.empty?
|
|
266
|
+
return nil
|
|
267
|
+
elsif modes_found.size == 1
|
|
268
|
+
return modes_found.values.first.values.first
|
|
269
|
+
else
|
|
270
|
+
return modes_found
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def power_supplies(options = {})
|
|
275
|
+
options = {
|
|
276
|
+
gen: nil,
|
|
277
|
+
act: nil
|
|
278
|
+
}.update(options)
|
|
279
|
+
ps_found = Hash.new do|h, k|
|
|
280
|
+
h[k] = {}
|
|
281
|
+
end
|
|
282
|
+
_power_supplies.filter(options[:gen]).each do |gen, hash|
|
|
283
|
+
hash.filter(options[:act]).each do |act, sel|
|
|
284
|
+
ps_found[gen][act] = sel
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
if ps_found.empty?
|
|
288
|
+
return nil
|
|
289
|
+
elsif ps_found.size == 1
|
|
290
|
+
return ps_found.values.first.values.first
|
|
291
|
+
else
|
|
292
|
+
return ps_found
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def versions
|
|
297
|
+
@_version_history
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def info
|
|
301
|
+
@_creation_info
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Delete all specs
|
|
305
|
+
def delete_all_specs
|
|
306
|
+
@_specs = nil
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# Delete all notes
|
|
310
|
+
def delete_all_notes
|
|
311
|
+
@_notes = nil
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Delete all exhibits
|
|
315
|
+
def delete_all_exhibits
|
|
316
|
+
@_exhibits = nil
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def delete_all_doc_resources
|
|
320
|
+
@_doc_resources = nil
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def delete_all_overrides
|
|
324
|
+
@_overrides = nil
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def delete_all_power_supplies
|
|
328
|
+
@_power_supplies = nil
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def delete_all_version_history
|
|
332
|
+
@_version_history = nil
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def delete_all_mode_selects
|
|
336
|
+
@_mode_selects = nil
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def delete_creation_info
|
|
340
|
+
@_creation_info = nil
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
private
|
|
344
|
+
|
|
345
|
+
def _specs
|
|
346
|
+
# 4D hash with name, type, mode, and sub_type as keys
|
|
347
|
+
@_specs ||= Hash.new do |h, k|
|
|
348
|
+
h[k] = Hash.new do |hh, kk|
|
|
349
|
+
hh[kk] = Hash.new do |hhh, kkk|
|
|
350
|
+
hhh[kkk] = {}
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# Two-dimensional hash with note id and type as the keys
|
|
357
|
+
def _notes
|
|
358
|
+
@_notes ||= Hash.new do |h, k|
|
|
359
|
+
h[k] = {}
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def _exhibits
|
|
364
|
+
@_exhibits ||= Hash.new do |h, k|
|
|
365
|
+
h[k] = {}
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def _doc_resources
|
|
370
|
+
@_doc_resources ||= Hash.new do |h, k|
|
|
371
|
+
h[k] = Hash.new do |hh, kk|
|
|
372
|
+
hh[kk] = Hash.new do |hhh, kkk|
|
|
373
|
+
hhh[kkk] = {}
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def _overrides
|
|
380
|
+
@_overrides ||= Hash.new do |h, k|
|
|
381
|
+
h[k] = Hash.new do |hh, kk|
|
|
382
|
+
hh[kk] = Hash.new do |hhh, kkk|
|
|
383
|
+
hhh[kkk] = Hash.new do |hhhh, kkkk|
|
|
384
|
+
hhhh[kkkk] = {}
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def _power_supplies
|
|
392
|
+
@_power_supplies ||= Hash.new do |h, k|
|
|
393
|
+
h[k] = {}
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
def _mode_selects
|
|
398
|
+
@_mode_selects ||= Hash.new do |h, k|
|
|
399
|
+
h[k] = {}
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def _version_history
|
|
404
|
+
@_version_history ||= Hash.new do |h, k|
|
|
405
|
+
h[k] = {}
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def _creation_info
|
|
410
|
+
@_creation_info = nil
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
# Return a hash based on the filter provided
|
|
414
|
+
def filter_hash(hash, filter)
|
|
415
|
+
fail 'Hash argument is not a Hash!' unless hash.is_a? Hash
|
|
416
|
+
filtered_hash = {}
|
|
417
|
+
select_logic = case filter
|
|
418
|
+
when String then 'k[Regexp.new(filter)]'
|
|
419
|
+
when (Fixnum || Integer || Float || Numeric) then "k[Regexp.new('#{filter}')]"
|
|
420
|
+
when Regexp then 'k[filter]'
|
|
421
|
+
when Symbol then
|
|
422
|
+
'k == filter'
|
|
423
|
+
when NilClass then true # Return all specs if a filter is set to nil (i.e. user doesn't care about this filter)
|
|
424
|
+
else true
|
|
425
|
+
end
|
|
426
|
+
# rubocop:disable UnusedBlockArgument
|
|
427
|
+
filtered_hash = hash.select do |k, v|
|
|
428
|
+
[TrueClass, FalseClass].include?(select_logic.class) ? select_logic : eval(select_logic)
|
|
429
|
+
end
|
|
430
|
+
filtered_hash
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
# Filters the 4D hash to find specs for all user visible API
|
|
434
|
+
def show_specs(options = {})
|
|
435
|
+
options = {
|
|
436
|
+
mode: nil,
|
|
437
|
+
spec: nil,
|
|
438
|
+
type: nil,
|
|
439
|
+
sub_type: nil,
|
|
440
|
+
verbose: false,
|
|
441
|
+
specs_to_be_shown: [],
|
|
442
|
+
owner: nil,
|
|
443
|
+
creating_spec: false
|
|
444
|
+
}.update(options)
|
|
445
|
+
specs_to_be_shown = options[:specs_to_be_shown]
|
|
446
|
+
filter_hash(_specs, options[:spec]).each do |_spec, hash|
|
|
447
|
+
filter_hash(hash, options[:mode]).each do |_mode, hash_|
|
|
448
|
+
filter_hash(hash_, options[:type]).each do |_type, hash__|
|
|
449
|
+
filter_hash(hash__, options[:sub_type]).each do |_sub_type, spec|
|
|
450
|
+
specs_to_be_shown << spec
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
# If no specs were found must check the possibility another search
|
|
456
|
+
# should be started with mode set to :local or :global
|
|
457
|
+
if specs_to_be_shown.empty?
|
|
458
|
+
# Don't want to re-call this method if the callee is trying to create a spec and just wants to know
|
|
459
|
+
# if there is a spec with the exact same options
|
|
460
|
+
if options[:creating_spec] == false
|
|
461
|
+
# Doesn't make sense to recall the method however if the mode is already set to :global or :local
|
|
462
|
+
unless [:global, :local, nil].include?(options[:mode])
|
|
463
|
+
# Need to check if there are :global or :local specs that match the filter(s) as well
|
|
464
|
+
if self == Origen.top_level
|
|
465
|
+
options[:mode] = :global
|
|
466
|
+
else
|
|
467
|
+
options[:mode] = :local
|
|
468
|
+
end
|
|
469
|
+
options[:specs_to_be_shown] = specs_to_be_shown
|
|
470
|
+
Origen.log.debug "re-calling show_specs with options #{options}"
|
|
471
|
+
return show_specs(options)
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
Origen.log.debug "Returning no specs for options #{options}"
|
|
475
|
+
return nil
|
|
476
|
+
elsif specs_to_be_shown.size == 1
|
|
477
|
+
print_to_console(specs_to_be_shown) if options[:verbose] == true
|
|
478
|
+
Origen.log.debug "returning one spec #{specs_to_be_shown.first.name}"
|
|
479
|
+
return specs_to_be_shown.first
|
|
480
|
+
else
|
|
481
|
+
Origen.log.debug "returning an array of specs during initial search: #{specs_to_be_shown}"
|
|
482
|
+
print_to_console(specs_to_be_shown) if options[:verbose] == true
|
|
483
|
+
return specs_to_be_shown
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
# Method to print a spec table to the console
|
|
488
|
+
def print_to_console(specs_to_be_shown)
|
|
489
|
+
whitespace_padding = 3
|
|
490
|
+
table = []
|
|
491
|
+
attrs_to_be_shown = {
|
|
492
|
+
name: SpecTableAttr.new('Name', true, 'Name'.length + whitespace_padding),
|
|
493
|
+
symbol: SpecTableAttr.new('Symbol', false, 'Symbol'.length + whitespace_padding),
|
|
494
|
+
mode: SpecTableAttr.new('Mode', true, 'Mode'.length + whitespace_padding),
|
|
495
|
+
type: SpecTableAttr.new('Type', true, 'Type'.length + whitespace_padding),
|
|
496
|
+
sub_type: SpecTableAttr.new('Sub-Type', false, 'Sub-Type'.length + whitespace_padding),
|
|
497
|
+
# spec SpecTableAttribute :description is called parameter in the spec table output to match historical docs
|
|
498
|
+
description: SpecTableAttr.new('Parameter', false, 'Parameter'.length + whitespace_padding),
|
|
499
|
+
min: SpecTableAttr.new('Min', false, 'Min'.length + whitespace_padding),
|
|
500
|
+
typ: SpecTableAttr.new('Typ', false, 'Typ'.length + whitespace_padding),
|
|
501
|
+
max: SpecTableAttr.new('Max', false, 'Max'.length + whitespace_padding),
|
|
502
|
+
unit: SpecTableAttr.new('Unit', false, 'Unit'.length + whitespace_padding),
|
|
503
|
+
audience: SpecTableAttr.new('Audience', false, 'Audience'.length + whitespace_padding)
|
|
504
|
+
# notes: SpecTableAttr.new('Notes', false, 'Notes'.length + whitespace_padding)
|
|
505
|
+
}
|
|
506
|
+
# Calculate the padding needed in the spec table for the longest attr of all specs
|
|
507
|
+
specs_to_be_shown.each do |spec|
|
|
508
|
+
attrs_to_be_shown.each do |attr_name, attr_struct|
|
|
509
|
+
unless spec.send(attr_name).nil?
|
|
510
|
+
if spec.send(attr_name).class == Origen::Specs::Spec::Limit
|
|
511
|
+
next if spec.send(attr_name).value.nil?
|
|
512
|
+
current_padding = spec.send(attr_name).value.to_s.length + whitespace_padding
|
|
513
|
+
else
|
|
514
|
+
current_padding = spec.send(attr_name).to_s.length + whitespace_padding
|
|
515
|
+
end
|
|
516
|
+
attr_struct.padding = current_padding if attr_struct.padding < current_padding
|
|
517
|
+
attr_struct.show = true # We found real data for this attr on at least one spec so show it in the spec table
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
# Now that each spec attribute padding construct the spec table header
|
|
522
|
+
header = ''
|
|
523
|
+
attrs_to_be_shown.each do |_attr_name, attr_struct|
|
|
524
|
+
next if attr_struct.show == false
|
|
525
|
+
header += "| #{attr_struct.table_text}".ljust(attr_struct.padding)
|
|
526
|
+
end
|
|
527
|
+
header += '|'
|
|
528
|
+
ip_header = "| IP: #{specs_to_be_shown.first.ip_name} ".ljust(header.length - 1)
|
|
529
|
+
ip_header += '|'
|
|
530
|
+
table << '=' * header.length
|
|
531
|
+
table << ip_header
|
|
532
|
+
table << '=' * header.length
|
|
533
|
+
table << header
|
|
534
|
+
table << '-' * header.length
|
|
535
|
+
# Create the data lines in the spec table
|
|
536
|
+
specs_to_be_shown.each do |spec|
|
|
537
|
+
data = ''
|
|
538
|
+
attrs_to_be_shown.each do |attr_name, attr_struct|
|
|
539
|
+
next if attr_struct.show == false
|
|
540
|
+
if spec.send(attr_name).class == Origen::Specs::Spec::Limit
|
|
541
|
+
data += "| #{spec.send(attr_name).value}".ljust(attr_struct.padding)
|
|
542
|
+
else
|
|
543
|
+
data += "| #{spec.send(attr_name)}".ljust(attr_struct.padding)
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
table << data += '|'
|
|
547
|
+
end
|
|
548
|
+
table << '-' * header.length
|
|
549
|
+
puts table.flatten.join("\n")
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
end
|