requidef 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,11 +1,33 @@
1
1
  # requidef
2
+ Requiem for the Requirement Definitions.
2
3
 
3
4
  ## Motivation
5
+ Do you know the most and the last thing that hinder our technology grow rapidly in this century?
6
+ 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
+ I disrespect every single of the softwares MS provides.
9
+ Today, we declared to be free from these greedy evils.
10
+
11
+ This software, requidef, will guide you to the haven where any documentation works are happy.
4
12
 
5
13
  ## Installation
14
+ Only for Ruby >= 1.9
15
+
16
+ gem install requidef
17
+
18
+ or
19
+
20
+ git clone $(this repo) and add path to the bin dir.
21
+
22
+ ## Recent Releases
23
+ - 0.1.0
24
+ -- The consequence of 10 hours rapid developement.
25
+ - Next : 0.2.0
26
+ -- Bug fix. Already found 3
27
+ -- impl : tree -> rd
28
+ -- impl : http -> tree
6
29
 
7
30
  ## Contributing to requidef
8
-
9
31
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
10
32
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
11
33
  * Fork the project
@@ -15,7 +37,5 @@
15
37
  * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
16
38
 
17
39
  ## Copyright
18
-
19
- Copyright (c) 2011 Akira Hayakawa. See LICENSE.txt for
40
+ Copyright (c) 2011 Akira Hayakawa (@akiradeveloper). See LICENSE.txt for
20
41
  further details.
21
-
data/lib/matrix.rb ADDED
@@ -0,0 +1,74 @@
1
+ class Matrix
2
+ def initialize()
3
+ @mat = []
4
+ @n = 0
5
+ end
6
+
7
+ def n_size
8
+ @n
9
+ end
10
+
11
+ def m_size
12
+ @mat.size
13
+ end
14
+
15
+ def set(at, value)
16
+ expand(at)
17
+ i = at[0]
18
+ j = at[1]
19
+ @mat[i][j] = value
20
+ end
21
+
22
+ def get(at)
23
+ i = at[0]
24
+ j = at[1]
25
+ @mat[i][j]
26
+ end
27
+
28
+ def to_s
29
+ p @mat
30
+ # print "["
31
+ # print @mat.join(",\n")
32
+ # print "]\n"
33
+ end
34
+
35
+ private
36
+
37
+ def expand(by)
38
+ _m_size = by[0] + 1
39
+ _n_size = by[1] + 1
40
+
41
+ if _m_size > m_size
42
+ expand_m(_m_size)
43
+ end
44
+
45
+ if _n_size > n_size
46
+ expand_n(_n_size)
47
+ end
48
+
49
+ end
50
+
51
+ def expand_m(to)
52
+ (to-m_size).times do
53
+ @mat << Array.new(n_size)
54
+ end
55
+ end
56
+
57
+ def expand_n(to)
58
+ @mat.each do |x|
59
+ n = x.size
60
+ (to-n).times do
61
+ x << nil
62
+ end
63
+ end
64
+ @n = to
65
+ end
66
+ end
67
+
68
+ if __FILE__ == $0
69
+ m = Matrix.new
70
+ m.set([0,2], "akira")
71
+ puts m
72
+ m.set([2,0], "developer")
73
+ puts m
74
+ end
data/lib/matrix2csv.rb ADDED
@@ -0,0 +1,31 @@
1
+ require_relative "matrix"
2
+
3
+ def matrix2csv(matrix, &writer)
4
+ s = ""
5
+ for i in 0...matrix.m_size
6
+ ms = []
7
+ for j in 0...matrix.n_size
8
+ ms[j] = writer.call matrix.get([i,j])
9
+ end
10
+ s += ms.join ","
11
+ s += "\n" unless i == matrix.m_size - 1
12
+ end
13
+ s
14
+ end
15
+
16
+ if __FILE__ == $0
17
+ m = Matrix.new
18
+ m.set([0,1], "a")
19
+ m.set([1,0], "b")
20
+
21
+ t = matrix2csv(m) do |x|
22
+ s = nil
23
+ if x == nil
24
+ s = ""
25
+ else
26
+ s = x*2
27
+ end
28
+ s
29
+ end
30
+ print t
31
+ end
data/lib/node.rb ADDED
@@ -0,0 +1,74 @@
1
+ class Node
2
+ def initialize(depth)
3
+ @depth = depth
4
+ @tmp = {}
5
+ end
6
+ attr_reader :tmp ,:depth
7
+ attr_accessor :id
8
+ end
9
+
10
+ class Link < Node
11
+ def initialize(depth, dest)
12
+ super(depth)
13
+ @dest = dest
14
+ end
15
+ attr_reader :dest
16
+
17
+ def to_s
18
+ "(Link depth:#{@depth}, dest:#{@dest}, tmp:#{@tmp})"
19
+ end
20
+
21
+ def to_desc
22
+ ""
23
+ end
24
+
25
+ def to_csv
26
+ ""
27
+ end
28
+ end
29
+
30
+ class Tag < Node
31
+ def initialize(depth, tag, text)
32
+ super(depth)
33
+ @tag = tag
34
+ @text = text
35
+ end
36
+ attr_reader :tag
37
+
38
+ def to_s
39
+ "(Tag depth:#{@depth}, tag:#{@tag}, text:#{@text}, tmp:#{@tmp})"
40
+ end
41
+
42
+ def to_csv
43
+ @text
44
+ end
45
+
46
+ def to_desc
47
+ @text
48
+ end
49
+ end
50
+
51
+ class Text < Node
52
+ def initialize(depth, text)
53
+ super(depth)
54
+ @text = text
55
+ end
56
+
57
+ def to_s
58
+ "(Text depth:#{@depth}, text:#{@text}, tmp:#{@tmp})"
59
+ end
60
+
61
+ def to_csv
62
+ @text
63
+ end
64
+
65
+ def to_desc
66
+ @text
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $0
71
+ n = Text.new(10, "akira")
72
+ n.tmp[:x] = 100
73
+ p n
74
+ end
data/lib/nodes2tree.rb ADDED
@@ -0,0 +1,41 @@
1
+ require_relative "tree"
2
+ require_relative "node"
3
+
4
+ def nodes2tree(nodes)
5
+ nodess = depth2link(nodes)
6
+ t = Tree.new
7
+ nodess.each do |n|
8
+ t.add_node(n.id, n)
9
+ end
10
+ for i in 1...nodess.size
11
+ n = nodess[i]
12
+ from = n.tmp[:parent_id]
13
+ to = n.id
14
+ t.add_edge(from, to)
15
+ end
16
+ t
17
+ end
18
+
19
+ def depth2link(nodes)
20
+ nodess = [Text.new(0, "Root")] + nodes
21
+ nodess.each_with_index do |n, i|
22
+ n.id = i
23
+ end
24
+ current = [nodess[0]]
25
+ for i in 1...nodess.size
26
+ n = nodess[i]
27
+ x = n.depth - 1
28
+ n.tmp[:parent_id] = current[x].id
29
+ current[n.depth] = n
30
+ end
31
+
32
+ nodess
33
+ end
34
+
35
+ if __FILE__ == $0
36
+ puts depth2link([Text.new(1, "akira"), Text.new(2, "developer")])
37
+ t = nodes2tree([Text.new(1, "akira"), Text.new(2, "developer")])
38
+
39
+ puts "------------"
40
+ puts t.size
41
+ end
data/lib/nodetree.rb ADDED
@@ -0,0 +1,102 @@
1
+ require_relative "matrix2csv"
2
+ require_relative "tree2matrix"
3
+ require_relative "node"
4
+
5
+ class Tree
6
+
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
+ def to_dot
25
+ elems = []
26
+ for i in 0...size
27
+ unless link_node?(i)
28
+ elems << dot_node_desc(i)
29
+ end
30
+ end
31
+ linkmap = mk_linkmap
32
+ for i in 0...size
33
+ if link_node?(i)
34
+ to = linkmap[i]
35
+ from = parent(i)
36
+ elems << dot_edge_desc(from, to)
37
+ next
38
+ end
39
+ if leaf?(i)
40
+ next
41
+ end
42
+ children(i).each do |child|
43
+ elems << dot_edge_desc(i, child) unless link_node?(child)
44
+ end
45
+ end
46
+ """
47
+ digraph graphname {
48
+ #{elems.join("\n ")}
49
+ }
50
+ """
51
+ end
52
+
53
+ def dot_node_desc(id)
54
+ "v#{id} [label=\"#{value(id).to_desc}\"];"
55
+ end
56
+
57
+ def dot_edge_desc(from, to)
58
+ "v#{from} -> v#{to};"
59
+ end
60
+
61
+ def link_node?(id)
62
+ n = value(id)
63
+ n.class == Link
64
+ end
65
+
66
+ def mk_tag2id
67
+ tag2id = {}
68
+ for i in 0...size
69
+ n = value(i)
70
+ if n.class == Tag
71
+ tag2id[n.tag] = i
72
+ end
73
+ end
74
+ tag2id
75
+ end
76
+
77
+ def mk_linkmap
78
+ id2tag = {}
79
+ for i in 0...size
80
+ n = value(i)
81
+ if n.class == Link
82
+ id2tag[i] = n.dest
83
+ end
84
+ end
85
+ id2id = {}
86
+ tag2id = mk_tag2id
87
+ id2tag.keys.each do |key|
88
+ tag = id2tag[key]
89
+ id2id[key] = tag2id[tag]
90
+ end
91
+ id2id
92
+ end
93
+ 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/rd2nodes.rb ADDED
@@ -0,0 +1,60 @@
1
+ require_relative "node"
2
+
3
+ # rd -> [node]
4
+ def rd2nodes(file)
5
+ f = File.open(file, "r")
6
+ lines = f.read.split("\n")
7
+ nodes = lines2nodes(lines)
8
+ f.close
9
+ nodes
10
+ end
11
+
12
+ def lines2nodes(lines)
13
+ xs = []
14
+ lines.each do |line|
15
+ xs << line2node(line)
16
+ end
17
+ xs
18
+ end
19
+
20
+ # Example,
21
+ # --- aaa => Text(3, "aaa")
22
+ # -- >>bbb => Link(2, "bbb")
23
+ # - [[ccc:ddd]] => Tag(1, "ccc", "ddd")
24
+ def line2node(line)
25
+ splits = line.split(" ")
26
+ dashes = splits[0]
27
+ depth = dashes.split("").size
28
+ rest = splits[1...splits.size][0]
29
+ if rest.start_with?(">>")
30
+ ss = parse_link(rest)
31
+ return Link.new(depth, ss)
32
+ elsif rest.start_with?("[[")
33
+ ss = parse_tag(rest)
34
+ return Tag.new(depth, ss[0], ss[1])
35
+ else
36
+ ss = parse_text(rest)
37
+ return Text.new(depth, ss)
38
+ end
39
+ end
40
+
41
+ def parse_text(s)
42
+ s
43
+ end
44
+
45
+ # NOTE: under-engineering
46
+ def parse_link(s)
47
+ s.delete ">>"
48
+ end
49
+
50
+ # NOTE: under-engineering
51
+ def parse_tag(s)
52
+ ss = s.delete("[[").delete("]]")
53
+ ss.split(":")
54
+ end
55
+
56
+ if __FILE__ == $0
57
+ puts "nodes from .rd"
58
+ nodes = rd2nodes("sample.rd")
59
+ puts nodes
60
+ end
data/lib/requidef.rb ADDED
@@ -0,0 +1,17 @@
1
+ require_relative "nodetree"
2
+ require_relative "rd2nodes"
3
+ require_relative "nodes2tree"
4
+
5
+ def rd2tree(file)
6
+ nodes2tree( rd2nodes(file) )
7
+ end
8
+
9
+ # File -> String
10
+ def dot(file)
11
+ rd2tree(file).to_dot
12
+ end
13
+
14
+ # File -> String
15
+ def csv(file)
16
+ rd2tree(file).to_csv
17
+ end
@@ -0,0 +1,67 @@
1
+ require_relative "tree"
2
+
3
+ def row_of_nodes(tree)
4
+ RowOfNodes.new(tree).row_of_nodes
5
+ end
6
+
7
+ class RowOfNodes
8
+
9
+ def initialize(tree)
10
+ @tree = tree
11
+ @array = Array.new(tree.values.size, [0,0])
12
+ end
13
+
14
+ def row_of_nodes
15
+ n = @tree.root_id
16
+ set_row_of_nodes(n)
17
+ @array.map { |xx| xx[0] }
18
+ end
19
+
20
+ private
21
+
22
+ def set_row_of_nodes(id)
23
+ if @tree.leaf? id
24
+ @array[id][1] = 1
25
+ return
26
+ end
27
+
28
+ children_id = @tree.children(id)
29
+
30
+ for i in 0...children_id.size
31
+ child_id = children_id[i]
32
+ a = @array[id][0] + @array[id][1]
33
+ # @array[child_id][0] = @array[id][0] + @array[id][1]
34
+ @array[child_id] = [a, @array[child_id][1]]
35
+ set_row_of_nodes(child_id)
36
+ # @array[id][1] += @array[child_id][1]
37
+ b = @array[id][1] + @array[child_id][1]
38
+ @array[id] = [@array[id][0], b]
39
+ end
40
+ end
41
+ end
42
+
43
+ if __FILE__ == $0
44
+ # test ------------------
45
+ a = [[1,1], [2,2]]
46
+ a[0][0] = a[0][0] + a[0][1]
47
+ p a #=> no problem.
48
+
49
+ # NOTE:
50
+ # The problem occured above related to
51
+ # Array on recursion.
52
+ # -----------------------
53
+
54
+ t = Tree.new
55
+ t.add_node(0, nil)
56
+ t.add_node(1, nil)
57
+ t.add_node(2, nil)
58
+ t.add_node(3, nil)
59
+ t.add_node(4, nil)
60
+
61
+ t.add_edge(0, 2)
62
+ t.add_edge(0, 1)
63
+ t.add_edge(1, 3)
64
+ t.add_edge(1, 4)
65
+
66
+ p row_of_nodes(t)
67
+ end
data/lib/tree.rb ADDED
@@ -0,0 +1,93 @@
1
+ class Tree
2
+ def initialize
3
+ @values = []
4
+ @edges = []
5
+ @parents = []
6
+ end
7
+
8
+ def values
9
+ @values
10
+ end
11
+
12
+ def size
13
+ @values.size
14
+ end
15
+
16
+ def parent(id)
17
+ @parents[id]
18
+ end
19
+
20
+ def depth(id)
21
+ d = 0
22
+ i = id
23
+ until( i==root_id )
24
+ i = parent(i)
25
+ d += 1
26
+ end
27
+ d
28
+ end
29
+
30
+ def root_id
31
+ 0
32
+ end
33
+
34
+ def value(id)
35
+ @values[id]
36
+ end
37
+
38
+ def children(id)
39
+ @edges[id]
40
+ end
41
+
42
+ def add_node(id, value)
43
+ @values[id] = value
44
+ end
45
+
46
+ def add_edge(from, to)
47
+ register_edge(from, to)
48
+ register_parent(to, from)
49
+ end
50
+
51
+ def leaf?(id)
52
+ @edges[id] == nil
53
+ end
54
+
55
+ def branch?(id)
56
+ ! leaf?(id)
57
+ end
58
+
59
+ private
60
+
61
+ def register_edge(from, to)
62
+ if @edges[from] == nil
63
+ @edges[from] = Array.new
64
+ end
65
+ @edges[from] << to
66
+ end
67
+
68
+ def register_parent(from, to)
69
+ @parents[from] = to
70
+ end
71
+ end
72
+
73
+ if __FILE__ == $0
74
+ t = Tree.new
75
+ t.add_node(0, "a")
76
+ t.add_node(1, "b")
77
+ t.add_node(2, "c")
78
+
79
+ t.add_edge(0, 1)
80
+ t.add_edge(1, 2)
81
+ [0,1,2].each do |i|
82
+ puts "id:#{i}"
83
+ puts "value:#{t.value(i)}"
84
+ puts "leaf?:#{t.leaf?(i)}"
85
+ puts "branch?:#{t.branch?(i)}"
86
+ puts "depth:#{t.depth(i)}"
87
+ end
88
+ [0,1].each do |i|
89
+ puts "children:#{t.children(i)}"
90
+ end
91
+
92
+
93
+ end
@@ -0,0 +1,27 @@
1
+ require_relative "matrix"
2
+ require_relative "row_of_nodes"
3
+
4
+ def tree2matrix(tree)
5
+ rows = row_of_nodes(tree)
6
+ m = Matrix.new
7
+ for i in 0...tree.size
8
+ m.set( [rows[i], tree.depth(i)], tree.value(i) )
9
+ end
10
+ m
11
+ end
12
+
13
+ if __FILE__ == $0
14
+ t = Tree.new
15
+ t.add_node(0, 0)
16
+ t.add_node(1, 1)
17
+ t.add_node(2, 2)
18
+ t.add_node(3, 3)
19
+ t.add_node(4, 4)
20
+
21
+ t.add_edge(0, 2)
22
+ t.add_edge(0, 1)
23
+ t.add_edge(1, 3)
24
+ t.add_edge(1, 4)
25
+
26
+ print tree2matrix(t)
27
+ end
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.0
4
+ version: 0.1.1
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-20 00:00:00.000000000Z
12
+ date: 2011-08-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &11027760 !ruby/object:Gem::Requirement
16
+ requirement: &14359940 !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: *11027760
24
+ version_requirements: *14359940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &11027220 !ruby/object:Gem::Requirement
27
+ requirement: &14359460 !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: *11027220
35
+ version_requirements: *14359460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &11026700 !ruby/object:Gem::Requirement
38
+ requirement: &14358980 !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: *11026700
46
+ version_requirements: *14358980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &11026160 !ruby/object:Gem::Requirement
49
+ requirement: &14358500 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,12 +54,11 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *11026160
57
+ version_requirements: *14358500
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
- - .requidef.swp
63
62
  - Makefile
64
63
  - requidef
65
64
  - sample.rd
@@ -68,9 +67,18 @@ extra_rdoc_files:
68
67
  - LICENSE.txt
69
68
  - README.md
70
69
  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
76
+ - lib/requidef.rb
77
+ - lib/row_of_nodes.rb
78
+ - lib/tree.rb
79
+ - lib/tree2matrix.rb
71
80
  - LICENSE.txt
72
81
  - README.md
73
- - bin/.requidef.swp
74
82
  - bin/Makefile
75
83
  - bin/requidef
76
84
  - bin/sample.rd
@@ -89,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
97
  version: '0'
90
98
  segments:
91
99
  - 0
92
- hash: -2938751983039171718
100
+ hash: -4304971184590871815
93
101
  required_rubygems_version: !ruby/object:Gem::Requirement
94
102
  none: false
95
103
  requirements:
data/bin/.requidef.swp DELETED
Binary file