doxyparser 1.2
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.
- checksums.yaml +7 -0
- data/MIT_LICENSE +19 -0
- data/README.md +271 -0
- data/lib/doxyparser.rb +75 -0
- data/lib/nodes/class.rb +13 -0
- data/lib/nodes/compound.rb +42 -0
- data/lib/nodes/enum.rb +20 -0
- data/lib/nodes/friend.rb +20 -0
- data/lib/nodes/function.rb +54 -0
- data/lib/nodes/group.rb +6 -0
- data/lib/nodes/hfile.rb +73 -0
- data/lib/nodes/member.rb +61 -0
- data/lib/nodes/namespace.rb +66 -0
- data/lib/nodes/node.rb +63 -0
- data/lib/nodes/param.rb +34 -0
- data/lib/nodes/struct.rb +89 -0
- data/lib/nodes/type.rb +29 -0
- data/lib/nodes/typedef.rb +6 -0
- data/lib/nodes/variable.rb +6 -0
- data/lib/util.rb +69 -0
- data/spec/class_spec.rb +166 -0
- data/spec/custom_spec_helper.rb +21 -0
- data/spec/doxyparser_spec.rb +23 -0
- data/spec/enum_spec.rb +18 -0
- data/spec/file_spec.rb +108 -0
- data/spec/method_spec.rb +86 -0
- data/spec/namespace_spec.rb +165 -0
- data/spec/type_spec.rb +34 -0
- metadata +83 -0
data/lib/nodes/friend.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Friend < Member
|
4
|
+
|
5
|
+
def is_class?
|
6
|
+
args.nil? || args == ""
|
7
|
+
end
|
8
|
+
|
9
|
+
def is_qualified?
|
10
|
+
basename.include? '::'
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def find_name
|
16
|
+
@basename = @node.xpath("name")[0].child.content
|
17
|
+
@parent.name + '::' + @basename
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Function < Member
|
4
|
+
|
5
|
+
def == another
|
6
|
+
super
|
7
|
+
self.args == another.args
|
8
|
+
end
|
9
|
+
|
10
|
+
def eql? another
|
11
|
+
super
|
12
|
+
self.args == another.args
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_str
|
16
|
+
super + @args
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
super + @args
|
21
|
+
end
|
22
|
+
|
23
|
+
def constructor?
|
24
|
+
@basename==parent.basename
|
25
|
+
end
|
26
|
+
|
27
|
+
def destructor?
|
28
|
+
@basename.start_with? %Q{~}
|
29
|
+
end
|
30
|
+
|
31
|
+
def getter_for
|
32
|
+
if @params.empty? || (@params.size == 1 && @params[0].type.name =~ /\s*void\s*/)
|
33
|
+
if @basename.start_with?('get') || @basename.start_with?('Get')
|
34
|
+
return @basename.gsub(/get[_]?(\w)/i){|match| $1.downcase}
|
35
|
+
end
|
36
|
+
if @type.name == 'bool'
|
37
|
+
if @basename.start_with?('is') || @basename.start_with?('Is')
|
38
|
+
return @basename.gsub(/is[_]?(\w)/i){|match| $1.downcase}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def setter_for
|
46
|
+
if @type.name == 'void'
|
47
|
+
if @basename.start_with?('set') || @basename.start_with?('Set')
|
48
|
+
return @basename.gsub(/set[_]?(\w)/i){|match| $1.downcase}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/nodes/group.rb
ADDED
data/lib/nodes/hfile.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class HFile < Compound
|
4
|
+
|
5
|
+
def list_included
|
6
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/includes})
|
7
|
+
lst.map { |f| f.child.content }
|
8
|
+
end
|
9
|
+
|
10
|
+
def list_including
|
11
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/includedby})
|
12
|
+
lst.map { |f| f[:refid].nil? ? f.child.content : escape_file_name(f[:refid]) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def files_included
|
16
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/includes[@local="yes"]})
|
17
|
+
lst.map { |f| Doxyparser::HFile.new(dir: @dir, node: f) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def files_including
|
21
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/includedby[@local="yes"]})
|
22
|
+
lst.map { |f| Doxyparser::HFile.new(dir: @dir, node: f) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def structs
|
26
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
|
27
|
+
lst = lst.select { |c| c["refid"].start_with?("struct") }
|
28
|
+
lst.map { |node| Doxyparser::Struct.new(dir: @dir, node: node) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def classes
|
32
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
|
33
|
+
lst = lst.select { |c| c["refid"].start_with?("class") }
|
34
|
+
lst.map { |node| Doxyparser::Class.new(dir: @dir, node: node) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def namespaces
|
38
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innernamespace})
|
39
|
+
lst.map { |node| Doxyparser::Namespace.new(dir: @dir, node: node) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def functions
|
43
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="func"]/memberdef[@kind="function"]})
|
44
|
+
lst.map { |node| Doxyparser::Function.new(parent: self, node: node) }
|
45
|
+
end
|
46
|
+
|
47
|
+
def variables
|
48
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="var"]/memberdef[@kind="variable"]})
|
49
|
+
lst.map { |node| Doxyparser::Variable.new(parent: self, node: node) }
|
50
|
+
end
|
51
|
+
|
52
|
+
def enums
|
53
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="enum"]/memberdef[@kind="enum"]})
|
54
|
+
lst.map { |node| Doxyparser::Enum.new(parent: self, node: node) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def typedefs
|
58
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="typedef"]/memberdef[@kind="typedef"]})
|
59
|
+
lst.map { |node| Doxyparser::Typedef.new(parent: self, node: node) }
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def find_name
|
65
|
+
escape_file_name self.refid
|
66
|
+
end
|
67
|
+
|
68
|
+
def compute_path
|
69
|
+
aux= escape_file_name @name
|
70
|
+
@xml_path = %Q{#{@dir}/#{aux}.xml}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/nodes/member.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Member < Node
|
4
|
+
|
5
|
+
attr_reader :location
|
6
|
+
attr_reader :definition
|
7
|
+
attr_reader :args
|
8
|
+
attr_reader :type
|
9
|
+
attr_reader :static
|
10
|
+
attr_reader :params
|
11
|
+
|
12
|
+
def file
|
13
|
+
HFile.new(:name => @filename, :dir => @dir)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def init_attributes
|
19
|
+
super
|
20
|
+
raise "No XML node was associated to this member" if @node.nil?
|
21
|
+
@xml_path=parent.xml_path
|
22
|
+
if @node['static']
|
23
|
+
@static = (@node['static'] == 'yes') ? 'static' : nil
|
24
|
+
end
|
25
|
+
aux= self.xpath("location")[0]
|
26
|
+
@filename=File.basename(aux["file"])
|
27
|
+
@location="#{aux["file"]}:#{aux["line"]}"
|
28
|
+
temp=self.xpath("definition")
|
29
|
+
if temp == nil || temp.empty? || temp[0].child==nil
|
30
|
+
@definition = ""
|
31
|
+
else
|
32
|
+
@definition = temp[0].child.content
|
33
|
+
end
|
34
|
+
temp = self.xpath("argsstring")
|
35
|
+
if temp == nil || temp.empty? || temp[0].child==nil
|
36
|
+
@args = ""
|
37
|
+
else
|
38
|
+
@args = temp[0].child.content
|
39
|
+
end
|
40
|
+
@type = find_type @node
|
41
|
+
|
42
|
+
@params=[]
|
43
|
+
all_params= self.xpath("param")
|
44
|
+
return if all_params == nil || all_params.empty? || all_params[0].child==nil
|
45
|
+
|
46
|
+
all_params.each { |param|
|
47
|
+
@params << Doxyparser::Param.new(node: param, parent: self, name: 'param''param')
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def find_name
|
52
|
+
@parent.name + '::' + @node.xpath("name")[0].child.content
|
53
|
+
end
|
54
|
+
|
55
|
+
def find_type n
|
56
|
+
type = n.xpath("type")
|
57
|
+
return "" if type.nil? || type.empty? || type[0].child==nil
|
58
|
+
Type.new node: type[0], dir: @dir
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Namespace < Compound
|
4
|
+
|
5
|
+
def functions filter=nil
|
6
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="func"]/memberdef[@kind="function"]})
|
7
|
+
do_filter(filter, lst, Doxyparser::Function) { |node|
|
8
|
+
node.xpath("name")[0].child.content.strip
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def enums filter=nil
|
13
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="enum"]/memberdef[@kind="enum"]})
|
14
|
+
filter.map!{ |exp| exp =~ /^_Enum/ ? /@\d*/ : exp} unless filter.nil?
|
15
|
+
do_filter(filter, lst, Doxyparser::Enum) { |node|
|
16
|
+
node.xpath("name")[0].child.content.strip
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def variables filter=nil
|
21
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="var"]/memberdef[@kind="variable"]})
|
22
|
+
do_filter(filter, lst, Doxyparser::Variable) { |node|
|
23
|
+
node.xpath("name")[0].child.content.strip
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def typedefs filter=nil
|
28
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="typedef"]/memberdef[@kind="typedef"]})
|
29
|
+
do_filter(filter, lst, Doxyparser::Typedef) { |node| del_spaces node.xpath("name")[0].child.content }
|
30
|
+
end
|
31
|
+
|
32
|
+
def innernamespaces filter=nil
|
33
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innernamespace})
|
34
|
+
do_filter(filter, lst, Doxyparser::Namespace) { |node|
|
35
|
+
del_spaces del_prefix(node.child.content)
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def structs filter=nil
|
40
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
|
41
|
+
lst = lst.select { |c| c["refid"].start_with?("struct") }
|
42
|
+
do_filter(filter, lst, Doxyparser::Struct) { |node|
|
43
|
+
del_spaces del_prefix(node.child.content)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
def classes filter=nil
|
48
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
|
49
|
+
lst = lst.select { |c| c["refid"].start_with?("class") }
|
50
|
+
do_filter(filter, lst, Doxyparser::Class) { |node|
|
51
|
+
del_spaces del_prefix(node.child.content)
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def file
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def compute_path
|
62
|
+
aux = escape_class_name(@name)
|
63
|
+
@xml_path = %Q{#{@dir}/namespace#{aux}.xml}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/nodes/node.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Node
|
4
|
+
include Doxyparser::Util
|
5
|
+
|
6
|
+
attr_reader :dir
|
7
|
+
attr_reader :name
|
8
|
+
attr_reader :basename
|
9
|
+
attr_reader :node
|
10
|
+
attr_reader :doc
|
11
|
+
attr_reader :parent
|
12
|
+
|
13
|
+
def == another
|
14
|
+
self.name == another.name
|
15
|
+
end
|
16
|
+
|
17
|
+
def eql? another
|
18
|
+
self.name == another.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_str
|
22
|
+
@name
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
@name
|
27
|
+
end
|
28
|
+
|
29
|
+
# Takes a hash as input with following keys: :node, :parent, :dir, :name
|
30
|
+
def initialize hash
|
31
|
+
@dir = hash[:dir]
|
32
|
+
@name = hash[:name]
|
33
|
+
if hash[:node] # If a reference to an xml declaration (node) is given then...
|
34
|
+
@node = hash[:node]
|
35
|
+
@parent = hash[:parent]
|
36
|
+
@name = find_name
|
37
|
+
@dir ||= @parent.dir unless @parent.nil?
|
38
|
+
end
|
39
|
+
raise "No name given for node: #{self.class.name}" unless @name
|
40
|
+
raise "No xml directory given for node: #{self.class.name}" unless @dir
|
41
|
+
init_attributes
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def method_missing sym, *args
|
47
|
+
if @node.respond_to? sym
|
48
|
+
@node.send(sym, *args)
|
49
|
+
else
|
50
|
+
@node[sym.to_s] || super
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def init_attributes
|
55
|
+
@basename ||= del_prefix @name
|
56
|
+
end
|
57
|
+
|
58
|
+
def find_name
|
59
|
+
# For Inheritance
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/nodes/param.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Param < Node
|
4
|
+
|
5
|
+
attr_reader :type
|
6
|
+
attr_reader :declname
|
7
|
+
attr_reader :value
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def find_name
|
12
|
+
'param' # Default name if nothing else
|
13
|
+
end
|
14
|
+
|
15
|
+
def init_attributes
|
16
|
+
type_temp = @node.xpath("type")
|
17
|
+
return if type_temp.nil? || type_temp.empty?
|
18
|
+
@type = Type.new node: type_temp[0], parent: @parent
|
19
|
+
@name = @type.name
|
20
|
+
|
21
|
+
declname_temp = @node.xpath("declname")
|
22
|
+
return if declname_temp.nil? || declname_temp.empty?
|
23
|
+
@declname = declname_temp[0].content
|
24
|
+
|
25
|
+
@name += @declname
|
26
|
+
|
27
|
+
@basename = @declname
|
28
|
+
|
29
|
+
value_temp = @node.xpath("defval")
|
30
|
+
return if value_temp.nil? || value_temp.empty?
|
31
|
+
@value = value_temp[0].content
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/nodes/struct.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
module Doxyparser
|
2
|
+
|
3
|
+
class Struct < Compound
|
4
|
+
|
5
|
+
def file
|
6
|
+
n=doc.xpath("/doxygen/compounddef/includes")[0]
|
7
|
+
raise "#{self.name} #{self.class.name} does not have correctly generated documentation. Use 'EXTRACT_ALL' Doxygen flag" unless n
|
8
|
+
HFile.new(dir: @dir, node: n)
|
9
|
+
end
|
10
|
+
|
11
|
+
def friends
|
12
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="friend"]/memberdef[@kind="friend"]})
|
13
|
+
lst.map { |node|
|
14
|
+
Doxyparser::Friend.new(parent: self, node: node)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def template_params
|
19
|
+
params=doc.xpath(%Q{/doxygen/compounddef/templateparamlist/param})
|
20
|
+
params.map { |param|
|
21
|
+
Doxyparser::Param.new(parent: self, node: param)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def methods access=:public, static=nil, filter=nil
|
26
|
+
if static.nil?
|
27
|
+
static="-"
|
28
|
+
else
|
29
|
+
static="-static-"
|
30
|
+
end
|
31
|
+
sectiondef=%Q{#{access}#{static}func}
|
32
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="function"][@prot="#{access}"]})
|
33
|
+
do_filter(filter, lst, Doxyparser::Function) { |node|
|
34
|
+
node.xpath("name")[0].child.content
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def attributes access=:public, static=nil, filter=nil
|
39
|
+
if static.nil?
|
40
|
+
static="-"
|
41
|
+
else
|
42
|
+
static="-static-"
|
43
|
+
end
|
44
|
+
sectiondef=%Q{#{access}#{static}attrib}
|
45
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="variable"][@prot="#{access}"]})
|
46
|
+
do_filter(filter, lst, Doxyparser::Variable) { |node|
|
47
|
+
node.xpath("name")[0].child.content
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def innerclasses access=:public, filter=nil
|
52
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass[@prot="#{access}"]})
|
53
|
+
lst = lst.select { |c| c["refid"].start_with?("class") }
|
54
|
+
do_filter(filter, lst, Doxyparser::Class) { |node|
|
55
|
+
del_prefix(node.child.content)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def innerstructs access=:public, filter=nil
|
60
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/innerclass[@prot="#{access}"]})
|
61
|
+
lst = lst.select { |c| c["refid"].start_with?("struct") }
|
62
|
+
do_filter(filter, lst, Doxyparser::Struct) { |node|
|
63
|
+
del_prefix(node.child.content)
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def innerenums access=:public, filter=nil
|
68
|
+
sectiondef=%Q{#{access}-type}
|
69
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="enum"][@prot="#{access}"]})
|
70
|
+
filter.map!{ |exp| exp =~ /^_Enum/ ? /@\d*/ : exp} unless filter.nil?
|
71
|
+
do_filter(filter, lst, Doxyparser::Enum) { |node|
|
72
|
+
node.xpath("name")[0].child.content
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def typedefs access=:public, filter=nil
|
77
|
+
sectiondef=%Q{#{access}-type}
|
78
|
+
lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="typedef"][@prot="#{access}"]})
|
79
|
+
do_filter(filter, lst, Doxyparser::Typedef) { |node| del_spaces node.xpath("name")[0].child.content }
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def compute_path
|
85
|
+
aux = escape_class_name @name
|
86
|
+
@xml_path = %Q{#{@dir}/struct#{aux}.xml}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|