yard-thunder 0.1.0
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.
- data/CHANGELOG +2 -0
- data/README.md +32 -0
- data/Rakefile +47 -0
- data/lib/sample.rb +40 -0
- data/lib/yard-thunder.rb +45 -0
- data/lib/yard-thunder/default_command.rb +31 -0
- data/lib/yard-thunder/description.rb +46 -0
- data/lib/yard-thunder/options.rb +61 -0
- data/lib/yard-thunder/subcommand.rb +31 -0
- data/lib/yard-thunder/version.rb +3 -0
- metadata +55 -0
data/CHANGELOG
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
[Yard-Thunder](http://stevenkaras.github.com/yard-thunder)
|
2
|
+
=======
|
3
|
+
YARD plugin for Thunder integration.
|
4
|
+
|
5
|
+
Code is based upon yard-thor by Loren Segal (who also maintains YARD itself). Way to go Loren!
|
6
|
+
|
7
|
+
Usage
|
8
|
+
-----
|
9
|
+
|
10
|
+
gem install yard-thunder
|
11
|
+
|
12
|
+
yard --plugin thunder COMMANDS
|
13
|
+
|
14
|
+
Goals
|
15
|
+
-----
|
16
|
+
Provide integration for Thunder CLI programs with YARD
|
17
|
+
|
18
|
+
Development Phases
|
19
|
+
|
20
|
+
1. provide a section called "CLI usage" for each command (method)
|
21
|
+
2. integrate options into the generated docs for a command
|
22
|
+
3. handle subcommands (along with all the other stuff)
|
23
|
+
4. add a CLI usage section/file in the YARD output (manpage style)
|
24
|
+
5. activate only if Thunder is included (or has been included in a parent class)
|
25
|
+
|
26
|
+
Development
|
27
|
+
-----------
|
28
|
+
If you'd like to contribute, fork, commit, and request a pull. I'll get around to it. No special dependencies, or anything fancy
|
29
|
+
|
30
|
+
License
|
31
|
+
-------
|
32
|
+
MIT License
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
Rake::TestTask.new do |t|
|
4
|
+
t.test_files = FileList['test/*_test.rb']
|
5
|
+
t.test_files = FileList['test/test_*.rb']
|
6
|
+
t.test_files = FileList['spec/*_spec.rb']
|
7
|
+
t.test_files = FileList['spec/spec_*.rb']
|
8
|
+
t.libs << 'spec'
|
9
|
+
t.libs << 'test'
|
10
|
+
end
|
11
|
+
|
12
|
+
gemspec = eval(File.read(Dir["*.gemspec"].first))
|
13
|
+
|
14
|
+
desc "Run tests"
|
15
|
+
task :default => :test
|
16
|
+
|
17
|
+
desc "Validate the gemspec"
|
18
|
+
task :gemspec do
|
19
|
+
gemspec.validate
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Build the gem locally"
|
23
|
+
task :build => :gemspec do
|
24
|
+
system "gem build #{gemspec.name}.gemspec"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Install the gem locally"
|
28
|
+
task :install => :build do
|
29
|
+
system "gem uninstall -a #{gemspec.name}"
|
30
|
+
system "gem install #{gemspec.name}-#{gemspec.version}.gem"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "check syntax"
|
34
|
+
task :syntax do
|
35
|
+
Dir["**/*.rb"].each do |file|
|
36
|
+
print "#{file}: "
|
37
|
+
system("ruby -c #{file}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "delete all temporary files"
|
42
|
+
task :clean
|
43
|
+
|
44
|
+
desc "delete all temporary files and build artifacts"
|
45
|
+
task :clobber => :clean do
|
46
|
+
FileUtils.rm_rf Dir["#{gemspec.name}-*.gem"]
|
47
|
+
end
|
data/lib/sample.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.expand_path("../lib/", __FILE__)
|
4
|
+
require 'thunder'
|
5
|
+
require 'thunder/options/trollop'
|
6
|
+
|
7
|
+
class Bar
|
8
|
+
include Thunder
|
9
|
+
|
10
|
+
desc "doit", "do something with the Bar class"
|
11
|
+
option :verb, type: Boolean, desc: "verbosity"
|
12
|
+
def doit(options={})
|
13
|
+
p options
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Foo
|
18
|
+
include Thunder
|
19
|
+
|
20
|
+
#options_processor TrollopAdapter
|
21
|
+
|
22
|
+
desc "bar A", "desc"
|
23
|
+
def bar(a)
|
24
|
+
p a
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "baz [options]"
|
28
|
+
option :flag, type: Boolean, desc: "run with a flag"
|
29
|
+
option :some, type: String, desc: "something", default: "some default value"
|
30
|
+
def baz(options = {})
|
31
|
+
p options
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "quux COMMAND...", "send COMMAND to Bar"
|
35
|
+
subcommand "quux", ::Bar.new
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
Foo.new.start
|
data/lib/yard-thunder.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
$: << File.expand_path("..", __FILE__)
|
2
|
+
|
3
|
+
module YardThunder
|
4
|
+
|
5
|
+
require 'yard-thunder/description'
|
6
|
+
require 'yard-thunder/options'
|
7
|
+
require 'yard-thunder/subcommand'
|
8
|
+
require 'yard-thunder/default_command'
|
9
|
+
|
10
|
+
module ThunderMethodHandlerMixin
|
11
|
+
def register(*objs)
|
12
|
+
@registered_object = objs.first
|
13
|
+
super(*objs)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class YARD::Handlers::Processor
|
19
|
+
attr_accessor :extra_state
|
20
|
+
end
|
21
|
+
|
22
|
+
class YARD::Handlers::Ruby::MethodHandler
|
23
|
+
include YardThunder::ThunderMethodHandlerMixin
|
24
|
+
include YardThunder::MethodHandlerDescriptionMixin
|
25
|
+
include YardThunder::MethodHandlerOptionMixin
|
26
|
+
end
|
27
|
+
|
28
|
+
# class YARD::Handlers::Ruby::Legacy::MethodHandler
|
29
|
+
# include ::YardThunder::ThunderMethodHandlerMixin
|
30
|
+
# include ::YardThunder::MethodHandlerDescriptionMixin
|
31
|
+
# include YardThunder::MethodHandlerOptionMixin
|
32
|
+
# end
|
33
|
+
|
34
|
+
# module YARD::Templates::Helpers::HtmlHelper
|
35
|
+
# def signature_for_thunder_command(meth, link = true, *args)
|
36
|
+
# if meth.has_tag?(:thunder_command)
|
37
|
+
# sig = link ? link_object(meth, meth.signature) : meth.signature
|
38
|
+
# "$ " + sig
|
39
|
+
# else
|
40
|
+
# old_signature(meth, link, *args)
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
# alias old_signature signature
|
44
|
+
# alias signature signature_for_thunder_command
|
45
|
+
# end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module YardThunder
|
2
|
+
class DefaultCommandHandler < YARD::Handlers::Ruby::Base
|
3
|
+
handles method_call(:default_command)
|
4
|
+
|
5
|
+
process do
|
6
|
+
# statement.parameters(false).map do |param|
|
7
|
+
# param.jump(:string_content).source
|
8
|
+
# end
|
9
|
+
# name = statement.parameters.first.jump(:tstring_content, :ident).source
|
10
|
+
# object = YARD::CodeObjects::MethodObject.new(namespace, name)
|
11
|
+
# register(object)
|
12
|
+
# parse_block(statement.last.last, :owner => object)
|
13
|
+
|
14
|
+
# # modify the object
|
15
|
+
# object.dynamic = true
|
16
|
+
|
17
|
+
# # add custom metadata to the object
|
18
|
+
# object['custom_field'] = 'Generated by Methodify'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# class LegacyDefaultCommandHandler < YARD::Handlers::Ruby::Legacy::Base
|
23
|
+
# namespace_only
|
24
|
+
# handles /\Adefault_command(\s|\()/
|
25
|
+
|
26
|
+
# process do
|
27
|
+
# #TODO: write this
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module YardThunder
|
2
|
+
class DescriptionHandler < YARD::Handlers::Ruby::Base
|
3
|
+
handles method_call(:desc)
|
4
|
+
|
5
|
+
process do
|
6
|
+
parser.extra_state.thunder_desc = statement.parameters(false).map do |param|
|
7
|
+
param.jump(:string_content).source
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# class LegacyDescriptionHandler < YARD::Handlers::Ruby::Legacy::Base
|
13
|
+
# namespace_only
|
14
|
+
# handles /\Adesc(\s|\()/
|
15
|
+
|
16
|
+
# process do
|
17
|
+
# parser.extra_state ||= {}
|
18
|
+
# parser.extra_state[:thunder_desc] = tokval_list(statement.tokens[1..-1], :attr)
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
module MethodHandlerDescriptionMixin
|
23
|
+
def process
|
24
|
+
super
|
25
|
+
return unless parser.extra_state
|
26
|
+
#TODO: create a second code object for the thunder command itself
|
27
|
+
|
28
|
+
# handle a command description for this method
|
29
|
+
if parser.extra_state.thunder_desc
|
30
|
+
usage, desc = *parser.extra_state.thunder_desc
|
31
|
+
# drop in the description, if there is no "real" docstring
|
32
|
+
tags = @registered_object.tags
|
33
|
+
@registered_object.docstring = desc
|
34
|
+
tags.each { |tag| @registered_object.docstring.add_tag(tag) }
|
35
|
+
@registered_object.signature = usage
|
36
|
+
|
37
|
+
# add a second code object to describe the command line interface for this command
|
38
|
+
@registered_object.namespace.groups << ["Thunder Commands"] unless @registered_object.namespace.groups.include? "Thunder Commands"
|
39
|
+
# @registered_object.group = "Thunder Commands"
|
40
|
+
# @registered_object.docstring.add_tag YARD::Tags::Tag.new(:thunder_command, '')
|
41
|
+
parser.extra_state.thunder_desc = nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module YardThunder
|
2
|
+
class OptionHandler < YARD::Handlers::Ruby::Base
|
3
|
+
handles method_call(:option)
|
4
|
+
|
5
|
+
process do
|
6
|
+
parser.extra_state.thunder_options ||= []
|
7
|
+
parser.extra_state.thunder_options << {}.tap do |option|
|
8
|
+
params = statement.parameters(false)
|
9
|
+
option[:name] = params[0].jump(:ident, :string_content).source
|
10
|
+
params[1].each do |param|
|
11
|
+
key = param.first.jump(:label, :ident)[0].to_sym
|
12
|
+
value = param[1][0].jump(:const, :kw, :string_content).source
|
13
|
+
option[key] = value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# class LegacyOptionHandler < YARD::Handlers::Ruby::Legacy::Base
|
20
|
+
# handles /\Aoption(\s|\()/
|
21
|
+
|
22
|
+
# process do
|
23
|
+
# parser.extra_state ||= {}
|
24
|
+
# parser.extra_state[:thunder_options] ||= []
|
25
|
+
# parser.extra_state[:thunder_options] << tokval_list(statement.tokens[1..-1], :attr)
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
|
29
|
+
module MethodHandlerOptionMixin
|
30
|
+
def process
|
31
|
+
super
|
32
|
+
return unless parser.extra_state
|
33
|
+
# handle any options for this command
|
34
|
+
if parser.extra_state.thunder_options
|
35
|
+
# add the options parameter to the method if it's not already there
|
36
|
+
unless @registered_object.tags(:param).find {|x| x.name == "options"}
|
37
|
+
option_param = YARD::Tags::Tag.new(:param, "a customizable set of options", "Hash", "options")
|
38
|
+
@registered_object.docstring.add_tag(option_param)
|
39
|
+
end
|
40
|
+
|
41
|
+
# trick the parser to parse the option as a YARDoc tag
|
42
|
+
parser.extra_state.thunder_options.each do |option|
|
43
|
+
name = option[:name]
|
44
|
+
description = option[:desc] || ""
|
45
|
+
if option[:default]
|
46
|
+
unless description.lstrip.start_with? /\(.+\)/
|
47
|
+
description = "(#{option[:default]}) #{description}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
type = option[:type] || "String"
|
51
|
+
|
52
|
+
text = "options #{name} [#{type}] #{description}"
|
53
|
+
option_tag = YARD::Tags::Library.default_factory.parse_tag_with_options(:option, text)
|
54
|
+
@registered_object.docstring.add_tag(option_tag)
|
55
|
+
end
|
56
|
+
parser.extra_state.thunder_options = nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module YardThunder
|
2
|
+
class SubcommandHandler < YARD::Handlers::Ruby::Base
|
3
|
+
handles method_call(:subcommand)
|
4
|
+
|
5
|
+
process do
|
6
|
+
# statement.parameters(false).map do |param|
|
7
|
+
# param.jump(:string_content).source
|
8
|
+
# end
|
9
|
+
# name = statement.parameters.first.jump(:tstring_content, :ident).source
|
10
|
+
# object = YARD::CodeObjects::MethodObject.new(namespace, name)
|
11
|
+
# register(object)
|
12
|
+
# parse_block(statement.last.last, :owner => object)
|
13
|
+
|
14
|
+
# # modify the object
|
15
|
+
# object.dynamic = true
|
16
|
+
|
17
|
+
# # add custom metadata to the object
|
18
|
+
# object['custom_field'] = 'Generated by Methodify'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# class LegacySubcommandHandler < YARD::Handlers::Ruby::Legacy::Base
|
23
|
+
# namespace_only
|
24
|
+
# handles /\Asubcommand(\s|\()/
|
25
|
+
|
26
|
+
# process do
|
27
|
+
# #TODO: write this
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yard-thunder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Steven Karas
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-20 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Integrates Thunder command line interfaces into YARD
|
15
|
+
email: steven.karas@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/sample.rb
|
21
|
+
- lib/yard-thunder/default_command.rb
|
22
|
+
- lib/yard-thunder/description.rb
|
23
|
+
- lib/yard-thunder/options.rb
|
24
|
+
- lib/yard-thunder/subcommand.rb
|
25
|
+
- lib/yard-thunder/version.rb
|
26
|
+
- lib/yard-thunder.rb
|
27
|
+
- CHANGELOG
|
28
|
+
- Rakefile
|
29
|
+
- README.md
|
30
|
+
homepage: http://stevenkaras.github.com/yard-thunder
|
31
|
+
licenses: []
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirements: []
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 1.8.24
|
51
|
+
signing_key:
|
52
|
+
specification_version: 3
|
53
|
+
summary: YARD integration for Thunder
|
54
|
+
test_files: []
|
55
|
+
has_rdoc:
|