requidef 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.md ADDED
@@ -0,0 +1,13 @@
1
+ # version 0.1.0
2
+ The consequence of 10H rapid developement.
3
+ It had many bugs so we could not use the command after 'gem install'ing.
4
+
5
+ # version 0.2.0
6
+ (Below describes the future which is not happened still.)
7
+ We found that the .rd file is not as easy to edit as we had expected.
8
+ So we decided to edit file in XMind, a free MindMap tool, export it to HTML to translate to .rd file.
9
+ Other features,
10
+ * The commandline I/F is changed.
11
+ * Fixed the reported bugs in 0.1.0.
12
+ * Provides some converter functionality.
13
+ * It is now ready to get started by just gem installing.
data/README.md CHANGED
@@ -1,27 +1,19 @@
1
1
  # requidef
2
- Requiem for the Requirement Definitions.
2
+ Requiem for the boring Requirement Definitions.
3
+ Save time and get back to coding.
3
4
 
4
5
  ## Motivation
5
6
  Do you know the most and the last thing that hinder our technology grow rapidly in this century?
6
7
  The most harmful software, you know that is the MS Office.
7
- We, workers, are forced to write lenghty documents with MS Word, MS Excel ... you know what.
8
+ We, workers, are forced to write ten of thousand of lenghty documents with MS Word, MS Excel ... you know what.
8
9
  I disrespect every single of the softwares MS provides.
9
10
  Today, we declared to be free from these greedy evils.
10
11
 
11
- This software, requidef, will guide you to the haven where any documentation works are happy.
12
+ This software, requidef [r`ekwidef], will guide you to the haven where any documentation works are happy.
12
13
 
13
14
  ## Installation
14
15
  Only for Ruby >= 1.9
15
-
16
- gem install requidef
17
-
18
- ## Recent Releases
19
- - 0.1.0
20
- -- The consequence of 10 hours rapid developement.
21
- - Next : 0.2.0
22
- -- Bug fix. Already found 3
23
- -- impl : tree -> rd
24
- -- impl : http -> tree
16
+ just 'gem install requidef'.
25
17
 
26
18
  ## Contributing to requidef
27
19
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/bin/Makefile CHANGED
@@ -1,11 +1,11 @@
1
1
  sample : dot_sample csv_sample
2
2
 
3
3
  dot_sample :
4
- ruby requidef -t dot -f sample.rd > sample.dot
4
+ requidef --type=dot --file=sample.rd > sample.dot
5
5
  dot -Tjpg sample.dot -o sample.jpg
6
6
 
7
7
  csv_sample :
8
- ruby requidef -t csv -f sample.rd > sample.csv
8
+ requidef -t csv -f sample.rd > sample.csv
9
9
 
10
10
  clean_sample :
11
11
  rm sample.dot sample.csv sample.jpg
data/bin/requidef CHANGED
@@ -15,12 +15,12 @@ end
15
15
  opt = OptionParser.new
16
16
 
17
17
  type = nil
18
- opt.on("-t VAL") do |v|
18
+ opt.on("-t", "--type=VAL") do |v|
19
19
  type = v
20
20
  end
21
21
 
22
22
  input = nil
23
- opt.on("-f VAL") do |v|
23
+ opt.on("-f", "--file=VAL") do |v|
24
24
  input = v
25
25
  end
26
26
  opt.parse!(ARGV)
data/bin/requidef.rb ADDED
@@ -0,0 +1,35 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require "requidef"
4
+ require "optparse"
5
+
6
+ def print_dot(input)
7
+ print dot(input)
8
+ end
9
+
10
+ def print_csv(input)
11
+ print csv(input)
12
+ end
13
+
14
+ # Main
15
+ opt = OptionParser.new
16
+
17
+ type = nil
18
+ opt.on("-t", "--type=VAL") do |v|
19
+ type = v
20
+ end
21
+
22
+ input = nil
23
+ opt.on("-f", "--file=VAL") do |v|
24
+ input = v
25
+ end
26
+ opt.parse!(ARGV)
27
+
28
+ case type
29
+ when "dot"
30
+ print_dot(input)
31
+ when "csv"
32
+ print_csv(input)
33
+ else
34
+ raise "no match on type"
35
+ end
File without changes
@@ -1,13 +1,17 @@
1
1
  require_relative "matrix"
2
2
 
3
- def matrix2csv(matrix, &writer)
3
+ def matrix2csv(matrix, range = [0...matrix.m_size, 0...matrix.n_size], &writer)
4
4
  s = ""
5
- for i in 0...matrix.m_size
5
+ for i in range[0]
6
6
  ms = []
7
- for j in 0...matrix.n_size
7
+ ms_range = range[1]
8
+ for j in ms_range
8
9
  ms[j] = writer.call matrix.get([i,j])
9
10
  end
10
- s += ms.join ","
11
+ # NOTE: The separator of csv file is decisively |
12
+ # I/F to change the charactor is the future work.
13
+ separator = "|"
14
+ s += ms[ms_range].join separator
11
15
  s += "\n" unless i == matrix.m_size - 1
12
16
  end
13
17
  s
File without changes
@@ -5,6 +5,12 @@ class Tree
5
5
  @parents = []
6
6
  end
7
7
 
8
+ def list_depth_traverse(under)
9
+ list = []
10
+ do_list_depth_traverse(under, list)
11
+ return list
12
+ end
13
+
8
14
  def values
9
15
  @values
10
16
  end
@@ -58,6 +64,16 @@ class Tree
58
64
 
59
65
  private
60
66
 
67
+ def do_list_depth_traverse(under, list)
68
+ list << under
69
+ if leaf?(under)
70
+ return
71
+ end
72
+ children(under).each do |id|
73
+ do_list_depth_traverse(id, list)
74
+ end
75
+ end
76
+
61
77
  def register_edge(from, to)
62
78
  if @edges[from] == nil
63
79
  @edges[from] = Array.new
@@ -89,5 +105,5 @@ if __FILE__ == $0
89
105
  puts "children:#{t.children(i)}"
90
106
  end
91
107
 
92
-
108
+ p t.list_depth_traverse(t.root_id)
93
109
  end
File without changes
data/lib/html2rd.rb ADDED
@@ -0,0 +1,43 @@
1
+ # NOTE:
2
+ # HTML from XMind 3.2.1 lets only h1, h2 and h3.
3
+ # So, this code only succeeds if the height of the tree is no more greater than 3.
4
+ # No practical. Must reconsider.
5
+
6
+ require "hpricot"
7
+
8
+ def html2rd(html)
9
+ body = read_body(html)
10
+ regex = /<h(\d).*?>(.*?)<\/h\d>/m
11
+ body.scan(regex).map do |e|
12
+ hx2rd(e)
13
+ end.join("\n")
14
+ end
15
+
16
+ def hx2rd(header)
17
+ depth = header[0].to_i
18
+ s = read_anchor(header[1].strip)
19
+ "#{repeat(depth, "-")} #{s}"
20
+ end
21
+
22
+ def read_anchor(anchor)
23
+ anchor.scan(/<a.*?>(.*?)<\/a>/m)[0][0]
24
+ end
25
+
26
+ def repeat(n, s)
27
+ Array.new(n, s).join
28
+ end
29
+
30
+ def read_body(html)
31
+ doc = Hpricot(open("sample.html"))
32
+ x = ""
33
+ (doc/"body").each do |e|
34
+ x += e.to_html
35
+ end
36
+ x
37
+ end
38
+
39
+ if __FILE__ == $0
40
+ p html2rd("sample.html")
41
+ # p read_body("sample.html")
42
+ # p read_anchor("<a name=\"hoge\">text</a>")
43
+ end
data/lib/mm2rdtree.rb ADDED
@@ -0,0 +1,81 @@
1
+ require "rexml/document"
2
+ require_relative "generic/tree"
3
+ require_relative "rdnode"
4
+
5
+ def mm2tree(mm)
6
+ build_tree(mm)
7
+ end
8
+
9
+ # Doc -> Tree (of Text node class)
10
+ def build_tree(mm)
11
+ t = Tree.new
12
+ doc_root_id = 1
13
+ t.add_node(0, DummyRoot)
14
+ t.add_edge(0, doc_root_id)
15
+ do_build_tree(root_node_of(mm), doc_root_id, 1, t)
16
+ t
17
+ end
18
+
19
+ def do_build_tree(doc, id, depth, t)
20
+ t.add_node( id, to_node(doc, depth) )
21
+ n = doc.elements.size
22
+ for i in 1...n+1
23
+ child_id = id+i
24
+ child_depth = depth + 1
25
+ child_doc = doc.elements[i]
26
+ child_value = to_node( child_doc, child_depth )
27
+ t.add_node( child_id, child_value )
28
+ t.add_edge( id, child_id )
29
+
30
+ do_build_tree( child_doc, child_id, child_depth, t )
31
+ end
32
+ end
33
+
34
+ def to_node(doc, depth)
35
+ text = doc.attributes["TEXT"]
36
+ Text.new(depth, text)
37
+ end
38
+
39
+ def root_node_of(mm)
40
+ f = File.open(mm, "r")
41
+
42
+ txt = f.read
43
+ doc = REXML::Document.new( txt )
44
+
45
+ f.close
46
+ doc.root.elements[1]
47
+ end
48
+
49
+ if __FILE__ == $0
50
+ # p root_node_of("sample.mm")
51
+ p mm2tree("sample.mm")
52
+
53
+ puts "# Test ------------------------"
54
+ include REXML
55
+ f = File.open("sample.mm", "r")
56
+ txt = f.read
57
+
58
+ p txt
59
+ doc = Document.new txt
60
+ p doc
61
+ p doc.size
62
+ p "xx"
63
+ p doc.root.size
64
+ p doc.root.elements.size
65
+ p doc.root.elements[1]
66
+ p doc.root.elements[2]
67
+ p doc.root.elements[3]
68
+
69
+ n = doc.root.elements[1]
70
+ p n.attributes["TEXT"]
71
+
72
+ f.close
73
+
74
+ # Try:
75
+ # doc.size # what means?
76
+ # doc.root #=> Element
77
+ # doc.root.
78
+ # n.attributes[name]
79
+
80
+ puts "# -----------------------------"
81
+ end
@@ -1,4 +1,4 @@
1
- require_relative "node"
1
+ require_relative "rdnode"
2
2
 
3
3
  # rd -> [node]
4
4
  def rd2nodes(file)
data/lib/rd2rdtree.rb ADDED
@@ -0,0 +1,6 @@
1
+ require_relative "rd2rdnodes"
2
+ require_relative "rdnodes2rdtree"
3
+
4
+ def rd2rdtree(rd)
5
+ nodes2tree( rd2nodes(rd) )
6
+ end
@@ -25,6 +25,10 @@ class Link < Node
25
25
  def to_csv
26
26
  ""
27
27
  end
28
+
29
+ def to_rd
30
+ "#{dashes(@depth)} >>#{@dest}"
31
+ end
28
32
  end
29
33
 
30
34
  class Tag < Node
@@ -46,8 +50,13 @@ class Tag < Node
46
50
  def to_desc
47
51
  @text
48
52
  end
53
+
54
+ def to_rd
55
+ "#{dashes(@depth)} [[#{@tag}:#{@text}]]"
56
+ end
49
57
  end
50
58
 
59
+
51
60
  class Text < Node
52
61
  def initialize(depth, text)
53
62
  super(depth)
@@ -65,8 +74,18 @@ class Text < Node
65
74
  def to_desc
66
75
  @text
67
76
  end
77
+
78
+ def to_rd
79
+ "#{dashes(@depth)} #{@text}"
80
+ end
68
81
  end
69
82
 
83
+ def dashes(n)
84
+ Array.new(n, "-").join ""
85
+ end
86
+
87
+ DummyRoot = Text.new(0, "DummyRoot")
88
+
70
89
  if __FILE__ == $0
71
90
  n = Text.new(10, "akira")
72
91
  n.tmp[:x] = 100
@@ -1,5 +1,5 @@
1
- require_relative "tree"
2
- require_relative "node"
1
+ require_relative "generic/tree"
2
+ require_relative "rdnode"
3
3
 
4
4
  def nodes2tree(nodes)
5
5
  nodess = depth2link(nodes)
@@ -17,7 +17,7 @@ def nodes2tree(nodes)
17
17
  end
18
18
 
19
19
  def depth2link(nodes)
20
- nodess = [Text.new(0, "Root")] + nodes
20
+ nodess = [DummyRoot] + nodes
21
21
  nodess.each_with_index do |n, i|
22
22
  n.id = i
23
23
  end
data/lib/rdtree.rb ADDED
@@ -0,0 +1,31 @@
1
+ require_relative "generic/matrix2csv"
2
+ require_relative "generic/tree2matrix"
3
+ require_relative "rdtree2dot"
4
+
5
+ class Tree
6
+
7
+ def to_csv
8
+ m = tree2matrix(self)
9
+
10
+ range = [
11
+ 0...m.m_size,
12
+ 1...m.n_size]
13
+ c = matrix2csv(m, range) do |n|
14
+ s = nil
15
+ if n == nil
16
+ s = ""
17
+ else
18
+ s = n.to_csv
19
+ end
20
+ s
21
+ end
22
+ c
23
+ end
24
+ end
25
+
26
+ require_relative "rd2rdtree"
27
+ if __FILE__ == $0
28
+ t = rd2rdtree("sample.rd")
29
+ puts t.to_csv
30
+ puts t.to_dot
31
+ end
@@ -1,26 +1,7 @@
1
- require_relative "matrix2csv"
2
- require_relative "tree2matrix"
3
- require_relative "node"
1
+ require_relative "generic/tree"
4
2
 
5
3
  class Tree
6
4
 
7
- def to_csv
8
- m = tree2matrix(self)
9
-
10
- # TODO: Link node write the tag it links to.
11
- # Maybe, let Node has ID so we can reach the parent.
12
- c = matrix2csv(m) do |n|
13
- s = nil
14
- if n == nil
15
- s = ""
16
- else
17
- s = n.to_csv
18
- end
19
- s
20
- end
21
- c
22
- end
23
-
24
5
  def to_dot
25
6
  elems = []
26
7
  for i in 0...size
@@ -43,13 +24,18 @@ class Tree
43
24
  elems << dot_edge_desc(i, child) unless link_node?(child)
44
25
  end
45
26
  end
27
+
28
+ # NOTE: The ratio of the output figure is 1 at default.
29
+ # I/F to change the ratio is the future work.
46
30
  """
47
31
  digraph graphname {
32
+ graph [ratio = 1]
48
33
  #{elems.join("\n ")}
49
34
  }
50
35
  """
51
36
  end
52
37
 
38
+ private
53
39
  def dot_node_desc(id)
54
40
  "v#{id} [label=\"#{value(id).to_desc}\"];"
55
41
  end
@@ -91,12 +77,3 @@ digraph graphname {
91
77
  id2id
92
78
  end
93
79
  end
94
-
95
- require_relative "rd2nodes"
96
- require_relative "nodes2tree"
97
- if __FILE__ == $0
98
- t = nodes2tree( rd2nodes("sample.rd") )
99
- p t
100
- p t.to_csv
101
- print t.to_dot
102
- end
data/lib/rdtree2rd.rb ADDED
@@ -0,0 +1,18 @@
1
+ require_relative "generic/tree"
2
+
3
+ class Tree
4
+ def to_rd
5
+ nodes = list_depth_traverse(root_id)
6
+ # NOTE: Eliminate the DummyRoot from rd file.
7
+ nodes.delete(root_id)
8
+ nodes.map do |node|
9
+ value(node).to_rd
10
+ end.join("\n")
11
+ end
12
+ end
13
+
14
+ require_relative "rd2rdtree"
15
+ if __FILE__ == $0
16
+ t = rd2rdtree( "sample.rd" )
17
+ print t.to_rd
18
+ end
data/lib/requidef.rb CHANGED
@@ -1,6 +1,6 @@
1
- require_relative "nodetree"
2
- require_relative "rd2nodes"
3
- require_relative "nodes2tree"
1
+ require_relative "rdtree"
2
+ require_relative "rd2rdnodes"
3
+ require_relative "rdnodes2rdtree"
4
4
 
5
5
  def rd2tree(file)
6
6
  nodes2tree( rd2nodes(file) )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: requidef
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-21 00:00:00.000000000Z
12
+ date: 2011-08-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &25426960 !ruby/object:Gem::Requirement
16
+ requirement: &26055980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.3.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *25426960
24
+ version_requirements: *26055980
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &25426440 !ruby/object:Gem::Requirement
27
+ requirement: &26055500 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *25426440
35
+ version_requirements: *26055500
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &25425880 !ruby/object:Gem::Requirement
38
+ requirement: &26055020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.4
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *25425880
46
+ version_requirements: *26055020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &25425320 !ruby/object:Gem::Requirement
49
+ requirement: &26054540 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,33 +54,42 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *25425320
57
+ version_requirements: *26054540
58
58
  description: Which do you use for your requirement definition job? MS Excel? MS Word?
59
59
  Uninstall them. Because you will get a better solution.
60
60
  email: ruby.wktk@gmail.com
61
61
  executables:
62
62
  - Makefile
63
63
  - requidef
64
+ - requidef.rb
64
65
  - sample.rd
65
66
  extensions: []
66
67
  extra_rdoc_files:
68
+ - ChangeLog.md
67
69
  - LICENSE.txt
68
70
  - README.md
69
71
  files:
70
- - lib/matrix.rb
71
- - lib/matrix2csv.rb
72
- - lib/node.rb
73
- - lib/nodes2tree.rb
74
- - lib/nodetree.rb
75
- - lib/rd2nodes.rb
72
+ - lib/generic/matrix.rb
73
+ - lib/generic/matrix2csv.rb
74
+ - lib/generic/row_of_nodes.rb
75
+ - lib/generic/tree.rb
76
+ - lib/generic/tree2matrix.rb
77
+ - lib/html2rd.rb
78
+ - lib/mm2rdtree.rb
79
+ - lib/rd2rdnodes.rb
80
+ - lib/rd2rdtree.rb
81
+ - lib/rdnode.rb
82
+ - lib/rdnodes2rdtree.rb
83
+ - lib/rdtree.rb
84
+ - lib/rdtree2dot.rb
85
+ - lib/rdtree2rd.rb
76
86
  - lib/requidef.rb
77
- - lib/row_of_nodes.rb
78
- - lib/tree.rb
79
- - lib/tree2matrix.rb
87
+ - ChangeLog.md
80
88
  - LICENSE.txt
81
89
  - README.md
82
90
  - bin/Makefile
83
91
  - bin/requidef
92
+ - bin/requidef.rb
84
93
  - bin/sample.rd
85
94
  homepage: http://github.com/akiradeveloper/requidef
86
95
  licenses:
@@ -97,7 +106,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
106
  version: '0'
98
107
  segments:
99
108
  - 0
100
- hash: 3420236441750194994
109
+ hash: -1372144996746053066
101
110
  required_rubygems_version: !ruby/object:Gem::Requirement
102
111
  none: false
103
112
  requirements: