yard 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of yard might be problematic. Click here for more details.

Files changed (46) hide show
  1. data/ChangeLog +131 -0
  2. data/README.md +16 -12
  3. data/Rakefile +2 -1
  4. data/docs/GettingStarted.md +1 -107
  5. data/docs/Tags.md +250 -53
  6. data/docs/WhatsNew.md +13 -0
  7. data/lib/rubygems_plugin.rb +18 -17
  8. data/lib/yard.rb +1 -1
  9. data/lib/yard/autoload.rb +4 -0
  10. data/lib/yard/cli/yardoc.rb +5 -4
  11. data/lib/yard/cli/yri.rb +18 -3
  12. data/lib/yard/code_objects/base.rb +5 -4
  13. data/lib/yard/code_objects/class_object.rb +1 -1
  14. data/lib/yard/code_objects/constant_object.rb +1 -1
  15. data/lib/yard/code_objects/method_object.rb +3 -2
  16. data/lib/yard/code_objects/namespace_object.rb +3 -3
  17. data/lib/yard/code_objects/proxy.rb +4 -0
  18. data/lib/yard/docstring.rb +3 -2
  19. data/lib/yard/handlers/base.rb +1 -1
  20. data/lib/yard/handlers/ruby/class_condition_handler.rb +5 -1
  21. data/lib/yard/handlers/ruby/class_handler.rb +41 -1
  22. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +5 -1
  23. data/lib/yard/handlers/ruby/legacy/class_handler.rb +44 -0
  24. data/lib/yard/handlers/ruby/struct_handler_methods.rb +128 -0
  25. data/lib/yard/parser/base.rb +55 -0
  26. data/lib/yard/parser/c_parser.rb +5 -1
  27. data/lib/yard/parser/ruby/ast_node.rb +4 -4
  28. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +26 -0
  29. data/lib/yard/parser/ruby/legacy/statement_list.rb +0 -4
  30. data/lib/yard/parser/ruby/ruby_parser.rb +45 -2
  31. data/lib/yard/parser/source_parser.rb +69 -45
  32. data/lib/yard/serializers/file_system_serializer.rb +1 -1
  33. data/lib/yard/tags/default_factory.rb +1 -13
  34. data/lib/yard/tags/library.rb +3 -1
  35. data/lib/yard/templates/erb_cache.rb +5 -2
  36. data/lib/yard/templates/helpers/html_helper.rb +1 -0
  37. data/lib/yard/templates/template.rb +2 -1
  38. data/spec/cli/yardoc_spec.rb +6 -6
  39. data/spec/handlers/class_condition_handler_spec.rb +11 -0
  40. data/spec/handlers/class_handler_spec.rb +121 -0
  41. data/spec/handlers/examples/class_handler_001.rb.txt +19 -0
  42. data/spec/parser/base_spec.rb +25 -0
  43. data/spec/parser/source_parser_spec.rb +63 -0
  44. data/templates/default/layout/html/setup.rb +1 -1
  45. data/templates/default/tags/html/option.erb +1 -1
  46. metadata +21 -5
@@ -43,7 +43,7 @@ module YARD
43
43
  objname += '_' + object.scope.to_s[0,1] if object.is_a?(CodeObjects::MethodObject)
44
44
  fspath = [objname + (extension.empty? ? '' : ".#{extension}")]
45
45
  if object.namespace && object.namespace.path != ""
46
- fspath.unshift *object.namespace.path.split(CodeObjects::NSEP)
46
+ fspath.unshift(*object.namespace.path.split(CodeObjects::NSEP))
47
47
  end
48
48
 
49
49
  # Don't change the filenames, it just makes it more complicated
@@ -85,19 +85,7 @@ module YARD
85
85
  def extract_name_from_text(text)
86
86
  text.strip.split(/\s+/, 2)
87
87
  end
88
-
89
- ##
90
- # Extracts the type signatures and optional name from the raw tag text
91
- #
92
- # @param [String] text the raw tag text
93
- # @return [Array] an array holding the value as the first element and
94
- # the array of types as the second element
95
- def extract_types_and_name_from_text(text)
96
- text = text.strip
97
- types, range, name = *parse_types(text)
98
- [name, types, (range ? text[(range.end+1)..-1].strip : text)]
99
- end
100
-
88
+
101
89
  def extract_title_and_desc_from_text(text)
102
90
  title, desc = nil, nil
103
91
  if text =~ /\A[ \t]\n/
@@ -44,7 +44,6 @@ module YARD
44
44
  class Library
45
45
  class << self
46
46
  attr_reader :labels
47
- attr_accessor :default_factory
48
47
 
49
48
  def instance
50
49
  @instance ||= new
@@ -150,6 +149,9 @@ module YARD
150
149
  define_tag "Overloads", :overload, OverloadTag
151
150
  define_tag "Private", :private
152
151
  define_tag "Abstract", :abstract
152
+ define_tag "Attribute", :attr, :with_types_and_name
153
+ define_tag "Attribute Getter", :attr_reader, :with_types_and_name
154
+ define_tag "Attribute Setter", :attr_writer, :with_types_and_name
153
155
  end
154
156
  end
155
157
  end
@@ -1,11 +1,14 @@
1
1
  module YARD
2
2
  module Templates
3
3
  module ErbCache
4
- def self.method_for(filename)
4
+ def self.method_for(filename, &block)
5
5
  @methods ||= {}
6
6
  return @methods[filename] if @methods[filename]
7
7
  @methods[filename] = name = "_erb_cache_#{@methods.size}"
8
- module_eval "def #{name}; #{yield.src.gsub(/\A#coding:.*$/, '')}; end", filename
8
+ erb = yield.src
9
+ encoding = erb[/\A(#coding:.*\r?\n)/, 1] || ''
10
+ module_eval "#{encoding}def #{name}; #{erb}; end", filename
11
+
9
12
  name
10
13
  end
11
14
 
@@ -73,6 +73,7 @@ module YARD
73
73
  html = fix_typewriter(html)
74
74
  end
75
75
 
76
+ html.force_encoding(Encoding.default_external) if RUBY19
76
77
  html = resolve_links(html)
77
78
  html = html.gsub(/<pre>(?:\s*<code>)?(.+?)(?:<\/code>\s*)?<\/pre>/m) do
78
79
  str = $1
@@ -3,7 +3,8 @@ require 'erb'
3
3
  module YARD
4
4
  module Templates
5
5
  module Template
6
- attr_accessor :class, :options, :subsections, :section
6
+ attr_accessor :class, :section
7
+ attr_reader :options, :subsections
7
8
 
8
9
  class << self
9
10
  # @return [Array<Module>] a list of modules to be automatically included
@@ -31,7 +31,7 @@ describe YARD::CLI::Yardoc do
31
31
  end
32
32
 
33
33
  it "should search for and use yardopts file specified by #options_file" do
34
- IO.should_receive(:read).with("test").and_return("-o \n\nMYPATH\nFILE1 FILE2")
34
+ File.should_receive(:read_binary).with("test").and_return("-o \n\nMYPATH\nFILE1 FILE2")
35
35
  @yardoc.stub!(:support_rdoc_document_file!).and_return([])
36
36
  @yardoc.options_file = "test"
37
37
  @yardoc.run
@@ -41,15 +41,15 @@ describe YARD::CLI::Yardoc do
41
41
 
42
42
  it "should use String#shell_split to split .yardopts tokens" do
43
43
  optsdata = "foo bar"
44
- optsdata.should_receive(:shell_split).and_return([optsdata])
45
- IO.should_receive(:read).with("test").and_return(optsdata)
44
+ optsdata.should_receive(:shell_split)
45
+ File.should_receive(:read_binary).with("test").and_return(optsdata)
46
46
  @yardoc.stub!(:support_rdoc_document_file!).and_return([])
47
47
  @yardoc.options_file = "test"
48
48
  @yardoc.run
49
49
  end
50
50
 
51
51
  it "should allow --title to have multiple spaces in .yardopts" do
52
- IO.should_receive(:read).with("test").and_return("--title \"Foo Bar\"")
52
+ File.should_receive(:read_binary).with("test").and_return("--title \"Foo Bar\"")
53
53
  @yardoc.stub!(:support_rdoc_document_file!).and_return([])
54
54
  @yardoc.options_file = "test"
55
55
  @yardoc.run
@@ -57,7 +57,7 @@ describe YARD::CLI::Yardoc do
57
57
  end
58
58
 
59
59
  it "should allow opts specified in command line to override yardopts file" do
60
- IO.should_receive(:read).with(".yardopts").and_return("-o NOTMYPATH")
60
+ File.should_receive(:read_binary).with(".yardopts").and_return("-o NOTMYPATH")
61
61
  @yardoc.stub!(:support_rdoc_document_file!).and_return([])
62
62
  @yardoc.run("-o", "MYPATH", "FILE")
63
63
  @yardoc.options[:serializer].options[:basepath].should == :MYPATH
@@ -65,7 +65,7 @@ describe YARD::CLI::Yardoc do
65
65
  end
66
66
 
67
67
  it "should load the RDoc .document file if found" do
68
- IO.should_receive(:read).with(".yardopts").and_return("-o NOTMYPATH")
68
+ File.should_receive(:read_binary).with(".yardopts").and_return("-o NOTMYPATH")
69
69
  @yardoc.stub!(:support_rdoc_document_file!).and_return(["FILE2", "FILE3"])
70
70
  @yardoc.run("-o", "MYPATH", "FILE1")
71
71
  @yardoc.options[:serializer].options[:basepath].should == :MYPATH
@@ -43,4 +43,15 @@ describe "YARD::Handlers::Ruby::#{RUBY18 ? "Legacy::" : ""}ClassConditionHandler
43
43
  it "should only parse else block if condition is literal integer == 0" do
44
44
  verify_method :n
45
45
  end
46
+
47
+ it "should not fail on complex conditions" do
48
+ lambda { YARD.parse_string("if defined?(A) && defined?(B); puts 'hi' end") }.should_not raise_error
49
+ lambda do
50
+ YARD.parse_string(<<-eof)
51
+ (<<-TEST) unless defined?(ABCD_MODEL_TEST)
52
+ 'String'
53
+ TEST
54
+ eof
55
+ end.should_not raise_error
56
+ end
46
57
  end
@@ -109,4 +109,125 @@ describe "YARD::Handlers::Ruby::#{RUBY18 ? "Legacy::" : ""}ClassHandler" do
109
109
  it "should not overwrite docstring with an empty one" do
110
110
  Registry.at(:Zebra).docstring.should == "Docstring 2"
111
111
  end
112
+
113
+ it "should turn 'class Const < Struct.new(:sym)' into class Const with attr :sym" do
114
+ obj = Registry.at("Point")
115
+ obj.should be_kind_of(CodeObjects::ClassObject)
116
+ attrs = obj.attributes[:instance]
117
+ [:x, :y, :z].each do |key|
118
+ attrs.should have_key(key)
119
+ attrs[key][:read].should_not be_nil
120
+ attrs[key][:write].should_not be_nil
121
+ end
122
+ end
123
+
124
+ it "should turn 'class Const < Struct.new('Name', :sym)' into class Const with attr :sym" do
125
+ obj = Registry.at("AnotherPoint")
126
+ obj.should be_kind_of(CodeObjects::ClassObject)
127
+ attrs = obj.attributes[:instance]
128
+ [:a, :b, :c].each do |key|
129
+ attrs.should have_key(key)
130
+ attrs[key][:read].should_not be_nil
131
+ attrs[key][:write].should_not be_nil
132
+ end
133
+
134
+ Registry.at("XPoint").should be_nil
135
+ end
136
+
137
+ it "should create a Struct::Name class when class Const < Struct.new('Name', :sym) is found" do
138
+ obj = Registry.at("Struct::XPoint")
139
+ obj.should_not be_nil
140
+ end
141
+
142
+ it "should attach attribtues to the generated Struct::Name class when Struct.new('Name') is used" do
143
+ obj = Registry.at("Struct::XPoint")
144
+ attrs = obj.attributes[:instance]
145
+ [:a, :b, :c].each do |key|
146
+ attrs.should have_key(key)
147
+ attrs[key][:read].should_not be_nil
148
+ attrs[key][:write].should_not be_nil
149
+ end
150
+ end
151
+
152
+ it "should use @attr to set attribute descriptions on Struct subclasses" do
153
+ obj = Registry.at("DoccedStruct#input")
154
+ obj.docstring.should == "the input stream"
155
+ end
156
+
157
+ it "should use @attr to set attribute types on Struct subclasses" do
158
+ obj = Registry.at("DoccedStruct#someproc")
159
+ obj.should_not be_nil
160
+ obj.tag(:return).should_not be_nil
161
+ obj.tag(:return).types.should == ["Proc", "#call"]
162
+ end
163
+
164
+ it "should default types unspecified by @attr to Object on Struct subclasses" do
165
+ obj = Registry.at("DoccedStruct#mode")
166
+ obj.should_not be_nil
167
+ obj.tag(:return).should_not be_nil
168
+ obj.tag(:return).types.should == ["Object"]
169
+ end
170
+
171
+ it "should create parameters for writers of Struct subclass's attributes" do
172
+ obj = Registry.at("DoccedStruct#input=")
173
+ obj.tags(:param).size.should == 1
174
+ obj.tag(:param).types.should == ["IO"]
175
+ end
176
+
177
+ it "defines both readers and writers when @attr is used on Structs" do
178
+ obj = Registry.at("SemiDoccedStruct")
179
+ attrs = obj.attributes[:instance]
180
+ attrs[:first][:read].should_not be_nil
181
+ attrs[:first][:write].should_not be_nil
182
+ end
183
+
184
+ it "defines only a reader when only @attr_reader is used on Structs" do
185
+ obj = Registry.at("SemiDoccedStruct")
186
+ attrs = obj.attributes[:instance]
187
+ attrs[:second][:read].should_not be_nil
188
+ attrs[:second][:write].should be_nil
189
+ end
190
+
191
+ it "defines only a writer when only @attr_writer is used on Structs" do
192
+ obj = Registry.at("SemiDoccedStruct")
193
+ attrs = obj.attributes[:instance]
194
+ attrs[:third][:read].should be_nil
195
+ attrs[:third][:write].should_not be_nil
196
+ end
197
+
198
+ it "defines a reader with correct return types when @attr_reader is used on Structs" do
199
+ obj = Registry.at("SemiDoccedStruct#second")
200
+ obj.tag(:return).types.should == ["Fixnum"]
201
+ end
202
+
203
+ it "defines a writer with correct parameter types when @attr_writer is used on Structs" do
204
+ obj = Registry.at("SemiDoccedStruct#third=")
205
+ obj.tag(:param).types.should == ["Array"]
206
+ end
207
+
208
+ it "defines a reader and a writer when both @attr_reader and @attr_writer are used" do
209
+ obj = Registry.at("SemiDoccedStruct")
210
+ attrs = obj.attributes[:instance]
211
+ attrs[:fourth][:read].should_not be_nil
212
+ attrs[:fourth][:write].should_not be_nil
213
+ end
214
+
215
+ it "uses @attr_reader for the getter when both @attr_reader and @attr_writer are given" do
216
+ obj = Registry.at("SemiDoccedStruct#fourth")
217
+ obj.tag(:return).types.should == ["#read"]
218
+ end
219
+
220
+ it "uses @attr_writer for the setter when both @attr_reader and @attr_writer are given" do
221
+ obj = Registry.at("SemiDoccedStruct#fourth=")
222
+ obj.tag(:param).types.should == ["IO"]
223
+ end
224
+
225
+ it "extracts text from @attr_reader" do
226
+ Registry.at("SemiDoccedStruct#fourth").docstring.should == "returns a proc that reads"
227
+ end
228
+
229
+ it "extracts text from @attr_writer" do
230
+ Registry.at("SemiDoccedStruct#fourth=").docstring.should == "sets the proc that writes stuff"
231
+ end
232
+
112
233
  end
@@ -83,3 +83,22 @@ end
83
83
  class Zebra
84
84
  end
85
85
 
86
+ class Point < Struct.new(:x, :y, :z)
87
+ end
88
+
89
+ class AnotherPoint < Struct.new('XPoint', :a, :b, :c, :description)
90
+ end
91
+
92
+ # @attr [IO] input the input stream
93
+ # @attr mode the mode to read
94
+ # @attr [Proc, #call] someproc the proc to run
95
+ class DoccedStruct < Struct.new(:input, :mode, :someproc)
96
+ end
97
+
98
+ # @attr [String] first the first entry
99
+ # @attr_reader [Fixnum] second this only has a reader
100
+ # @attr_writer [Array] third this only has a writer
101
+ # @attr_reader [#read] fourth returns a proc that reads
102
+ # @attr_writer [IO] fourth sets the proc that writes stuff
103
+ class SemiDoccedStruct < Struct.new(:first, :second, :third, :fourth)
104
+ end
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe YARD::Parser::Base do
4
+ describe '#initialize' do
5
+ before do
6
+ class MyParser < Parser::Base; def initialize(a, b) end end
7
+ end
8
+
9
+ it "should take 2 arguments" do
10
+ lambda { Parser::Base.new }.should raise_error(ArgumentError, /wrong number of arguments/)
11
+ end
12
+
13
+ it "should raise NotImplementedError on #initialize" do
14
+ lambda { Parser::Base.new('a', 'b') }.should raise_error(NotImplementedError)
15
+ end
16
+
17
+ it "should raise NotImplementedError on #parse" do
18
+ lambda { MyParser.new('a', 'b').parse }.should raise_error(NotImplementedError)
19
+ end
20
+
21
+ it "should raise NotImplementedError on #tokenize" do
22
+ lambda { MyParser.new('a', 'b').tokenize }.should raise_error(NotImplementedError)
23
+ end
24
+ end
25
+ end
@@ -1,10 +1,62 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
+ shared_examples_for "parser type registration" do
4
+ before do
5
+ class MyParser < Parser::Base; end
6
+ end
7
+
8
+ after do
9
+ Parser::SourceParser.parser_types.delete(:my_parser)
10
+ Parser::SourceParser.parser_type_extensions.delete(:my_parser)
11
+ end
12
+ end
13
+
3
14
  describe YARD::Parser::SourceParser do
4
15
  before do
5
16
  Registry.clear
6
17
  end
7
18
 
19
+ describe '.register_parser_type' do
20
+ it_should_behave_like "parser type registration"
21
+
22
+ it "should register a subclass of Parser::Base" do
23
+ parser = mock(:parser)
24
+ parser.should_receive(:parse)
25
+ MyParser.should_receive(:new).with('content', '(stdin)').and_return(parser)
26
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, 'myparser')
27
+ Parser::SourceParser.parse_string('content', :my_parser)
28
+ end
29
+
30
+ it "should require class to be a subclass of Parser::Base" do
31
+ lambda { Parser::SourceParser.register_parser_type(:my_parser, String) }.should raise_error(ArgumentError)
32
+ lambda { Parser::SourceParser.register_parser_type(:my_parser, Parser::Base) }.should raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ describe '.parser_type_for_extension' do
37
+ it_should_behave_like "parser type registration"
38
+
39
+ it "should find an extension in a registered array of extensions" do
40
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, ['a', 'b', 'd'])
41
+ Parser::SourceParser.parser_type_for_extension('a').should == :my_parser
42
+ Parser::SourceParser.parser_type_for_extension('b').should == :my_parser
43
+ Parser::SourceParser.parser_type_for_extension('d').should == :my_parser
44
+ Parser::SourceParser.parser_type_for_extension('c').should_not == :my_parser
45
+ end
46
+
47
+ it "should find an extension in a Regexp" do
48
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, /abc$/)
49
+ Parser::SourceParser.parser_type_for_extension('dabc').should == :my_parser
50
+ Parser::SourceParser.parser_type_for_extension('dabcd').should_not == :my_parser
51
+ end
52
+
53
+ it "should find an extension in a String" do
54
+ Parser::SourceParser.register_parser_type(:my_parser, MyParser, "abc")
55
+ Parser::SourceParser.parser_type_for_extension('abc').should == :my_parser
56
+ Parser::SourceParser.parser_type_for_extension('abcd').should_not == :my_parser
57
+ end
58
+ end
59
+
8
60
  describe '#parse_string' do
9
61
  it "should parse basic Ruby code" do
10
62
  YARD.parse_string(<<-eof)
@@ -58,6 +110,17 @@ describe YARD::Parser::SourceParser do
58
110
  Registry.at('Hello2#x').docstring.should == "ANOTHER PASS"
59
111
  end
60
112
 
113
+ it "should take preceeding comments only if they exist" do
114
+ YARD.parse_string <<-eof
115
+ # PASS
116
+ module Hello # FAIL
117
+ HELLO
118
+ end
119
+ eof
120
+
121
+ Registry.at(:Hello).docstring.should == "PASS"
122
+ end
123
+
61
124
  it "should handle =begin/=end style comments" do
62
125
  YARD.parse_string "=begin\nfoo\nbar\n=end\nclass Foo; end\n"
63
126
  Registry.at(:Foo).docstring.should == "foo\nbar"
@@ -2,7 +2,7 @@ def init
2
2
  @breadcrumb = []
3
3
 
4
4
  if @file
5
- @contents = File.read_binary(@file)
5
+ @contents = File.read(@file)
6
6
  @file = File.basename(@file)
7
7
  @fname = @file.gsub(/\.[^.]+$/, '')
8
8
  @breadcrumb_title = "File: " + @fname
@@ -6,7 +6,7 @@
6
6
  <ul class="option">
7
7
  <% for tag in tags %>
8
8
  <li>
9
- <span class="type"><%= format_types (tag.pair.types || ['Object']) %></span>
9
+ <span class="type"><%= format_types(tag.pair.types || ['Object']) %></span>
10
10
  <span class="name"><%= tag.pair.name %></span>
11
11
  <span class="default">
12
12
  <% if tag.pair.defaults %>
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ hash: 7
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 5
9
+ - 6
10
+ version: 0.5.6
5
11
  platform: ruby
6
12
  authors:
7
13
  - Loren Segal
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-05-22 00:00:00 -04:00
18
+ date: 2010-06-12 00:00:00 -04:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -96,12 +102,15 @@ files:
96
102
  - lib/yard/handlers/ruby/mixin_handler.rb
97
103
  - lib/yard/handlers/ruby/module_handler.rb
98
104
  - lib/yard/handlers/ruby/process_handler.rb
105
+ - lib/yard/handlers/ruby/struct_handler_methods.rb
99
106
  - lib/yard/handlers/ruby/visibility_handler.rb
100
107
  - lib/yard/handlers/ruby/yield_handler.rb
101
108
  - lib/yard/logging.rb
109
+ - lib/yard/parser/base.rb
102
110
  - lib/yard/parser/c_parser.rb
103
111
  - lib/yard/parser/ruby/ast_node.rb
104
112
  - lib/yard/parser/ruby/legacy/ruby_lex.rb
113
+ - lib/yard/parser/ruby/legacy/ruby_parser.rb
105
114
  - lib/yard/parser/ruby/legacy/statement.rb
106
115
  - lib/yard/parser/ruby/legacy/statement_list.rb
107
116
  - lib/yard/parser/ruby/legacy/token_list.rb
@@ -193,6 +202,7 @@ files:
193
202
  - spec/handlers/spec_helper.rb
194
203
  - spec/handlers/visibility_handler_spec.rb
195
204
  - spec/handlers/yield_handler_spec.rb
205
+ - spec/parser/base_spec.rb
196
206
  - spec/parser/c_parser_spec.rb
197
207
  - spec/parser/examples/array.c.txt
198
208
  - spec/parser/examples/example1.rb.txt
@@ -378,21 +388,27 @@ rdoc_options: []
378
388
  require_paths:
379
389
  - lib
380
390
  required_ruby_version: !ruby/object:Gem::Requirement
391
+ none: false
381
392
  requirements:
382
393
  - - ">="
383
394
  - !ruby/object:Gem::Version
395
+ hash: 3
396
+ segments:
397
+ - 0
384
398
  version: "0"
385
- version:
386
399
  required_rubygems_version: !ruby/object:Gem::Requirement
400
+ none: false
387
401
  requirements:
388
402
  - - ">="
389
403
  - !ruby/object:Gem::Version
404
+ hash: 3
405
+ segments:
406
+ - 0
390
407
  version: "0"
391
- version:
392
408
  requirements: []
393
409
 
394
410
  rubyforge_project: yard
395
- rubygems_version: 1.3.5
411
+ rubygems_version: 1.3.7
396
412
  signing_key:
397
413
  specification_version: 3
398
414
  summary: Documentation tool for consistent and usable documentation in Ruby.