origen_doc_helpers 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 494c09ae485338938797abd0324eb40bf5d668bb
4
- data.tar.gz: 46e71f84f0db94e14db584d114a140b7305e4d75
3
+ metadata.gz: f10206613a76375cd6ec5925e33ea6a4928585a5
4
+ data.tar.gz: 713eef54df6cbaa62ce7b30b9bf63aba164b29c6
5
5
  SHA512:
6
- metadata.gz: 374e1f62aa9eaeb2dc2bcf40f1670a12932ba395dc8ea1cdeb1624aaba00fee6badcc4a90ebf82e29ab387d6b64ac5b44b7c094d69da5bbda479a05d9c542fd8
7
- data.tar.gz: bb32e4b3ba62b228285a7968a598afd5695440887a699361e555c1f0c8b923c92f655629301cebbf06d6e9ca459ebe04c67ff07321a97ad12611282cc447963f
6
+ metadata.gz: e64c3ceefca6c63d72b561a20c5ca6bfd776e4ed62e1c0f2447757f31dd8f80d73b6505ae26703a49e3192f75451d2428297e8e7b7e69b2c53d369b5dbe7efe2
7
+ data.tar.gz: 13036d3ddafdbed4126f94f752e6e9f667a62d351b6e56523047fce98ce918f9779953343db3e9a5456fe59e324584708f22fac1d25fe108bac672fe91ae24b5
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby
2
+ $VERBOSE = nil # Don't care about world writable dir warnings and the like
3
+
4
+ if $_fix_my_workspace_version_check
5
+ $_fix_my_workspace_version = '0.7.0'
6
+ else
7
+ if File.exist?(File.expand_path('../../lib/origen.rb', __FILE__))
8
+ # If this script is being run from within an origen-core workspace, use that Origen-core,
9
+ # not the system-installed origen-core version.
10
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
11
+ require 'origen'
12
+ else
13
+ # Use system-installed Origen (the gem in system Ruby)
14
+ require 'origen'
15
+ end
16
+
17
+ if !Origen.site_config.gem_manage_bundler
18
+ puts 'Sorry but you have opted to manage Bundler yourself via your Origen site config, and this means'
19
+ puts 'that I cannot make certain assumptions about how your workspace is configured.'
20
+ puts 'You will need to either resolve this problem yourself, or else change the value of'
21
+ puts 'gem_mange_bundler to true.'
22
+ puts 'See here for more details on how to do that: http://origen-sdk.org/origen/guides/starting/company/'
23
+
24
+ else
25
+ ENV['BUNDLE_GEMFILE'] = File.join(Origen.root, 'Gemfile')
26
+ ENV['BUNDLE_PATH'] = File.expand_path(Origen.site_config.gem_install_dir)
27
+ ENV['BUNDLE_BIN'] = File.join(Origen.root, 'lbin')
28
+
29
+ # Force copy system gems to local gems
30
+ if Origen.site_config.gem_use_from_system
31
+ local_gem_dir = "#{ENV['BUNDLE_PATH']}/ruby/#{Pathname.new(Gem.dir).basename}"
32
+ gem_dir = Pathname.new(Gem.dir)
33
+
34
+ Origen.site_config.gem_use_from_system.each do |gem, version|
35
+ begin
36
+ # This will raise an error if the system doesn't have this gem installed, that
37
+ # will be rescued below
38
+ spec = Gem::Specification.find_by_name(gem, version)
39
+
40
+ local_dir = File.join(local_gem_dir, Pathname.new(spec.gem_dir).relative_path_from(gem_dir))
41
+ FileUtils.mkdir_p local_dir
42
+ FileUtils.cp_r("#{spec.gem_dir}/.", local_dir)
43
+
44
+ local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.cache_file).relative_path_from(gem_dir)))
45
+ FileUtils.mkdir_p local_file.dirname
46
+ FileUtils.cp(spec.cache_file, local_file)
47
+
48
+ if spec.extension_dir && File.exist?(spec.extension_dir)
49
+ local_dir = File.join(local_gem_dir, Pathname.new(spec.extension_dir).relative_path_from(gem_dir))
50
+ FileUtils.mkdir_p local_dir
51
+ FileUtils.cp_r("#{spec.extension_dir}/.", local_dir)
52
+ end
53
+
54
+ local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.spec_file).relative_path_from(gem_dir)))
55
+ FileUtils.mkdir_p local_file.dirname
56
+ FileUtils.cp(spec.spec_file, local_file)
57
+
58
+ rescue Gem::LoadError
59
+ # This just means that one of the gems that should be copied from the system
60
+ # was not actually installed in the system, so nothing we can do about that here
61
+ end
62
+ end
63
+ end
64
+
65
+ # Delete lbin
66
+ FileUtils.rm_rf(ENV['BUNDLE_BIN']) if File.exist?(ENV['BUNDLE_BIN'])
67
+
68
+ # Run bundler with correct switches
69
+ cmd = "bundle install --gemfile #{ENV['BUNDLE_GEMFILE']} --binstubs #{ENV['BUNDLE_BIN']} --path #{ENV['BUNDLE_PATH']}"
70
+ `chmod o-w #{Origen.root}` # Stops some annoying world writable warnings during install
71
+ `chmod o-w #{Origen.root}/bin` if File.exist?("#{Origen.root}/bin")
72
+ `chmod o-w #{Origen.root}/.bin` if File.exist?("#{Origen.root}/.bin")
73
+
74
+ # Try again, this time updating the bundle
75
+ if system(cmd)
76
+ fixed = true
77
+ elsif system 'bundle update'
78
+ fixed = true
79
+ end
80
+
81
+ if File.exist?(ENV['BUNDLE_BIN'])
82
+ `chmod o-w #{ENV['BUNDLE_BIN']}`
83
+
84
+ # Make .bat versions of all executables, Bundler should really be doing this when running
85
+ # on windows
86
+ if Origen.os.windows?
87
+ Dir.glob("#{ENV['BUNDLE_BIN']}/*").each do |bin|
88
+ unless bin =~ /.bat$/
89
+ bat = "#{bin}.bat"
90
+ unless File.exist?(bat)
91
+ File.open(bat, 'w') { |f| f.write('@"ruby.exe" "%~dpn0" %*') }
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ system 'origen -v' if fixed
99
+ end
100
+ end
data/config/commands.rb CHANGED
@@ -20,14 +20,14 @@ aliases ={
20
20
  # Now branch to the specific task code
21
21
  case @command
22
22
 
23
- # Here is an example of how to implement a command, the logic can go straight
24
- # in here or you can require an external file if preferred.
25
- when "execute"
26
- puts "Executing something..."
27
- require "commands/execute" # Would load file lib/commands/execute.rb
28
- # You must always exit upon successfully capturing a command to prevent
29
- # control flowing back to Origen
30
- exit 0
23
+ ## Example of how to make a command to run unit tests, this simply invokes RSpec on
24
+ ## the spec directory
25
+ when "specs"
26
+ ARGV.unshift "spec"
27
+ require "rspec"
28
+ require "rspec/autorun"
29
+ exit 0 # This will never be hit on a fail, RSpec will automatically exit 1
30
+
31
31
 
32
32
  # Always leave an else clause to allow control to fall back through to the
33
33
  # Origen command handler.
@@ -35,8 +35,8 @@ when "execute"
35
35
  # origen -h, you can do this be assigning the required text to @application_commands
36
36
  # before handing control back to Origen. Un-comment the example below to get started.
37
37
  else
38
- # @application_commands = <<-EOT
39
- # execute Execute something I guess
40
- # EOT
38
+ @application_commands = <<-EOT
39
+ specs Run the specs (tests), -c will enable coverage
40
+ EOT
41
41
 
42
42
  end
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenDocHelpers
2
2
  MAJOR = 0
3
- MINOR = 6
4
- BUGFIX = 2
3
+ MINOR = 7
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -7,6 +7,7 @@ module OrigenDocHelpers
7
7
  autoload :ListFlowFormatter, 'origen_doc_helpers/list_flow_formatter'
8
8
  autoload :FlowPageGenerator, 'origen_doc_helpers/flow_page_generator'
9
9
  autoload :ModelPageGenerator, 'origen_doc_helpers/model_page_generator'
10
+ autoload :GuideIndex, 'origen_doc_helpers/guide_index'
10
11
  end
11
12
 
12
13
  require 'origen_doc_helpers/helpers'
@@ -0,0 +1,162 @@
1
+ module OrigenDocHelpers
2
+ # Provides an API to programatically construct an index hash as used
3
+ # by the Searchable Documents helper -
4
+ # http://origen-sdk.org/doc_helpers/helpers/searchable/intro/#The_Document_Index
5
+ class GuideIndex
6
+ def initialize
7
+ @index = {}
8
+ @section_keys = {}
9
+ @pending_sections = []
10
+ @pending_pages = []
11
+ end
12
+
13
+ def section(id, options = {}, &block)
14
+ @current_section_id = id
15
+ if options[:heading]
16
+ # This is to handle the corner case where an id reference was originally supplied
17
+ # without the heading, then a later reference added the heading
18
+ if @section_keys[id]
19
+ if @section_keys[id] != options[:heading]
20
+ change_key(:@index, @section_keys[id], options[:heading])
21
+ @section_keys[id] = options[:heading]
22
+ end
23
+ else
24
+ @section_keys[id] = options[:heading]
25
+ end
26
+ else
27
+ @section_keys[id] ||= id
28
+ end
29
+ @section_keys[id] ||= @section_keys[id].to_s if @section_keys[id]
30
+ section_pending = false
31
+ unless @index[section_key]
32
+ if options[:after]
33
+ if has_key?(:@index, section_key(options[:after]))
34
+ insert_after(:@index, section_key, section_key(options[:after]), {})
35
+ else
36
+ @pending_sections << [id, options.dup, block] unless @no_pending
37
+ section_pending = true
38
+ end
39
+ elsif options[:before]
40
+ if has_key?(:@index, section_key(options[:before]))
41
+ insert_before(:@index, section_key, section_key(options[:before]), {})
42
+ else
43
+ @pending_sections << [id, options.dup, block] unless @no_pending
44
+ section_pending = true
45
+ end
46
+ else
47
+ @index[section_key] = {}
48
+ end
49
+ end
50
+ @current_section = @index[section_key]
51
+ yield self unless section_pending
52
+ @current_section = nil
53
+
54
+ # See if any pending sections can now be inserted
55
+ unless @no_pending
56
+ @pending_sections.each do |id, opts, blk|
57
+ @no_pending = true
58
+ section(id, opts, &blk)
59
+ @no_pending = false
60
+ end
61
+ end
62
+ self
63
+ end
64
+
65
+ def page(id, options = {})
66
+ unless @current_section
67
+ fail 'page can only be called from within a section block!'
68
+ end
69
+ @current_topic_id = id
70
+ value = options[:heading] || id
71
+ value = value.to_s if value
72
+ page_pending = false
73
+ if options[:after]
74
+ if has_key?(:@current_section, topic_key(options[:after]))
75
+ insert_after(:@current_section, topic_key, topic_key(options[:after]), value)
76
+ else
77
+ @pending_pages << [id, options.dup] unless @no_page_pending
78
+ page_pending = true
79
+ end
80
+ elsif options[:before]
81
+ if has_key?(:@current_section, topic_key(options[:before]))
82
+ insert_before(:@current_section, topic_key, topic_key(options[:before]), value)
83
+ else
84
+ @pending_pages << [id, options.dup] unless @no_page_pending
85
+ page_pending = true
86
+ end
87
+ else
88
+ @current_section[topic_key] = value
89
+ end
90
+ # Update the parent reference, required if before or after was used to create a new
91
+ # @current_section hash
92
+ @index[section_key] = @current_section unless page_pending
93
+
94
+ # See if any pending pages can now be inserted
95
+ unless @no_page_pending
96
+ @pending_pages.each do |id, opts|
97
+ @no_page_pending = true
98
+ page(id, opts)
99
+ @no_page_pending = false
100
+ end
101
+ end
102
+
103
+ self
104
+ end
105
+
106
+ def to_h
107
+ @index
108
+ end
109
+
110
+ private
111
+
112
+ def section_key(id = nil)
113
+ @section_keys[id || @current_section_id]
114
+ end
115
+
116
+ def topic_key(id = nil)
117
+ if @current_section_id
118
+ "#{@current_section_id}_#{id || @current_topic_id}".to_sym
119
+ else
120
+ "#{id || @current_topic_id}".to_sym
121
+ end
122
+ end
123
+
124
+ def has_key?(var, id)
125
+ instance_variable_get(var).key?(id)
126
+ end
127
+
128
+ def change_key(var, existing, new)
129
+ h = {}
130
+ instance_variable_get(var).each do |key, val|
131
+ if key == existing
132
+ h[new] = val
133
+ else
134
+ h[key] = val
135
+ end
136
+ end
137
+ instance_variable_set(var, h)
138
+ end
139
+
140
+ def insert_after(var, id, after, value)
141
+ new = {}
142
+ instance_variable_get(var).each do |key, val|
143
+ new[key] = val
144
+ if key == after
145
+ new[id] = value
146
+ end
147
+ end
148
+ instance_variable_set(var, new)
149
+ end
150
+
151
+ def insert_before(var, id, before, value)
152
+ new = {}
153
+ instance_variable_get(var).each do |key, val|
154
+ if key == before
155
+ new[id] = value
156
+ end
157
+ new[key] = val
158
+ end
159
+ instance_variable_set(var, new)
160
+ end
161
+ end
162
+ end
@@ -273,6 +273,13 @@ END
273
273
  options[:tab]
274
274
  else
275
275
  rel = options[:top_level_file].relative_path_from(_doc_root_dir(options)).sub_ext('').sub_ext('').to_s
276
+ # If the file lives outside of the current app (e.g. it comes from a plugin), then the above approach
277
+ # doesn't work, so let's just take the last dirname and the filename
278
+ if rel =~ /\.\./
279
+ dir = options[:top_level_file].dirname.basename
280
+ file = options[:top_level_file].basename('.*').basename('.*') # twice to allow for my_file.md.erb
281
+ rel = "#{dir}_#{file}"
282
+ end
276
283
  rel.gsub(/(\/|\\)/, '_').downcase.to_sym
277
284
  end
278
285
  end
@@ -1,6 +1,7 @@
1
1
  % options[:root] ||= "docs"
2
2
  % options[:path_separator] ||= "_"
3
3
  % pdf_filename = ::OrigenDocHelpers::PDF.register(options)
4
+ % options[:index] = options[:index].to_h
4
5
 
5
6
  <div class="row">
6
7
  <div class="col-md-3 sidebar-nav-container">
@@ -43,6 +43,51 @@ index["Topic 1"] = {
43
43
  }
44
44
  ~~~
45
45
 
46
+ #### Guide Index API
47
+
48
+ An API is available to programatically define the document index, here is the first example above defined
49
+ via the API rather than creating the hash explicitly:
50
+
51
+ ~~~ruby
52
+ index = OrigenDocHelpers::GuideIndex.new
53
+ index.section nil do |section|
54
+ section.page :intro, heading: "Introduction"
55
+ section.page :page2, heading: "Page 2"
56
+ end
57
+ index.section :topic1, heading: "Topic 1" do |section|
58
+ section.page :item1, heading: "First Item"
59
+ section.page :item2, heading: "Second Item"
60
+ end
61
+ ~~~
62
+
63
+
64
+ On the face of it, this is just a slightly different way of writing the same thing and you may or may not prefer
65
+ using the API vs. defining the hash directly.
66
+
67
+ However, the advantage of the API is that it allows the index to be defined out of order, allowing the user
68
+ to insert entries at specific points in the index table. This can be useful to allow plugins to add pages to
69
+ a parent application's guide section.
70
+
71
+ This is achieved by adding `:before` and `:after` options, here for example to add a new section before "Topic 1":
72
+
73
+ ~~~ruby
74
+ index.section :topic0, heading: "Topic 0", before: :topic1 do |section|
75
+ section.page :my_topic
76
+ end
77
+ ~~~
78
+
79
+ or to add a new page within the "Topic 1" section:
80
+
81
+ ~~~ruby
82
+ index.section :topic1 do |section|
83
+ section.page :my_topic, heading: "My Heading", after: :item1
84
+ end
85
+ ~~~
86
+
87
+ Note that both the `.section` and `.page` methods support the use of `:before` or `:after`.
88
+
89
+ If neither option is given when referencing an existing `GuideIndex` instance then the new section/page
90
+ will simply be appended onto the end.
46
91
 
47
92
  ### The Layout Helper
48
93
 
@@ -6,17 +6,17 @@ analytics: UA-64455560-1
6
6
 
7
7
  %# Add/edit sections here, the code below will expand this with the correct markup,
8
8
  %# pass in the topic you want selected via the :tab option.
9
- % s = {}
10
- % s[nil] = {
11
- % :intro => "Introduction",
12
- % :page2 => "Page 2",
13
- % }
14
- % s["Topic 1"] = {
15
- % :topic1_item1 => "First Item",
16
- % :topic1_item2 => "Second Item",
17
- % }
9
+ % i = OrigenDocHelpers::GuideIndex.new
10
+ % i.section nil do |section|
11
+ % section.page :intro, heading: "Introduction"
12
+ % section.page :page2, heading: "Page 2"
13
+ % end
14
+ % i.section :topic1, heading: "Topic 1" do |section|
15
+ % section.page :item1, heading: "First Item"
16
+ % section.page :item2, heading: "Second Item"
17
+ % end
18
18
 
19
- % render "templates/shared/searchable.html", options.merge(:index => s, :root => "helpers/searchable") do
19
+ % render "templates/shared/searchable.html", options.merge(:index => i, :root => "helpers/searchable") do
20
20
 
21
21
  <%= yield %>
22
22
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_doc_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen McGinty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-18 00:00:00.000000000 Z
11
+ date: 2018-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.7.15
27
- - !ruby/object:Gem::Dependency
28
- name: origen_testers
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  description:
42
28
  email:
43
29
  - stephen.f.mcginty@gmail.com
@@ -45,6 +31,7 @@ executables: []
45
31
  extensions: []
46
32
  extra_rdoc_files: []
47
33
  files:
34
+ - bin/fix_my_workspace
48
35
  - config/application.rb
49
36
  - config/boot.rb
50
37
  - config/commands.rb
@@ -52,6 +39,7 @@ files:
52
39
  - config/version.rb
53
40
  - lib/origen_doc_helpers.rb
54
41
  - lib/origen_doc_helpers/flow_page_generator.rb
42
+ - lib/origen_doc_helpers/guide_index.rb
55
43
  - lib/origen_doc_helpers/helpers.rb
56
44
  - lib/origen_doc_helpers/html_flow_formatter.rb
57
45
  - lib/origen_doc_helpers/list_flow_formatter.rb
@@ -109,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
97
  version: 1.8.11
110
98
  requirements: []
111
99
  rubyforge_project:
112
- rubygems_version: 2.6.7
100
+ rubygems_version: 2.6.14.1
113
101
  signing_key:
114
102
  specification_version: 4
115
103
  summary: Snippets and helpers for creating Origen web documents