lib/danger/plugin_support/plugin_parser.rb in danger-0.8.3 vs lib/danger/plugin_support/plugin_parser.rb in danger-0.8.4
- old
+ new
@@ -1,34 +1,48 @@
-require 'yard'
+require 'json'
module Danger
class PluginParser
attr_accessor :registry
- def initialize(path)
- @path = path
+ def initialize(paths)
+ raise "Path cannot be empty" if paths.empty?
+
+ if paths.is_a? String
+ @paths = [File.expand_path(paths)]
+ else
+ @paths = paths
+ end
end
def parse
+ require 'yard'
# could this go in a singleton-y place instead?
# like class initialize?
YARD::Tags::Library.define_tag('tags', :tags)
+ YARD::Tags::Library.define_tag('availablity', :availablity)
+ files = ["lib/danger/plugin_support/plugin.rb"] + @paths
- files = ["lib/danger/plugin_support/plugin.rb", @path]
+ # This turns on YARD debugging
+ # $DEBUG = true
+
self.registry = YARD::Registry.load(files, true)
end
def classes_in_file
- self.registry.all
- .select { |thing| thing.type == :class }
- .select { |klass| klass.file == @path }
+ registry.all(:class).select { |klass| @paths.include? klass.file }
end
def plugins_from_classes(classes)
classes.select { |klass| klass.inheritance_tree.map(&:name).include? :Plugin }
end
+ def to_json
+ plugins = plugins_from_classes(classes_in_file)
+ to_dict(plugins).to_json
+ end
+
def to_dict(classes)
d_meth = lambda do |meth|
return nil if meth.nil?
{
name: meth.name,
@@ -48,23 +62,26 @@
write: d_meth.call(attribute[:write])
}
end
classes.map do |klass|
+ # Adds the class being parsed into the ruby runtime
+ require klass.file
+ real_klass = Danger.const_get klass.name
+ attribute_meths = klass.attributes[:instance].values.map(&:values).flatten
{
- name: klass.name.to_s,
- body_md: klass.docstring,
- example_code: klass.tags.select { |t| t.tag_name == "example" }.map(&:text).compact,
- attributes: klass.attributes[:instance].map do |pair|
- {
- pair.first => d_attr.call(pair.last)
+ name: klass.name.to_s,
+ body_md: klass.docstring,
+ instance_name: real_klass.instance_name,
+ example_code: klass.tags.select { |t| t.tag_name == "example" }.map { |tag| {:title => tag.name, :text => tag.text} }.compact,
+ attributes: klass.attributes[:instance].map do |pair|
+ { pair.first => d_attr.call(pair.last) }
+ end,
+ methods: (klass.meths - klass.inherited_meths - attribute_meths ).select { |m| m.visibility == :public }.map { |m| d_meth.call(m) },
+ tags: klass.tags.select { |t| t.tag_name == "tags" }.map(&:name).compact,
+ see: klass.tags.select { |t| t.tag_name == "see" }.map(&:name).map(&:split).flatten.compact,
+ file: klass.file.gsub(File.expand_path("."), "")
}
- end,
- methods: (klass.meths - klass.inherited_meths).select { |m| m.visibility == :public }.map { |m| d_meth.call(m) },
- tags: klass.tags.select { |t| t.tag_name == "tags" }.map(&:name).compact,
- see: klass.tags.select { |t| t.tag_name == "see" }.map(&:name).map(&:split).flatten.compact,
- file: klass.file
- }
end
end
end
end