origen 0.44.0 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/config/application.rb +2 -2
  3. data/config/boot.rb +0 -7
  4. data/config/commands.rb +3 -74
  5. data/config/rubocop/easy_disabled.yml +4 -0
  6. data/config/rubocop/easy_enabled.yml +0 -4
  7. data/config/rubocop/strict_disabled.yml +4 -0
  8. data/config/rubocop/strict_enabled.yml +0 -4
  9. data/config/version.rb +1 -2
  10. data/lib/origen/application/deployer.rb +3 -1
  11. data/lib/origen/application/release.rb +2 -2
  12. data/lib/origen/application/runner.rb +9 -2
  13. data/lib/origen/application.rb +91 -2
  14. data/lib/origen/boot/app.rb +0 -4
  15. data/lib/origen/boot.rb +2 -1
  16. data/lib/origen/code_generators/actions.rb +244 -34
  17. data/lib/origen/code_generators/base.rb +9 -2
  18. data/lib/origen/code_generators/block.rb +203 -0
  19. data/lib/origen/code_generators/block_common.rb +100 -0
  20. data/lib/origen/code_generators/dut.rb +62 -0
  21. data/lib/origen/code_generators/feature.rb +50 -0
  22. data/lib/origen/code_generators/klass.rb +41 -0
  23. data/lib/origen/code_generators/model.rb +60 -0
  24. data/lib/origen/code_generators/module.rb +92 -0
  25. data/lib/origen/code_generators.rb +30 -10
  26. data/lib/origen/commands/lint.rb +6 -1
  27. data/lib/origen/commands/new.rb +1 -1
  28. data/lib/origen/commands/new_resource.rb +41 -0
  29. data/lib/origen/commands/web.rb +11 -6
  30. data/lib/origen/commands.rb +18 -0
  31. data/lib/{option_parser → origen/core_ext/option_parser}/optparse.rb +0 -0
  32. data/lib/origen/dependencies.rb +0 -0
  33. data/lib/origen/file_handler.rb +8 -4
  34. data/lib/origen/generator/pattern_finder.rb +3 -3
  35. data/lib/origen/loader.rb +377 -0
  36. data/lib/origen/model.rb +22 -1
  37. data/lib/origen/model_initializer.rb +5 -1
  38. data/lib/origen/parameters/set.rb +2 -1
  39. data/lib/origen/parameters.rb +95 -3
  40. data/lib/origen/sub_blocks.rb +21 -7
  41. data/lib/origen/top_level.rb +11 -0
  42. data/lib/origen.rb +3 -1
  43. data/origen_app_generators/Gemfile +6 -2
  44. data/origen_app_generators/Gemfile.lock +83 -72
  45. data/origen_app_generators/bin/boot.rb +4 -2
  46. data/origen_app_generators/config/commands.rb +3 -3
  47. data/origen_app_generators/config/shared_commands.rb +11 -6
  48. data/origen_app_generators/lbin/bundle +105 -0
  49. data/origen_app_generators/lbin/byebug +29 -0
  50. data/origen_app_generators/lbin/coderay +29 -0
  51. data/origen_app_generators/lbin/htmldiff +29 -0
  52. data/origen_app_generators/lbin/httparty +29 -0
  53. data/origen_app_generators/lbin/httpclient +29 -0
  54. data/origen_app_generators/lbin/kramdown +29 -0
  55. data/origen_app_generators/lbin/ldiff +29 -0
  56. data/origen_app_generators/lbin/nanoc +29 -0
  57. data/origen_app_generators/lbin/nokogiri +29 -0
  58. data/origen_app_generators/lbin/origen +62 -0
  59. data/origen_app_generators/lbin/pry +29 -0
  60. data/origen_app_generators/lbin/rackup +29 -0
  61. data/origen_app_generators/lbin/rake +29 -0
  62. data/origen_app_generators/lbin/rspec +29 -0
  63. data/origen_app_generators/lbin/rubocop +29 -0
  64. data/origen_app_generators/lbin/ruby-parse +29 -0
  65. data/origen_app_generators/lbin/ruby-rewrite +29 -0
  66. data/origen_app_generators/lbin/thor +29 -0
  67. data/origen_app_generators/lbin/tilt +29 -0
  68. data/origen_app_generators/lbin/yard +29 -0
  69. data/origen_app_generators/lbin/yardoc +29 -0
  70. data/origen_app_generators/lbin/yri +29 -0
  71. data/origen_app_generators/lib/origen_app_generators/application.rb +12 -12
  72. data/origen_app_generators/lib/origen_app_generators/base.rb +34 -8
  73. data/origen_app_generators/lib/origen_app_generators/new.rb +17 -9
  74. data/origen_app_generators/lib/{tasks/new_app_tests.rake → origen_app_generators/new_app_tests.rb} +1 -5
  75. data/origen_app_generators/lib/origen_app_generators/origen_infrastructure/app_generator_plugin.rb +6 -8
  76. data/origen_app_generators/lib/origen_app_generators/plugin.rb +4 -7
  77. data/origen_app_generators/lib/origen_app_generators/test_engineering/common.rb +29 -0
  78. data/origen_app_generators/lib/origen_app_generators/test_engineering/stand_alone_application.rb +9 -181
  79. data/origen_app_generators/lib/origen_app_generators/test_engineering/test_block.rb +4 -105
  80. data/origen_app_generators/lib/origen_app_generators.rb +6 -4
  81. data/origen_app_generators/origen_app_generators.gemspec +7 -7
  82. data/origen_app_generators/templates/app_generators/application/Gemfile +14 -3
  83. data/origen_app_generators/templates/app_generators/application/{lib → app/blocks}/top_level.rb +1 -1
  84. data/origen_app_generators/templates/app_generators/application/app/lib/module.rb +6 -0
  85. data/origen_app_generators/templates/app_generators/application/{templates → app/templates}/web/index.md.erb +0 -0
  86. data/origen_app_generators/templates/app_generators/application/{templates → app/templates}/web/layouts/_basic.html.erb +0 -0
  87. data/origen_app_generators/templates/app_generators/application/{templates → app/templates}/web/partials/_navbar.html.erb +0 -0
  88. data/origen_app_generators/templates/app_generators/application/{templates → app/templates}/web/release_notes.md.erb +0 -0
  89. data/origen_app_generators/templates/app_generators/application/config/application.rb +51 -55
  90. data/origen_app_generators/templates/app_generators/application/{spec → test/spec}/spec_helper.rb +0 -0
  91. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/{lib → app/lib}/application.rb +0 -0
  92. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/{lib → app/lib}/base.rb +0 -0
  93. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/{lib → app/lib}/module.rb +0 -0
  94. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/{lib → app/lib}/plugin.rb +0 -0
  95. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/config/load_generators.rb +1 -1
  96. data/origen_app_generators/templates/app_generators/plugin/Gemfile +5 -2
  97. data/origen_app_generators/templates/app_generators/plugin/{templates → app/templates}/web/index.md.erb +0 -0
  98. data/origen_app_generators/templates/app_generators/plugin/{templates → app/templates}/web/partials/_navbar_external.html.erb +0 -0
  99. data/origen_app_generators/templates/app_generators/plugin/{templates → app/templates}/web/partials/_navbar_internal.html.erb +0 -0
  100. data/origen_app_generators/templates/app_generators/plugin/gemspec.rb +4 -3
  101. data/origen_app_generators/templates/app_generators/test_engineering/{stand_alone_application/environment → environment}/j750.rb +0 -0
  102. data/origen_app_generators/templates/app_generators/test_engineering/{stand_alone_application/environment → environment}/uflex.rb +0 -0
  103. data/origen_app_generators/templates/app_generators/test_engineering/{stand_alone_application/environment → environment}/v93k.rb +0 -0
  104. data/origen_site_config.yml +0 -7
  105. data/templates/code_generators/attributes.rb +20 -0
  106. data/templates/code_generators/class.rb +9 -0
  107. data/templates/code_generators/controller.rb +87 -0
  108. data/templates/code_generators/model.rb +21 -0
  109. data/templates/code_generators/module.rb +4 -0
  110. data/templates/code_generators/parameters.rb +19 -0
  111. data/templates/code_generators/pins.rb +28 -0
  112. data/templates/code_generators/registers.rb +20 -0
  113. data/templates/code_generators/sub_blocks.rb +24 -0
  114. data/templates/code_generators/timesets.rb +24 -0
  115. data/templates/code_generators/version.rb +0 -1
  116. metadata +66 -77
  117. data/lib/c99/ate_interface.rb +0 -77
  118. data/lib/c99/nvm.rb +0 -110
  119. data/lib/c99/target/mock2.rb +0 -1
  120. data/lib/c99/target/subdir/mock3.rb +0 -1
  121. data/lib/origen/code_generators/bundler.rb +0 -17
  122. data/lib/origen/code_generators/gem_setup.rb +0 -49
  123. data/lib/origen/code_generators/rake.rb +0 -13
  124. data/lib/origen/code_generators/rspec.rb +0 -12
  125. data/lib/origen/commands/add.rb +0 -12
  126. data/lib/tasks/private/build.rake +0 -8
  127. data/origen_app_generators/bin/fix_my_workspace +0 -100
  128. data/origen_app_generators/lib/origen_app_generators/sub_block_parser.rb +0 -81
  129. data/origen_app_generators/lib/tasks/app_generators.rake +0 -6
  130. data/origen_app_generators/spec/sub_block_spec.rb +0 -36
  131. data/origen_app_generators/templates/app_generators/application/lib/app.rake +0 -6
  132. data/origen_app_generators/templates/app_generators/application/lib/module.rb +0 -22
  133. data/origen_app_generators/templates/app_generators/plugin/lib/README +0 -4
  134. data/origen_app_generators/templates/app_generators/plugin/lib_dev/README +0 -5
  135. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/Gemfile +0 -23
  136. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/environment/jlink.rb +0 -1
  137. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/ip_block.rb +0 -23
  138. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/ip_block_controller.rb +0 -5
  139. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/top_level.rb +0 -33
  140. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/top_level_controller.rb +0 -21
  141. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/pattern/example.rb +0 -4
  142. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/target/top_level.rb +0 -4
  143. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/j750.rb +0 -2
  144. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/ultraflex.rb +0 -2
  145. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/v93k.rb +0 -2
  146. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/controller.rb +0 -12
  147. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/interface.rb +0 -21
  148. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/model.rb +0 -18
  149. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib_dev/dut.rb +0 -27
  150. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib_dev/dut_controller.rb +0 -26
  151. data/origen_app_generators/templates/app_generators/test_engineering/test_block/pattern/example.rb +0 -5
  152. data/origen_app_generators/templates/app_generators/test_engineering/test_block/program/prb1.rb +0 -11
  153. data/origen_app_generators/templates/app_generators/test_engineering/test_block/target/default.rb +0 -2
  154. data/templates/code_generators/gemfile_app.rb +0 -4
  155. data/templates/code_generators/gemfile_plugin.rb +0 -6
  156. data/templates/code_generators/gemspec.rb +0 -33
  157. data/templates/code_generators/rakefile.rb +0 -10
  158. data/templates/code_generators/spec_helper.rb +0 -49
@@ -0,0 +1,62 @@
1
+ module Origen
2
+ module CodeGenerators
3
+ class Dut < Origen::CodeGenerators::Base
4
+ include BlockCommon
5
+
6
+ def self.banner
7
+ 'origen new dut NAME'
8
+ end
9
+
10
+ desc <<-END
11
+ This generator creates a top-level (DUT) block and all of the associated resources for it, e.g. a model,
12
+ controller, target, timesets, pins, etc.
13
+
14
+ The NAME of the DUT should be given in lower case, optionally prefixed by parent DUT name(s) separated
15
+ by a forward slash.
16
+
17
+ Any parent DUT(s) will be created if they don't exist, but they will not be modified if they do.
18
+
19
+ Examples:
20
+ origen new dut falcon # Creates app/blocks/dut/derivatives/falcon/...
21
+ origen new dut dsp/falcon # Creates app/blocks/dut/derivatives/dsp/derivatives/falcon/...
22
+ END
23
+
24
+ def validate_args
25
+ if args.size > 1 || args.size == 0
26
+ msg = args.size > 1 ? 'Only one' : 'One'
27
+ msg << " argument is expected by the DUT generator, e.g. 'origen new dut my_soc', 'origen new dut my_family/my_soc"
28
+ puts msg
29
+ exit 1
30
+ end
31
+ validate_args_common
32
+ end
33
+
34
+ def setup
35
+ @generate_model = true
36
+ @generate_pins = true
37
+ @generate_timesets = true
38
+ @generate_parameters = true
39
+ @top_level = true
40
+ extract_model_name
41
+ create_files
42
+ end
43
+
44
+ def create_target
45
+ contents = ''
46
+ contents << @final_namespaces.map { |n| camelcase(n) }.join('::')
47
+ contents << "::#{camelcase(@name)}.new\n"
48
+
49
+ create_file "#{Origen.root}/target/#{@name}.rb", contents
50
+ end
51
+
52
+ def completed
53
+ add_acronyms
54
+ puts
55
+ puts 'New DUT created, run the following command to target it in your workspace:'.green
56
+ puts
57
+ puts " origen t #{@name}"
58
+ puts
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,50 @@
1
+ module Origen
2
+ module CodeGenerators
3
+ class Feature < Origen::CodeGenerators::Base
4
+ include BlockCommon
5
+
6
+ def self.banner
7
+ 'origen new feature NAME'
8
+ end
9
+
10
+ desc <<-END
11
+ This generator creates a new feature block, which is similar to a regular block but with no model and controller.
12
+ Such features can then be loaded (re-used) by multiple blocks within your application code.
13
+
14
+ The name of the feature should be given in lower case, optionally prefixed by parent feature name(s) separated
15
+ by a forward slash.
16
+
17
+ Any parent features will be created if they don't exist, but they will not be modified if they do.
18
+
19
+ Examples:
20
+ origen new feature my_feature # Creates app/blocks/my_feature/...
21
+ origen new feature features/my_feature # Creates app/blocks/features/my_feature/...
22
+
23
+ The above can then be loaded to models in your application code via:
24
+
25
+ my_model.load_block('my_feature')
26
+ my_model.load_block('features/my_feature')
27
+ END
28
+
29
+ def validate_args
30
+ if args.size > 1 || args.size == 0
31
+ msg = args.size > 1 ? 'Only one' : 'One'
32
+ msg << " argument is expected by the feature generator, e.g. 'origen new feature my_feature', 'origen new feature features/my_feature"
33
+ puts msg
34
+ exit 1
35
+ end
36
+ validate_args_common
37
+ end
38
+
39
+ def setup
40
+ @generate_model = false
41
+ @generate_pins = true
42
+ @generate_timesets = true
43
+ @generate_parameters = true
44
+ extract_model_name
45
+ create_files
46
+ add_acronyms
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,41 @@
1
+ module Origen
2
+ module CodeGenerators
3
+ class Klass < Origen::CodeGenerators::Base
4
+ def self.banner
5
+ 'origen new class NAME'
6
+ end
7
+
8
+ desc <<-END
9
+ This generator creates a plain old Ruby class within your application's lib directory.
10
+
11
+ The NAME of the class should be given, in lower case, optionally indicating the presence
12
+ of any namespacing you want it to be created under.
13
+
14
+ Examples:
15
+ origen new class counter # Creates app/lib/my_application/counter.rb
16
+ origen new class helpers/counter # Creates app/lib/my_application/helpers/counter.rb
17
+ END
18
+
19
+ def validate_args
20
+ if args.size > 1 || args.size == 0
21
+ msg = args.size > 1 ? 'Only one' : 'One'
22
+ msg << " argument is expected by the class generator, e.g. 'origen new class counter', 'origen new class helpers/counter'"
23
+ puts msg
24
+ exit 1
25
+ end
26
+ validate_resource_name(args.first)
27
+ end
28
+
29
+ def create_class_file
30
+ @resource_path = args.first
31
+ klass = resource_path_to_class(args.first)
32
+ @namespaces = klass.split('::').map(&:underscore)
33
+ @name = @namespaces.pop
34
+ @namespaces = add_type_to_namespaces(@namespaces)
35
+ @root_class = true
36
+ file = class_name_to_lib_file(klass)
37
+ template 'templates/code_generators/class.rb', file
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,60 @@
1
+ module Origen
2
+ module CodeGenerators
3
+ class Model < Origen::CodeGenerators::Base
4
+ def self.banner
5
+ 'origen new model NAME'
6
+ end
7
+
8
+ desc <<-END
9
+ This generator creates a model and optionally a controller for it within your application's
10
+ app/lib directory.
11
+
12
+ The NAME of the model should be given, in lower case, optionally indicating the presence
13
+ of any namespacing you want it to be created under.
14
+
15
+ If the model is intended to represent a top-level DUT or a primary sub-block/IP (e.g. RAM,
16
+ ATD, PLL, Flash, etc) then use `origen new dut` or `origen new block` instead.
17
+
18
+ If the model is intended to represent a sub-component of an existing block then the
19
+ block generator should be used to create a nested sub-block - see the comments within
20
+ sub_blocks.rb of one of the existing block models for an example.
21
+
22
+ Otherwise, models in the app/lib directory as produced by this generator are good for when
23
+ the model is representing some abstract concept which may not map directly to hardware, or
24
+ hen you need to model a minor sub-component which needs to be shared by multuple higher level
25
+ blocks.
26
+
27
+ Examples:
28
+ origen new model sequencer # Creates app/lib/my_application/sequencer.rb
29
+ origen new model bist/sequencer # Creates app/lib/my_application/bist/sequencer.rb
30
+ END
31
+
32
+ def validate_args
33
+ if args.size > 1 || args.size == 0
34
+ msg = args.size > 1 ? 'Only one' : 'One'
35
+ msg << " argument is expected by the model generator, e.g. 'origen new model sequencer', 'origen new model bist/sequencer'"
36
+ puts msg
37
+ exit 1
38
+ end
39
+
40
+ validate_resource_name(args.first)
41
+ end
42
+
43
+ def create_model_file
44
+ @resource_path = args.first
45
+ klass = resource_path_to_class(args.first)
46
+ @namespaces = klass.split('::').map(&:underscore)
47
+ @name = @namespaces.pop
48
+ @namespaces = add_type_to_namespaces(@namespaces)
49
+ @root_class = true
50
+ file = class_name_to_lib_file(klass)
51
+ template 'templates/code_generators/model.rb', file
52
+ if yes? 'Does this model need a controller? (n):'
53
+ file = file.to_s.sub(/\.rb/, '_controller.rb')
54
+ template 'templates/code_generators/controller.rb', file
55
+ end
56
+ add_acronyms
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,92 @@
1
+ module Origen
2
+ module CodeGenerators
3
+ class Mod < Origen::CodeGenerators::Base
4
+ def self.banner
5
+ 'origen new module NAME [CLASS]'
6
+ end
7
+
8
+ desc <<-END
9
+ This generator creates a plain old Ruby module within your application's lib directory,
10
+ or if a CLASS argument is given, it will create it a child of that class in either the
11
+ lib or blocks directory as appropriate.
12
+
13
+ Where a CLASS argument is given, the new module will be automatically included in the
14
+ class.
15
+
16
+ The NAME of the module should be given, in lower case, optionally indicating the presence
17
+ of any namespacing you want it to be created under.
18
+
19
+ The CLASS argument should be a path to the Ruby file that defines the class.
20
+
21
+ Examples:
22
+ origen new module helpers # Creates app/lib/my_application/helpers.rb
23
+ origen new module helpers/math # Creates app/lib/my_application/helpers/math.rb
24
+
25
+ # Creates app/lib/blocks/dut/derivatives/falcon/model/helpers.rb
26
+ origen new module blocks/dut/derivatives/falcon/model.rb helpers
27
+ END
28
+
29
+ def validate_args
30
+ if args.size > 2 || args.size == 0
31
+ msg = args.size == 0 ? 'At least one argument is' : 'No more than two arguments are'
32
+ msg << " expected by the module generator, e.g. 'origen new module helpers', 'origen new module helpers app/lib/my_app/my_class.rb'"
33
+ puts msg
34
+ exit 1
35
+ end
36
+
37
+ if args.size == 2
38
+ @class_file = args.first
39
+ unless File.exist?(@class_file)
40
+ puts "This class file does not exist: #{@class_file}"
41
+ exit 1
42
+ end
43
+ end
44
+
45
+ @resource_path = validate_resource_path(args.last)
46
+ end
47
+
48
+ def create_module_file
49
+ if @class_file
50
+ @namespaces = resource_path_to_class(@class_file).split('::').map(&:underscore)
51
+ paths = resource_path_to_class(@resource_path).split('::').map(&:underscore)
52
+ @name = paths.pop
53
+ paths.shift # Lose the app namespace
54
+ @namespaces += paths
55
+ file = File.join(@class_file.sub('.rb', ''), "#{@name}.rb")
56
+ @module_name = (@namespaces + [@name]).map { |n| camelcase(n) }.join('::')
57
+ else
58
+ @module_name = resource_path_to_class(@resource_path)
59
+ @namespaces = @module_name.split('::').map(&:underscore)
60
+ @name = @namespaces.pop
61
+ file = class_name_to_lib_file(@module_name)
62
+ end
63
+ @namespaces = add_type_to_namespaces(@namespaces)
64
+ template 'templates/code_generators/module.rb', file
65
+ end
66
+
67
+ def include_module
68
+ if @class_file
69
+ klass = resource_path_to_class(@class_file)
70
+
71
+ # Does file have a nested namespace structure
72
+ snippet = File.foreach(@class_file).first(50)
73
+ if snippet.any? { |line| line =~ /\s*class #{klass.split('::').last}/ }
74
+ indent = ' ' * klass.split('::').size
75
+ lines = []
76
+ lines << indent + "include #{@module_name}"
77
+ lines << ''
78
+ inject_into_class @class_file, klass.split('::').last, lines.join("\n") + "\n"
79
+
80
+ # Else assume it is the compact style (class MyApp::DUT::Falcon)
81
+ else
82
+ lines = []
83
+ lines << " include #{@module_name}"
84
+ lines << ''
85
+ inject_into_class @class_file, klass, lines.join("\n") + "\n"
86
+ end
87
+ end
88
+ add_acronyms
89
+ end
90
+ end
91
+ end
92
+ end
@@ -29,13 +29,25 @@ module Origen
29
29
  def self.load_generators
30
30
  return if @generators_loaded
31
31
  # Load Origen's generators
32
- Dir.glob("#{Origen.top}/lib/origen/code_generators/**/*.rb").sort.each do |file|
33
- require file
34
- end
35
- # Load generators from plugins, TBD what the rules will be here
32
+ require_relative 'code_generators/block_common'
33
+ require_relative 'code_generators/dut'
34
+ require_relative 'code_generators/block'
35
+ require_relative 'code_generators/feature'
36
+ require_relative 'code_generators/model'
37
+ require_relative 'code_generators/klass'
38
+ require_relative 'code_generators/module'
39
+ # Load generators from plugins, TBD what the API will be here
36
40
  @generators_loaded = true
37
41
  end
38
42
 
43
+ # Loaded separately so as not to pollute the generated list of generators available to users
44
+ def self.load_internal_generators
45
+ return if @internal_generators_loaded
46
+ require_relative 'code_generators/semver'
47
+ require_relative 'code_generators/timever'
48
+ @internal_generators_loaded = true
49
+ end
50
+
39
51
  # Receives a namespace, arguments and the behavior to invoke the generator.
40
52
  # It's used as the default entry point for generate, destroy and update
41
53
  # commands.
@@ -47,6 +59,13 @@ module Origen
47
59
  end
48
60
  end
49
61
 
62
+ # Like invoke, but will also make internal-use only generators available
63
+ # commands.
64
+ def self.invoke_internal(name, args = ARGV, config = {})
65
+ load_internal_generators
66
+ invoke(name, args, config)
67
+ end
68
+
50
69
  def self.find_by_name(name)
51
70
  names = name.split(':')
52
71
  case names.size
@@ -61,20 +80,20 @@ module Origen
61
80
  end
62
81
  return gen if gen
63
82
  end
64
- puts "Couldn't find a feature generator named: #{name}"
83
+ puts "Couldn't find a code generator named: #{name}"
65
84
  puts
66
- puts 'This is the list of available features:'
85
+ puts 'This is the list of available generators:'
67
86
  puts
68
87
  print_generators
69
88
  puts
70
89
  end
71
90
 
72
91
  # Show help message with available generators.
73
- def self.help(command = 'add')
92
+ def self.help(command = 'new')
74
93
  puts <<-END
75
- Add pre-built features and code snippets.
94
+ Add pre-built features and code snippets to your application.
76
95
 
77
- This command will add pre-built code to your application to implement a given feature. In some
96
+ This command will generate code for your application to implement a given feature. In some
78
97
  cases this will be a complete feature and in others it will provide a starting point for you
79
98
  to further customize.
80
99
 
@@ -88,7 +107,7 @@ END
88
107
  puts ' -s, [--skip] # Skip files that already exist'
89
108
  puts ' -q, [--quiet] # Suppress status output'
90
109
  puts
91
- puts "The available features are listed below, run 'origen add <feature> -h' for more info."
110
+ puts "The available features are listed below, run 'origen new <feature> -h' for more info."
92
111
  puts
93
112
 
94
113
  print_generators
@@ -101,6 +120,7 @@ END
101
120
  puts name
102
121
  end
103
122
  plugin_generators.each do |namespace, generators|
123
+ next if namespace.to_s == 'origen_app_generators'
104
124
  puts
105
125
  generators.each do |_name, gen|
106
126
  puts "#{namespace}:#{gen}"
@@ -32,7 +32,12 @@ if ARGV.empty?
32
32
  if Origen.config.lint_test[:files]
33
33
  files = Origen.config.lint_test[:files].map { |f| "#{Origen.root}/#{f}" }.join(' ')
34
34
  else
35
- files = "#{Origen.root}/lib"
35
+ files = []
36
+ ['lib', 'app/lib', 'app/blocks'].each do |sub_dir|
37
+ dir = "#{Origen.root}/#{sub_dir}"
38
+ files << dir if File.exist?(dir)
39
+ end
40
+ files = files.join(' ')
36
41
  end
37
42
  else
38
43
  files = ARGV.join(' ')
@@ -62,7 +62,7 @@ else
62
62
  end
63
63
  end
64
64
 
65
- generators = [['https://rubygems.org', 'origen_app_generators']] + Array(Origen.site_config.app_generators)
65
+ generators = [['https://rubygems.org', 'origen_app_generators_v2']] + Array(Origen.site_config.app_generators)
66
66
 
67
67
  def use_packaged_generators
68
68
  FileUtils.cp_r Origen.top.join('origen_app_generators').to_s, '.'
@@ -0,0 +1,41 @@
1
+ # require 'optparse'
2
+ # require 'origen/commands/helpers'
3
+ #
4
+ # options = {}
5
+ #
6
+ ## App options are options that the application can supply to extend this command
7
+ # app_options = @application_options || []
8
+ # opt_parser = OptionParser.new do |opts|
9
+ # opts.banner = 'Usage: origen new RESOURCE_TYPE RESOURCE_NAME [options]'
10
+ # opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
11
+ # # Apply any application option extensions to the OptionParser
12
+ # Origen::CommandHelpers.extend_options(opts, app_options, options)
13
+ # opts.separator ''
14
+ # opts.on('-h', '--help', 'Show this message') { puts opts; exit }
15
+ # end
16
+ #
17
+ # opt_parser.parse! ARGV
18
+ #
19
+ # command = ARGV.shift
20
+ #
21
+ # case command
22
+ # when "model"
23
+ #
24
+ #
25
+ # else
26
+ # puts "Unknown resource type, must be one of: model"
27
+ # exit 1
28
+ # end
29
+
30
+ require 'origen/code_generators'
31
+
32
+ # if no argument/-h/--help is passed to origen add command, then
33
+ # it generates the help associated.
34
+ if [nil, '-h', '--help'].include?(ARGV.first)
35
+ Origen::CodeGenerators.help 'new'
36
+ exit
37
+ end
38
+
39
+ name = ARGV.shift
40
+
41
+ Origen::CodeGenerators.invoke name, ARGV # , behavior: :invoke, destination_root: Origen.root
@@ -19,7 +19,7 @@ The following commands are available:
19
19
  serve Start a webserver from the current directory
20
20
 
21
21
  compile [FILE] Compile all web templates and start a server to view them, optionally supply a
22
- file argument to only update a single page e.g. 'origen web compile templates/web/index.md.erb'
22
+ file argument to only update a single page e.g. 'origen web compile app/templates/web/index.md.erb'
23
23
  Use the --remote option to copy the compiled files to a remote web server directory (the
24
24
  location of which should be specified via Origen.config.web_directory). In this case when no
25
25
  FILE argument is specified the entire site will be copied over to a fresh web server
@@ -104,7 +104,7 @@ The following options are available:
104
104
  puts "Web server directory created at: #{dir}"
105
105
  puts ''
106
106
  puts "Compile any files you want to test into the #{dir}/content directory, e.g.:"
107
- puts " origen c templates/file.md.erb -o #{dir}/content"
107
+ puts " origen c app/templates/file.md.erb -o #{dir}/content"
108
108
  puts ''
109
109
  puts 'To turn them into web pages:'
110
110
  puts " cd #{dir}"
@@ -149,9 +149,12 @@ The following options are available:
149
149
  Origen.app.listeners_for(:before_web_compile).each do |listener|
150
150
  listener.before_web_compile(options)
151
151
  end
152
- Origen.app.runner.launch action: :compile,
153
- files: 'templates/web',
154
- output: 'web/content'
152
+ templates_web_dir = 'app/templates/web'
153
+ templates_web_dir = 'templates/web' unless File.exist?("#{Origen.root}/#{templates_web_dir}")
154
+ templates_web_dir =
155
+ Origen.app.runner.launch action: :compile,
156
+ files: templates_web_dir,
157
+ output: 'web/content'
155
158
  Origen.app.listeners_for(:after_web_compile).each do |listener|
156
159
  listener.after_web_compile(options)
157
160
  end
@@ -168,7 +171,9 @@ The following options are available:
168
171
  ARGV.each do |file|
169
172
  path = Origen.file_handler.clean_path_to(file)
170
173
  if path.to_s =~ /origen_guides/
171
- output = Origen.file_handler.sub_dir_of(path, "#{Origen.root}/templates/origen_guides")
174
+ origen_guides_dir = 'app/templates/origen_guides'
175
+ origen_guides_dir = 'templates/origen_guides' unless File.exist?("#{Origen.root}/#{origen_guides_dir}")
176
+ output = Origen.file_handler.sub_dir_of(path, "#{Origen.root}/#{origen_guides_dir}")
172
177
  else
173
178
  output = Origen.file_handler.sub_dir_of(path, "#{Origen.root}/templates/web")
174
179
  end
@@ -2,6 +2,7 @@
2
2
  # is done here (i.e. options that apply to all commands) before handing
3
3
  # over to the specific command handlers
4
4
  require 'optparse'
5
+ require 'fileutils'
5
6
 
6
7
  ARGV << '--help' if ARGV.empty?
7
8
 
@@ -29,6 +30,18 @@ ORIGEN_COMMAND_ALIASES = {
29
30
  # Moved here so boot.rb file can know the current command
30
31
  Origen.send :current_command=, @command
31
32
 
33
+ # Do some housekeeping, remove all .git directories in vendor/gems, this allows gems
34
+ # that have been vendored via a Git reference to be checked in as normal
35
+ if File.exist?(Origen.root.join('vendor', 'gems'))
36
+ Dir.glob("#{Origen.root}/vendor/gems/ruby/*/bundler/gems/*/.git").each do |f|
37
+ FileUtils.rm_rf(f)
38
+ end
39
+ # Also remove any nested vendor/gems folders to save space
40
+ Dir.glob("#{Origen.root}/vendor/gems/ruby/*/bundler/gems/*/vendor/gems").each do |f|
41
+ FileUtils.rm_rf(f)
42
+ end
43
+ end
44
+
32
45
  # Don't log to file during the save command since we need to preserve the last log,
33
46
  # this is done as early in the process as possible so any deprecation warnings during
34
47
  # load don't trigger a new log
@@ -227,6 +240,10 @@ when 'generate', 'program', 'compile', 'merge', 'interactive', 'target', 'enviro
227
240
  require "origen/commands/#{@command}"
228
241
  exit 0 unless @command == 'interactive'
229
242
 
243
+ when 'new'
244
+ require 'origen/commands/new_resource'
245
+ exit 0
246
+
230
247
  when 'exec'
231
248
  load ARGV.first
232
249
  exit 0
@@ -272,6 +289,7 @@ The core origen commands are:
272
289
  lint Lint and style check (and correct) your application code
273
290
  archive Create an archive of your current application state
274
291
  site Monitor and manage the Origen site configuration
292
+ new Generate a new block, flow, pattern, etc. for your application
275
293
  EOT
276
294
  cmds.split(/\n/).each do |line|
277
295
  puts Origen.clean_help_line(line)
File without changes
@@ -100,7 +100,7 @@ module Origen
100
100
  def clean_path_to(file, options = {})
101
101
  # Allow individual calls to this method to specify additional custom load paths to consider
102
102
  if options[:load_paths]
103
- [options[:load_paths]].each do |root|
103
+ Array(options[:load_paths]).each do |root|
104
104
  if File.exist?("#{root}/#{file}")
105
105
  return Pathname.new("#{root}/#{file}")
106
106
  end
@@ -222,7 +222,7 @@ module Origen
222
222
  begin
223
223
  # Allow relative references to templates/web when compiling a web template
224
224
  if Origen.lsf.current_command == 'web' || web_file
225
- clean_path_to(file, load_paths: "#{Origen.root}/templates/web")
225
+ clean_path_to(file, load_paths: ["#{Origen.root}/app/templates/web", "#{Origen.root}/templates/web"])
226
226
  else
227
227
  clean_path_to(file)
228
228
  end
@@ -230,7 +230,7 @@ module Origen
230
230
  # Try again without .erb
231
231
  file = file.gsub('.erb', '')
232
232
  if Origen.lsf.current_command == 'web' || web_file
233
- clean_path_to(file, load_paths: "#{Origen.root}/templates/web")
233
+ clean_path_to(file, load_paths: ["#{Origen.root}/app/templates/web", "#{Origen.root}/templates/web"])
234
234
  else
235
235
  clean_path_to(file)
236
236
  end
@@ -264,7 +264,11 @@ module Origen
264
264
  if import_name == :origen || import_name == :origen_core
265
265
  path.sub! 'origen', "#{Origen.top}/templates/shared"
266
266
  else
267
- path.sub! Regexp.last_match[1], "#{root}/templates/shared"
267
+ if File.exist?("#{root}/app/templates/shared")
268
+ path.sub! Regexp.last_match[1], "#{root}/app/templates/shared"
269
+ else
270
+ path.sub! Regexp.last_match[1], "#{root}/templates/shared"
271
+ end
268
272
  end
269
273
  else
270
274
  fail 'Unknown import path type!'
@@ -95,10 +95,10 @@ module Origen
95
95
  matches = Dir.glob("#{current_plugin_pattern_path}/**/#{name}.rb").sort
96
96
  # If the current plugin does not include the pattern then look into the current app
97
97
  if matches.size == 0
98
- matches = Dir.glob("#{pattern_directory}/**/#{name}.rb").sort # <= this does not include symlinks
98
+ matches = Dir.glob(["#{pattern_directory}/**/#{name}.rb", "#{Origen.root}/app/patterns/**/#{name}.rb"]).sort # <= this does not include symlinks
99
99
  end
100
100
  else
101
- matches = Dir.glob("#{pattern_directory}/**/#{name}.rb").sort # <= this does not include symlinks
101
+ matches = Dir.glob(["#{pattern_directory}/**/#{name}.rb", "#{Origen.root}/app/patterns/**/#{name}.rb"]).sort # <= this does not include symlinks
102
102
  end
103
103
 
104
104
  matches
@@ -114,7 +114,7 @@ module Origen
114
114
 
115
115
  def all_matches(name)
116
116
  name = name.gsub(/\..*$/, '')
117
- matches = Dir.glob("#{pattern_directory}/**{,/*/**}/#{name}.rb").sort # Takes symlinks into consideration
117
+ matches = Dir.glob(["#{pattern_directory}/**{,/*/**}/#{name}.rb", "#{Origen.root}/app/patterns/**{,/*/**}/#{name}.rb"]).sort # Takes symlinks into consideration
118
118
  matches.flatten.uniq
119
119
  end
120
120