bond-yard 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/.gemspec +25 -0
- data/CHANGELOG.rdoc +2 -0
- data/LICENSE.txt +22 -0
- data/README.rdoc +27 -0
- data/Rakefile +35 -0
- data/deps.rip +1 -0
- data/lib/bond/yard.rb +85 -0
- data/test/deps.rip +4 -0
- data/test/yard_test.rb +128 -0
- metadata +154 -0
data/.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'rubygems' unless Object.const_defined?(:Gem)
|
3
|
+
require File.dirname(__FILE__) + "/lib/bond/yard"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "bond-yard"
|
7
|
+
s.version = Bond::Yard::VERSION
|
8
|
+
s.authors = ["Gabriel Horner"]
|
9
|
+
s.email = "gabriel.horner@gmail.com"
|
10
|
+
s.homepage = "http://github.com/cldwalker/bond-yard"
|
11
|
+
s.summary = "Generate completions from yard docs"
|
12
|
+
s.description = "This bond plugin generates completions for gems that have been documented with yard."
|
13
|
+
s.required_rubygems_version = ">= 1.3.6"
|
14
|
+
s.rubyforge_project = 'tagaholic'
|
15
|
+
s.has_rdoc = 'yard'
|
16
|
+
s.rdoc_options = ['--title', "bond-yard #{Bond::Yard::VERSION} Documentation"]
|
17
|
+
s.add_dependency 'yard', '>= 0.5.2'
|
18
|
+
s.add_development_dependency 'bacon', '>= 1.1.0'
|
19
|
+
s.add_development_dependency 'mocha', '>= 0.9.8'
|
20
|
+
s.add_development_dependency 'mocha-on-bacon'
|
21
|
+
s.add_development_dependency 'bacon-bits'
|
22
|
+
s.files = Dir.glob(%w[{lib,test}/**/*.rb bin/* [A-Z]*.{txt,rdoc} ext/**/*.{rb,c} **/deps.rip]) + %w{Rakefile .gemspec}
|
23
|
+
s.extra_rdoc_files = ["README.rdoc", "LICENSE.txt"]
|
24
|
+
s.license = 'MIT'
|
25
|
+
end
|
data/CHANGELOG.rdoc
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT LICENSE
|
2
|
+
|
3
|
+
Copyright (c) 2010 Gabriel Horner
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
== Description
|
2
|
+
This bond plugin generates completions for gems that have been documented with yard.
|
3
|
+
|
4
|
+
== Install
|
5
|
+
Install the gem with:
|
6
|
+
|
7
|
+
sudo gem install bond-yard
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
Add to your ~/.irbrc
|
12
|
+
|
13
|
+
require 'bond/yard'
|
14
|
+
|
15
|
+
In your .irbrc or in the console, load completions for gems that have been documented with yard:
|
16
|
+
|
17
|
+
>> Bond.load_yard_gems 'bond'
|
18
|
+
Bond: Building/loading bond's .yardoc database ...
|
19
|
+
=> ['bond']
|
20
|
+
>> Bond.start :[TAB]
|
21
|
+
:bare :debug :default_mission :default_search :eval_binding :eval_debug :gems :readline_plugin
|
22
|
+
|
23
|
+
For more examples, {see
|
24
|
+
here}[http://tagaholic.me/2010/05/19/documentation-generated-irb-autocompletions-with-bond-and-yard.html#yard_based_irb_autocompletions].
|
25
|
+
|
26
|
+
== Todo
|
27
|
+
* Generate method autocompletions for any arguments based on yard docs
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
def gemspec
|
5
|
+
@gemspec ||= eval(File.read('.gemspec'), binding, '.gemspec')
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Build the gem"
|
9
|
+
task :gem=>:gemspec do
|
10
|
+
sh "gem build .gemspec"
|
11
|
+
FileUtils.mkdir_p 'pkg'
|
12
|
+
FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", 'pkg'
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Install the gem locally"
|
16
|
+
task :install => :gem do
|
17
|
+
sh %{gem install pkg/#{gemspec.name}-#{gemspec.version}}
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Generate the gemspec"
|
21
|
+
task :generate do
|
22
|
+
puts gemspec.to_ruby
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Validate the gemspec"
|
26
|
+
task :gemspec do
|
27
|
+
gemspec.validate
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Run tests'
|
31
|
+
task :test do |t|
|
32
|
+
sh 'bacon -q -Ilib -I. test/*_test.rb'
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :test
|
data/deps.rip
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
yard >=0.5.2
|
data/lib/bond/yard.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'bond'
|
2
|
+
require 'yard'
|
3
|
+
|
4
|
+
module Bond
|
5
|
+
# Adds class methods to Bond
|
6
|
+
module Yard
|
7
|
+
VERSION = '0.1.0'
|
8
|
+
|
9
|
+
# Generates and loads completions for yardoc documented gems.
|
10
|
+
# @param *gems Gem(s) with optional options hash at the end
|
11
|
+
# @option *gems :verbose[Boolean] (false) Displays additional information when building yardoc.
|
12
|
+
# @option *gems :reload[Boolean] (false) Rebuilds yard databases. Use when gems have changed versions.
|
13
|
+
def load_yard_gems(*gems)
|
14
|
+
Loader.load_yard_gems(*gems)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Generates and loads completions for methods that take a hash of options and have been
|
18
|
+
# documented with @option.
|
19
|
+
module Loader
|
20
|
+
extend self
|
21
|
+
|
22
|
+
def load_yard_gems(*gems)
|
23
|
+
@options = gems[-1].is_a?(Hash) ? gems.pop : {}
|
24
|
+
gems.select {|e| load_yard_gem(e) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_yard_gem(rubygem)
|
28
|
+
raise("Unable to find gem.") unless (yardoc = find_yardoc(rubygem))
|
29
|
+
completion_file = File.join(dir('yard_completions'), rubygem+'.rb')
|
30
|
+
create_completion_file(yardoc, completion_file) if !File.exists?(completion_file) || @options[:reload]
|
31
|
+
M.load_file completion_file
|
32
|
+
rescue
|
33
|
+
$stderr.puts "Bond Error: Didn't load yard completions for gem '#{rubygem}'. #{$!.message}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_completion_file(yardoc, completion_file)
|
37
|
+
YARD::Registry.load!(yardoc)
|
38
|
+
methods_hash = find_methods_with_options
|
39
|
+
body = generate_method_completions(methods_hash)
|
40
|
+
File.open(completion_file, 'w') {|e| e.write body }
|
41
|
+
end
|
42
|
+
|
43
|
+
def find_yardoc(rubygem)
|
44
|
+
(file = YARD::Registry.yardoc_file_for_gem(rubygem) rescue nil) and return(file)
|
45
|
+
if (file = M.find_gem_file(rubygem, rubygem+'.rb'))
|
46
|
+
output_dir = File.join(dir('.yardocs'), rubygem)
|
47
|
+
cmd = ['yardoc', '-n', '-b', output_dir]
|
48
|
+
cmd << '-q' unless @options[:verbose]
|
49
|
+
cmd += ['-c', output_dir] unless @options[:reload]
|
50
|
+
cmd += [file, File.expand_path(file+'/..')+"/#{rubygem}/**/*.rb"]
|
51
|
+
puts "Bond: "+cmd.join(' ') if @options[:verbose]
|
52
|
+
puts "Bond: Building/loading #{rubygem}'s .yardoc database ..."
|
53
|
+
system *cmd
|
54
|
+
output_dir
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def dir(subdir)
|
59
|
+
(@dirs ||= {})[subdir] ||= begin
|
60
|
+
require 'fileutils'
|
61
|
+
FileUtils.mkdir_p File.join(M.home, '.bond', subdir)
|
62
|
+
File.join(M.home, '.bond', subdir)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_methods_with_options
|
67
|
+
YARD::Registry.all(:method).inject({}) {|a,m|
|
68
|
+
opts = m.tags.select {|e| e.is_a?(YARD::Tags::OptionTag) }.map {|e| e.pair.name }
|
69
|
+
a[m.path] = opts if !opts.empty? && m.path
|
70
|
+
a
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def generate_method_completions(methods_hash)
|
75
|
+
methods_hash.map do |meth, options|
|
76
|
+
options.map! {|e| e.sub(/^:/, '') }
|
77
|
+
meth = meth.sub(/#initialize$/, '.new')
|
78
|
+
%Q[complete(:method=>'#{meth}') {\n #{options.inspect}\n}]
|
79
|
+
end.join("\n")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
Bond.extend Bond::Yard
|
data/test/deps.rip
ADDED
data/test/yard_test.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'bacon'
|
2
|
+
require 'bacon/bits'
|
3
|
+
require 'mocha'
|
4
|
+
require 'mocha-on-bacon'
|
5
|
+
require 'bond/yard'
|
6
|
+
require 'rbconfig'
|
7
|
+
|
8
|
+
class Bacon::Context
|
9
|
+
def capture_stderr(&block)
|
10
|
+
original_stderr = $stderr
|
11
|
+
$stderr = fake = StringIO.new
|
12
|
+
begin
|
13
|
+
yield
|
14
|
+
ensure
|
15
|
+
$stderr = original_stderr
|
16
|
+
end
|
17
|
+
fake.string
|
18
|
+
end
|
19
|
+
|
20
|
+
def capture_stdout(&block)
|
21
|
+
original_stdout = $stdout
|
22
|
+
$stdout = fake = StringIO.new
|
23
|
+
begin
|
24
|
+
yield
|
25
|
+
ensure
|
26
|
+
$stdout = original_stdout
|
27
|
+
end
|
28
|
+
fake.string
|
29
|
+
end
|
30
|
+
end
|
31
|
+
include Bond
|
32
|
+
|
33
|
+
describe 'Bond.load_yard_gems' do
|
34
|
+
def load_yard_gems(*args)
|
35
|
+
args = ['blah'] if args.empty?
|
36
|
+
Bond.load_yard_gems(*args)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'prints error if no yardoc found' do
|
40
|
+
Yard::Loader.expects(:find_yardoc).returns(nil)
|
41
|
+
capture_stderr { load_yard_gems('bond') }.should =~ /Didn't.*'bond'.* Unable to find/
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'loads yardoc found by' do
|
45
|
+
before {
|
46
|
+
Yard::Loader.expects(:create_completion_file)
|
47
|
+
M.expects(:load_file)
|
48
|
+
}
|
49
|
+
|
50
|
+
it 'registry' do
|
51
|
+
YARD::Registry.expects(:yardoc_file_for_gem).returns('/dir/.yardoc')
|
52
|
+
load_yard_gems
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'find_gem_file and' do
|
56
|
+
before {
|
57
|
+
YARD::Registry.expects(:yardoc_file_for_gem).returns(nil)
|
58
|
+
M.expects(:find_gem_file).returns('/dir/blah.rb')
|
59
|
+
}
|
60
|
+
|
61
|
+
it 'prints building message' do
|
62
|
+
Yard::Loader.expects(:system)
|
63
|
+
capture_stdout { load_yard_gems('blah') }.should =~ /Building.*blah's/
|
64
|
+
end
|
65
|
+
|
66
|
+
it "caches yardoc by default" do
|
67
|
+
Yard::Loader.expects(:system).with {|*args| args.include?('-c') }
|
68
|
+
capture_stdout { load_yard_gems }
|
69
|
+
end
|
70
|
+
|
71
|
+
it "doesn't cache yardoc with :reload option" do
|
72
|
+
Yard::Loader.expects(:system).with {|*args| !args.include?('-c') }
|
73
|
+
capture_stdout { load_yard_gems('blah', :reload=>true) }
|
74
|
+
end
|
75
|
+
|
76
|
+
it "prints multiple messages with :verbose option" do
|
77
|
+
Yard::Loader.expects(:system).with {|*args| !args.include?('-q') }
|
78
|
+
capture_stdout { load_yard_gems('blah', :verbose=>true) }.should =~ /yardoc -n/
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'creates completion file' do
|
84
|
+
before {
|
85
|
+
Yard::Loader.expects(:find_yardoc).returns('/dir/.yardoc')
|
86
|
+
M.expects(:load_file)
|
87
|
+
}
|
88
|
+
|
89
|
+
# rubinius implements Kernel#require with File.exists? which is different than MRI
|
90
|
+
unless Config::CONFIG["RUBY_SO_NAME"].to_s[/rubinius/i]
|
91
|
+
it "with :reload option" do
|
92
|
+
File.expects(:exists?).returns(true)
|
93
|
+
Yard::Loader.expects(:create_completion_file)
|
94
|
+
load_yard_gems 'blah', :reload=>true
|
95
|
+
end
|
96
|
+
|
97
|
+
it "with new completion file" do
|
98
|
+
File.expects(:exists?).returns(false)
|
99
|
+
Yard::Loader.expects(:create_completion_file)
|
100
|
+
load_yard_gems
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'which has' do
|
105
|
+
before { YARD::Registry.expects(:load!) }
|
106
|
+
|
107
|
+
it 'methods' do
|
108
|
+
Yard::Loader.expects(:find_methods_with_options).returns({"Bond::M.start"=>[':one', 'two']})
|
109
|
+
expected_body = %[complete(:method=>'Bond::M.start') {\n ["one", "two"]\n}]
|
110
|
+
File.expects(:open).yields mock('block') { expects(:write).with(expected_body) }
|
111
|
+
load_yard_gems
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'no methods' do
|
115
|
+
Yard::Loader.expects(:find_methods_with_options).returns({})
|
116
|
+
File.expects(:open).yields mock('block') { expects(:write).with('') }
|
117
|
+
load_yard_gems
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'methods that map from #initialize to .new' do
|
121
|
+
Yard::Loader.expects(:find_methods_with_options).returns({"Bond::Agent#initialize"=>[':one', 'two']})
|
122
|
+
expected_body = %[complete(:method=>'Bond::Agent.new') {\n ["one", "two"]\n}]
|
123
|
+
File.expects(:open).yields mock('block') { expects(:write).with(expected_body) }
|
124
|
+
load_yard_gems
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bond-yard
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Gabriel Horner
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-07 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: yard
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 5
|
33
|
+
- 2
|
34
|
+
version: 0.5.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: bacon
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 19
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
- 0
|
50
|
+
version: 1.1.0
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: mocha
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 43
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 9
|
65
|
+
- 8
|
66
|
+
version: 0.9.8
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mocha-on-bacon
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id004
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bacon-bits
|
85
|
+
prerelease: false
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
type: :development
|
96
|
+
version_requirements: *id005
|
97
|
+
description: This bond plugin generates completions for gems that have been documented with yard.
|
98
|
+
email: gabriel.horner@gmail.com
|
99
|
+
executables: []
|
100
|
+
|
101
|
+
extensions: []
|
102
|
+
|
103
|
+
extra_rdoc_files:
|
104
|
+
- README.rdoc
|
105
|
+
- LICENSE.txt
|
106
|
+
files:
|
107
|
+
- lib/bond/yard.rb
|
108
|
+
- test/yard_test.rb
|
109
|
+
- LICENSE.txt
|
110
|
+
- CHANGELOG.rdoc
|
111
|
+
- README.rdoc
|
112
|
+
- deps.rip
|
113
|
+
- test/deps.rip
|
114
|
+
- Rakefile
|
115
|
+
- .gemspec
|
116
|
+
has_rdoc: yard
|
117
|
+
homepage: http://github.com/cldwalker/bond-yard
|
118
|
+
licenses:
|
119
|
+
- MIT
|
120
|
+
post_install_message:
|
121
|
+
rdoc_options:
|
122
|
+
- --title
|
123
|
+
- bond-yard 0.1.0 Documentation
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
132
|
+
segments:
|
133
|
+
- 0
|
134
|
+
version: "0"
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
hash: 23
|
141
|
+
segments:
|
142
|
+
- 1
|
143
|
+
- 3
|
144
|
+
- 6
|
145
|
+
version: 1.3.6
|
146
|
+
requirements: []
|
147
|
+
|
148
|
+
rubyforge_project: tagaholic
|
149
|
+
rubygems_version: 1.3.7
|
150
|
+
signing_key:
|
151
|
+
specification_version: 3
|
152
|
+
summary: Generate completions from yard docs
|
153
|
+
test_files: []
|
154
|
+
|