yard-lucid 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +87 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +13 -0
  11. data/bin/setup +8 -0
  12. data/lib/docserver/default/fulldoc/html/js/lucid.js +69 -0
  13. data/lib/docserver/default/layout/html/headers.erb +13 -0
  14. data/lib/docserver/doc_server/full_list/html/full_list.erb +37 -0
  15. data/lib/docserver/doc_server/full_list/html/setup.rb +19 -0
  16. data/lib/lucid/gherkin_repr.rb +307 -0
  17. data/lib/templates/default/feature/html/docstring.erb +3 -0
  18. data/lib/templates/default/feature/html/feature.erb +39 -0
  19. data/lib/templates/default/feature/html/no_steps_defined.erb +1 -0
  20. data/lib/templates/default/feature/html/outline.erb +52 -0
  21. data/lib/templates/default/feature/html/scenario.erb +52 -0
  22. data/lib/templates/default/feature/html/setup.rb +51 -0
  23. data/lib/templates/default/feature/html/steps.erb +37 -0
  24. data/lib/templates/default/feature/html/table.erb +19 -0
  25. data/lib/templates/default/featuredirectory/html/alpha_table.erb +30 -0
  26. data/lib/templates/default/featuredirectory/html/directory.erb +30 -0
  27. data/lib/templates/default/featuredirectory/html/setup.rb +41 -0
  28. data/lib/templates/default/featuretags/html/namespace.erb +127 -0
  29. data/lib/templates/default/featuretags/html/setup.rb +33 -0
  30. data/lib/templates/default/fulldoc/html/css/lucid.css +224 -0
  31. data/lib/templates/default/fulldoc/html/directories.erb +27 -0
  32. data/lib/templates/default/fulldoc/html/full_list_featuredirectories.erb +11 -0
  33. data/lib/templates/default/fulldoc/html/full_list_features.erb +36 -0
  34. data/lib/templates/default/fulldoc/html/full_list_stepdefinitions.erb +20 -0
  35. data/lib/templates/default/fulldoc/html/full_list_steps.erb +20 -0
  36. data/lib/templates/default/fulldoc/html/full_list_tags.erb +16 -0
  37. data/lib/templates/default/fulldoc/html/js/lucid.js +284 -0
  38. data/lib/templates/default/fulldoc/html/setup.rb +199 -0
  39. data/lib/templates/default/layout/html/setup.rb +111 -0
  40. data/lib/templates/default/specifications/html/alpha_table.erb +26 -0
  41. data/lib/templates/default/specifications/html/setup.rb +49 -0
  42. data/lib/templates/default/specifications/html/specifications.erb +46 -0
  43. data/lib/templates/default/steptransformers/html/header.erb +12 -0
  44. data/lib/templates/default/steptransformers/html/index.erb +9 -0
  45. data/lib/templates/default/steptransformers/html/setup.rb +92 -0
  46. data/lib/templates/default/steptransformers/html/transformers.erb +74 -0
  47. data/lib/templates/default/steptransformers/html/undefinedsteps.erb +26 -0
  48. data/lib/templates/default/tag/html/alpha_table.erb +32 -0
  49. data/lib/templates/default/tag/html/setup.rb +26 -0
  50. data/lib/templates/default/tag/html/tag.erb +31 -0
  51. data/lib/yard/code_objects/lucid/base.rb +23 -0
  52. data/lib/yard/code_objects/lucid/feature.rb +12 -0
  53. data/lib/yard/code_objects/lucid/namespace_object.rb +43 -0
  54. data/lib/yard/code_objects/lucid/scenario.rb +20 -0
  55. data/lib/yard/code_objects/lucid/scenario_outline.rb +66 -0
  56. data/lib/yard/code_objects/lucid/step.rb +32 -0
  57. data/lib/yard/code_objects/lucid/tag.rb +21 -0
  58. data/lib/yard/code_objects/step_definition.rb +3 -0
  59. data/lib/yard/code_objects/step_transform.rb +3 -0
  60. data/lib/yard/code_objects/step_transformer.rb +85 -0
  61. data/lib/yard/handlers/lucid/base.rb +19 -0
  62. data/lib/yard/handlers/lucid/feature_handler.rb +102 -0
  63. data/lib/yard/handlers/step_definition_handler.rb +67 -0
  64. data/lib/yard/handlers/step_transform_handler.rb +28 -0
  65. data/lib/yard/parser/lucid/feature.rb +58 -0
  66. data/lib/yard/server/adapter.rb +32 -0
  67. data/lib/yard/server/commands/list_command.rb +25 -0
  68. data/lib/yard/server/router.rb +23 -0
  69. data/lib/yard/templates/helpers/base_helper.rb +22 -0
  70. data/lib/yard-lucid/version.rb +3 -0
  71. data/lib/yard-lucid.rb +36 -0
  72. data/yard-lucid.gemspec +38 -0
  73. metadata +215 -0
@@ -0,0 +1,66 @@
1
+ module YARD::CodeObjects::Lucid
2
+ class ScenarioOutline < NamespaceObject
3
+ attr_accessor :value, :comments, :keyword, :description, :steps, :tags, :feature
4
+ attr_accessor :scenarios, :examples
5
+
6
+ def initialize(namespace,name)
7
+ super(namespace,name.to_s.strip)
8
+ @comments = @description = @value = @feature = nil
9
+ @steps = []
10
+ @tags = []
11
+ @scenarios = []
12
+ @examples = []
13
+ end
14
+
15
+ def background?
16
+ false
17
+ end
18
+
19
+ def outline?
20
+ true
21
+ end
22
+
23
+ def examples?
24
+ @examples.find { |example| example.rows }
25
+ end
26
+
27
+ class Examples
28
+ attr_accessor :name, :line, :keyword, :comments, :rows
29
+
30
+ # The first row of the rows contains the headers for the table
31
+ def headers
32
+ rows.first
33
+ end
34
+
35
+ # The data of the table starts at the second row. When there is no data then
36
+ # return a empty string.
37
+ def data
38
+ rows ? rows[1..-1] : ""
39
+ end
40
+
41
+ def values_for_row(row)
42
+ hash = {}
43
+
44
+ headers.each_with_index do |header,index|
45
+ hash[header] = data[row][index]
46
+ end
47
+
48
+ hash
49
+ end
50
+
51
+ def to_hash
52
+ hash = {}
53
+
54
+ rows.each_with_index do |header,index|
55
+ hash[header] = rows.collect { |row| row[index] }
56
+ end
57
+
58
+ hash
59
+ end
60
+
61
+ def initialize(parameters = {})
62
+ parameters.each { |key,value| send("#{key.to_sym}=",value) if respond_to? "#{key.to_sym}=" }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ module YARD::CodeObjects::Lucid
2
+ class Step < Base
3
+ attr_accessor :comments, :definition, :examples, :keyword, :scenario, :table, :text, :transforms, :value
4
+
5
+ def initialize(namespace,name)
6
+ super(namespace,name.to_s.strip)
7
+ @comments = @definition = @description = @keyword = @table = @text = @value = nil
8
+ @examples = {}
9
+ @transforms = []
10
+ end
11
+
12
+ def has_table?
13
+ !@table.nil?
14
+ end
15
+
16
+ def has_text?
17
+ !@text.nil?
18
+ end
19
+
20
+ def definition=(stepdef)
21
+ @definition = stepdef
22
+
23
+ unless stepdef.steps.map(&:files).include?(files)
24
+ stepdef.steps << self
25
+ end
26
+ end
27
+
28
+ def transformed?
29
+ !@transforms.empty?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ module YARD::CodeObjects::Lucid
2
+ class Tag < NamespaceObject
3
+ attr_accessor :value, :owners
4
+
5
+ def features
6
+ @owners.find_all { |owner| owner.is_a?(Feature) }
7
+ end
8
+
9
+ def scenarios
10
+ @owners.find_all { |owner| owner.is_a?(Scenario) || owner.is_a?(ScenarioOutline) }
11
+ end
12
+
13
+ def indirect_scenarios
14
+ @owners.find_all { |owner| owner.is_a?(Feature) }.collect { |feature| feature.scenarios }.flatten
15
+ end
16
+
17
+ def all_scenarios
18
+ scenarios + indirect_scenarios
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module YARD::CodeObjects
2
+ class StepDefinitionObject < StepTransformerObject ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module YARD::CodeObjects
2
+ class StepTransformObject < StepTransformerObject ; end
3
+ end
@@ -0,0 +1,85 @@
1
+ module YARD::CodeObjects
2
+ class StepTransformerObject < Base
3
+
4
+ include Lucid::LocationHelper
5
+
6
+ attr_reader :constants, :keyword, :source, :value, :literal_value
7
+ attr_accessor :steps, :pending, :substeps
8
+
9
+ # This defines an escape pattern within a string or regex:
10
+ # /^the first #{CONSTANT} step$/
11
+ #
12
+ # This is used below in the value to process it if there happen to be
13
+ # constants defined here. It's important to note that this will not
14
+ # handle the result of method calls and it will not handle multiple
15
+ # constants within the same escaped area.
16
+ def escape_pattern
17
+ /#\{\s*(\w+)\s*\}/
18
+ end
19
+
20
+ # The idea of this is method is that when requesting a step tranform object
21
+ # value, process it, if it hasn't alredy been processed, replacing any
22
+ # constants that may be escaped within the value.
23
+ #
24
+ # Processing here means looking for any escaped characters that happen to
25
+ # be CONSTANTS that could be matched and then replaced. This needs to be
26
+ # done recursively since CONSTANTS can be defined with more CONSTANTS.
27
+ def value
28
+ unless @processed
29
+ @processed = true
30
+ until (nested = constants_from_value).empty?
31
+ nested.each { |n| @value.gsub!(value_regex(n),find_value_for_constant(n)) }
32
+ end
33
+ end
34
+
35
+ @value
36
+ end
37
+
38
+ # Set the literal value and the value of the step definition.
39
+ #
40
+ # The literal value is as it appears in the step definition file with any
41
+ # constants. The value, when retrieved will attempt to replace those
42
+ # constants with their regex or string equivalents to hopefully match more
43
+ # steps and step definitions.
44
+ def value=(value)
45
+ @literal_value = format_source(value)
46
+ @value = format_source(value)
47
+
48
+ @steps = []
49
+ value
50
+ end
51
+
52
+ # Generate a regex with the step transform value.
53
+ def regex
54
+ @regex ||= /#{strip_regex_from(value)}/
55
+ end
56
+
57
+ # Look through the specified data for the escape pattern and return an
58
+ # array of those constants found. This defaults to the @value within the
59
+ # step transform as it is used internally, however, it can be called
60
+ # externally if it's needed somewhere.
61
+ def constants_from_value(data=@value)
62
+ data.scan(escape_pattern).flatten.collect { |value| value.strip }
63
+ end
64
+
65
+ protected
66
+
67
+ # This looks through all the constants in the registry and returns the value
68
+ # with the regex items replaced from the constnat if present.
69
+ def find_value_for_constant(name)
70
+ constant = YARD::Registry.all(:constant).find { |c| c.name == name.to_sym }
71
+ log.warn "StepTransformer#find_value_for_constant : Could not find the CONSTANT [#{name}] using the string value." unless constant
72
+ constant ? strip_regex_from(constant.value) : name
73
+ end
74
+
75
+ # Return a regex of the value.
76
+ def value_regex(value)
77
+ /#\{\s*#{value}\s*\}/
78
+ end
79
+
80
+ # Strip the regex starting / and ending / from the value.
81
+ def strip_regex_from(value)
82
+ value.gsub(/^\/|\/$/,'')
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,19 @@
1
+ module YARD
2
+ module Handlers
3
+ module Lucid
4
+ class Base < Handlers::Base
5
+ class << self
6
+ include Parser::Lucid
7
+ def handles?(node)
8
+ handlers.any? do |a_handler|
9
+ node.class == a_handler
10
+ end
11
+ end
12
+ include Parser::Lucid
13
+ end
14
+ end
15
+
16
+ Processor.register_handler_namespace :feature, Lucid
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,102 @@
1
+ module YARD
2
+ module Handlers
3
+ module Lucid
4
+ class FeatureHandler < Base
5
+ handles CodeObjects::Lucid::Feature
6
+
7
+ # This method is currently not needed. It would be needed if there was
8
+ # further processing to be done on the features.
9
+ def process
10
+ end
11
+
12
+ # Register, once, when all files are finished. This will trigger the
13
+ # final matching of feature steps to step definitions and steps to
14
+ # transforms.
15
+ YARD::Parser::SourceParser.after_parse_list do |files,globals|
16
+ YARD::Registry.all(:feature).each do |feature|
17
+ FeatureHandler.match_steps_to_step_definitions(feature)
18
+ end
19
+ end
20
+
21
+ class << self
22
+ @@step_definitions = nil
23
+ @@step_transforms = nil
24
+
25
+ def match_steps_to_step_definitions(statement)
26
+ # Create a cache of all of the steps and the transforms.
27
+ @@step_definitions = cache(:stepdefinition) unless @@step_definitions
28
+ @@step_transforms = cache(:steptransform) unless @@step_transforms
29
+
30
+ if statement
31
+ # For the background and the scenario, find the steps that have
32
+ # definitions.
33
+ process_scenario(statement.background) if statement.background
34
+
35
+ statement.scenarios.each do |scenario|
36
+ if scenario.outline?
37
+ scenario.scenarios.each_with_index do |example,index|
38
+ process_scenario(example)
39
+ end
40
+ else
41
+ process_scenario(scenario)
42
+ end
43
+ end
44
+ else
45
+ log.warn "Empty feature file. A feature failed to process correctly or contains no feature"
46
+ end
47
+
48
+ rescue YARD::Handlers::NamespaceMissingError
49
+ rescue Exception => exception
50
+ log.error "Skipping feature because an error has occurred."
51
+ log.debug "\n#{exception}\n#{exception.backtrace.join("\n")}\n"
52
+ end
53
+
54
+ # The cache is used to store all comparable items with their
55
+ # compare_value as the key and the item as the value. This will
56
+ # reject any compare values that contain escapes -- #{} -- because
57
+ # that means the values have unpacked constants.
58
+ def cache(type)
59
+ YARD::Registry.all(type).inject({}) do |hash,item|
60
+ hash[item.regex] = item if item.regex
61
+ hash
62
+ end
63
+ end
64
+
65
+ def process_scenario(scenario)
66
+ scenario.steps.each {|step| process_step(step) }
67
+ end
68
+
69
+ def process_step(step)
70
+ match_step_to_step_definition_and_transforms(step)
71
+ end
72
+
73
+ # Given a step object, attempt to match that step to a transform.
74
+ def match_step_to_step_definition_and_transforms(step)
75
+ @@step_definitions.each_pair do |stepdef,stepdef_object|
76
+ stepdef_matches = step.value.match(stepdef)
77
+
78
+ if stepdef_matches
79
+ step.definition = stepdef_object
80
+ stepdef_matches[-1..1].each do |match|
81
+ @@step_transforms.each do |steptrans,steptransform_object|
82
+ if steptrans.match(match)
83
+ step.transforms << steptransform_object
84
+ steptransform_object.steps << step
85
+ end
86
+ end
87
+ end
88
+
89
+ # A this point the step has been matched to the definition and
90
+ # to any transforms. As a design note, if the step were to
91
+ # match again, it would be possible to display any steps that
92
+ # are considered ambiguous.
93
+ # This would be a nice to have.
94
+ break
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,67 @@
1
+ # Finds and processes all the step matchers defined in the source code.
2
+ #
3
+ # To override the language you can define the step keywords in the YARD
4
+ # configuration file `~./yard/config`.
5
+ class YARD::Handlers::Ruby::StepDefinitionHandler < YARD::Handlers::Ruby::Base
6
+ def self.default_step_definitions
7
+ [ "Given", "When", "Then", "And", "But", "*" ]
8
+ end
9
+
10
+ def self.custom_step_definitions
11
+ YARD::Config.options["yard-lucid"]["language"]["step_definitions"]
12
+ end
13
+
14
+ def self.custom_step_definitions_defined?
15
+ YARD::Config.options["yard-lucid"] and
16
+ YARD::Config.options["yard-lucid"]["language"] and
17
+ YARD::Config.options["yard-lucid"]["language"]["step_definitions"]
18
+ end
19
+
20
+ def self.step_definitions
21
+ if custom_step_definitions_defined?
22
+ custom_step_definitions
23
+ else
24
+ default_step_definitions
25
+ end
26
+ end
27
+
28
+ step_definitions.each { |step_def| handles method_call(step_def) }
29
+
30
+ process do
31
+ instance = YARD::CodeObjects::StepDefinitionObject.new(step_transform_namespace, step_definition_name) do |o|
32
+ o.source = statement.source
33
+ o.comments = statement.comments
34
+ o.keyword = statement.method_name.source
35
+ o.value = statement.parameters.source
36
+ o.pending = pending_keyword_used?(statement.block)
37
+ end
38
+
39
+ obj = register instance
40
+ parse_block(statement[2],:owner => obj)
41
+ end
42
+
43
+ def pending_keyword
44
+ "pending"
45
+ end
46
+
47
+ def pending_command_statement?(line)
48
+ (line.type == :command || line.type == :vcall) && line.first.source == pending_keyword
49
+ end
50
+
51
+ def pending_keyword_used?(block)
52
+ code_in_block = block.last
53
+ code_in_block.find { |line| pending_command_statement?(line) }
54
+ end
55
+
56
+ def step_transform_namespace
57
+ YARD::CodeObjects::Lucid::LUCID_STEPTRANSFORM_NAMESPACE
58
+ end
59
+
60
+ def step_definition_name
61
+ "step_definition#{self.class.generate_unique_id}"
62
+ end
63
+
64
+ def self.generate_unique_id
65
+ @step_definition_count = @step_definition_count.to_i + 1
66
+ end
67
+ end
@@ -0,0 +1,28 @@
1
+ class YARD::Handlers::Ruby::StepTransformHandler < YARD::Handlers::Ruby::Base
2
+ handles method_call(:Transform)
3
+
4
+ process do
5
+ instance = YARD::CodeObjects::StepTransformObject.new(step_transform_namespace,step_transformer_name) do |o|
6
+ o.source = statement.source
7
+ o.comments = statement.comments
8
+ o.keyword = statement[0].source
9
+ o.value = statement[1].source
10
+ end
11
+
12
+ obj = register instance
13
+ parse_block(statement[2],:owner => obj)
14
+ end
15
+
16
+ def step_transform_namespace
17
+ YARD::CodeObjects::Lucid::LUCID_STEPTRANSFORM_NAMESPACE
18
+ end
19
+
20
+ def step_transformer_name
21
+ "step_transform#{self.class.generate_unique_id}"
22
+ end
23
+
24
+ def self.generate_unique_id
25
+ @step_transformer_count = @step_transformer_count.to_i + 1
26
+ end
27
+
28
+ end
@@ -0,0 +1,58 @@
1
+ require "yard"
2
+
3
+ module YARD::Parser::Lucid
4
+ class FeatureParser < YARD::Parser::Base
5
+ # Each feature found creates a new FeatureParser.
6
+ #
7
+ # A Gherkin "builder" is created that will store a representation of the
8
+ # feature file. That feature file is then sent to the Gherkin parser.
9
+ # The Lucid::Parser::GherkinRepr is being used to parse the elements of
10
+ # the faeture file into YARD::CodeObjects.
11
+ def initialize(source, file = '(stdin)')
12
+ @builder = Lucid::Parser::GherkinRepr.new(file)
13
+ @tag_counts = {}
14
+ @parser = Gherkin::Parser.new(@builder)
15
+
16
+ @source = source
17
+ @file = file
18
+
19
+ @feature = nil
20
+ end
21
+
22
+ # When parse is called, the Gherkin parser is executed and all the feature
23
+ # elements that are found are sent to the various methods in the
24
+ # Lucid::Parser::GherkinRepr. The result of this is a syntax tree
25
+ # representation of the feature that contains all the scenarios and steps.
26
+ def parse
27
+ begin
28
+ @parser.parse(@source)
29
+ @feature = @builder.ast
30
+ return nil if @feature.nil?
31
+
32
+ # The parser used the following keywords when parsing the feature
33
+ # @feature.language = @parser.i18n_language.get_code_keywords.map {|word| word }
34
+
35
+ rescue Gherkin::ParserError => e
36
+ e.message.insert(0, "#{@file}: ")
37
+ warn e
38
+ end
39
+
40
+ self
41
+ end
42
+
43
+ # While the method is necessary, nothing actually happens here because all
44
+ # of the work is done in the parse method.
45
+ def tokenize
46
+ end
47
+
48
+ # The only enumeration that can be done at this level is the feature
49
+ # itself. There is no construct higher than a feature wherein a feature
50
+ # can be enumerated.
51
+ def enumerator
52
+ [@feature]
53
+ end
54
+ end
55
+
56
+ # Register all feature files to be processed with the above FeatureParser
57
+ YARD::Parser::SourceParser.register_parser_type :feature, FeatureParser, 'feature'
58
+ end
@@ -0,0 +1,32 @@
1
+ module YARD
2
+ module Server
3
+ class Adapter
4
+ class << self
5
+ alias_method :yard_setup, :setup
6
+
7
+ # To provide the templates necessary for `yard-lucid` to integrate
8
+ # with YARD the adapter has to around-alias the setup method to place
9
+ # the `yard-lucid` server templates as the last template in the list.
10
+ #
11
+ # When they are normally loaded with the plugin they cause an error with
12
+ # the `yardoc` command. They are also not used because the YARD server
13
+ # templates are placed after all plugin templates.
14
+ def setup
15
+ yard_setup
16
+ YARD::Templates::Engine.template_paths +=
17
+ [File.dirname(__FILE__) + '/../../templates',File.dirname(__FILE__) + '/../../docserver']
18
+ end
19
+
20
+ alias_method :yard_shutdown, :shutdown
21
+
22
+ # Similar to the addition, it is good business to tear down the templates
23
+ # that were added by again around-aliasing the shutdown method.
24
+ def shutdown
25
+ yard_shutdown
26
+ YARD::Templates::Engine.template_paths -=
27
+ [File.dirname(__FILE__) + '/../../templates',File.dirname(__FILE__) + '/../../docserver']
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ module YARD
2
+ module Server
3
+ module Commands
4
+ # List Features powers the features menu option in `yard server`
5
+ class ListFeaturesCommand < ListCommand
6
+ def type; :features end
7
+
8
+ def items
9
+ Registry.load_all
10
+ run_verifier(Registry.all(:feature))
11
+ end
12
+ end
13
+
14
+ # List Tags powers the tags menu option in `yard server`
15
+ class ListTagsCommand < ListCommand
16
+ def type; :tags end
17
+
18
+ def items
19
+ Registry.load_all
20
+ run_verifier(Registry.all(:tag).sort_by {|t| t.value.to_s })
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module YARD
2
+ module Server
3
+ # The YARD::Server::Router needs the following modification,
4
+ # so that it will provide routing for the features and tags commands
5
+ # to their appropriate definitions
6
+ Router.class_eval do
7
+ alias_method :core_route_list, :route_list
8
+
9
+ # Provide the full list of features and tags
10
+ def route_list(library, paths)
11
+ if paths && !paths.empty? && paths.first =~ /^(?:features|tags)$/
12
+ case paths.shift
13
+ when "features"; cmd = Commands::ListFeaturesCommand
14
+ when "tags"; cmd = Commands::ListTagsCommand
15
+ end
16
+ cmd.new(final_options(library, paths)).call(request)
17
+ else
18
+ core_route_list(library,paths)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module YARD::Templates::Helpers
2
+ module BaseHelper
3
+ def format_object_title(object)
4
+ if object.is_a?(YARD::CodeObjects::Lucid::FeatureTags)
5
+ "Tags"
6
+ elsif object.is_a?(YARD::CodeObjects::Lucid::StepTransformersObject)
7
+ "Steps and Transforms"
8
+ elsif object.is_a?(YARD::CodeObjects::Lucid::NamespaceObject)
9
+ "#{format_object_type(object)}#{object.value ? ": #{object.value}" : ''}"
10
+ elsif object.is_a?(YARD::CodeObjects::Lucid::FeatureDirectory)
11
+ "Feature Directory: #{object.name}"
12
+ else
13
+ case object
14
+ when YARD::CodeObjects::RootObject
15
+ "Top Level Namespace"
16
+ else
17
+ format_object_type(object) + ": " + object.path
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module YardLucid
2
+ VERSION = "0.1.0".freeze
3
+ end
data/lib/yard-lucid.rb ADDED
@@ -0,0 +1,36 @@
1
+ require "gherkin/parser"
2
+
3
+ require "yard-lucid/version"
4
+
5
+ require "lucid/gherkin_repr"
6
+
7
+ require "yard/parser/lucid/feature"
8
+
9
+ require "yard/code_objects/lucid/base"
10
+ require "yard/code_objects/lucid/namespace_object"
11
+ require "yard/code_objects/lucid/feature"
12
+ require "yard/code_objects/lucid/scenario_outline"
13
+ require "yard/code_objects/lucid/scenario"
14
+ require "yard/code_objects/lucid/step"
15
+ require "yard/code_objects/lucid/tag"
16
+ require "yard/code_objects/step_transformer"
17
+ require "yard/code_objects/step_definition"
18
+ require "yard/code_objects/step_transform"
19
+
20
+ require "yard/handlers/lucid/base"
21
+ require "yard/handlers/lucid/feature_handler"
22
+ require "yard/handlers/step_definition_handler"
23
+ require "yard/handlers/step_transform_handler"
24
+
25
+ require "yard/templates/helpers/base_helper"
26
+
27
+ require "yard/server/adapter"
28
+ require "yard/server/commands/list_command"
29
+ require "yard/server/router"
30
+
31
+ # This registered template works for yardoc
32
+ YARD::Templates::Engine.register_template_path File.dirname(__FILE__) + '/templates'
33
+
34
+ # The following paths are needed for the yard server
35
+ YARD::Server.register_static_path File.dirname(__FILE__) + "/templates/default/fulldoc/html"
36
+ YARD::Server.register_static_path File.dirname(__FILE__) + "/docserver/default/fulldoc/html"
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'yard-lucid/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "yard-lucid"
8
+ spec.version = YardLucid::VERSION
9
+ spec.authors = ["Jeff Nyman"]
10
+ spec.email = ["jeffnyman@gmail.com"]
11
+
12
+ spec.summary = %q{YARD Documentation Generator for Gherkin-based Repositories}
13
+ spec.description = %q{YARD Documentation Generator for Gherkin-based Repositories}
14
+ spec.homepage = "https://github.com/jeffnyman/yard-lucid"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.14"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency "pry"
28
+
29
+ spec.add_runtime_dependency "yard"
30
+ spec.add_runtime_dependency "gherkin", "~> 4.0"
31
+ spec.add_runtime_dependency "cucumber", "~> 2.0"
32
+
33
+ spec.post_install_message = %{
34
+ (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
35
+ Yard-Lucid #{YardLucid::VERSION} has been installed.
36
+ (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
37
+ }
38
+ end