use_case_diagram 0.0.2 → 0.0.3
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 +4 -4
- data/bin/use_case_diagram +55 -11
- data/lib/use_case_diagram/actors.rb +10 -2
- data/lib/use_case_diagram/diagram.rb +21 -2
- data/lib/use_case_diagram/nodes.rb +23 -2
- data/lib/use_case_diagram/parser.rb +5 -1
- data/lib/use_case_diagram/support_nodes.rb +11 -0
- data/lib/use_case_diagram/version.rb +1 -1
- data/test/lib/use_case_diagram/ej1.txt +3 -5
- data/test/lib/use_case_diagram/test_version.rb +22 -20
- data/{use_case.gemspec → use_case_diagram.gemspec} +0 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3e98ef474368401223c80c0162fa7c7bb044028
|
4
|
+
data.tar.gz: 056206cf7cca3167924a1bf13f6ec7b611dc050a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bf28abe869f01bc31560e2d96fc82d2a33f06976cee9733a07ec2e71e5e0aef3a6fb839c875d005d9ef8a91a46251719c26212e97d76efd450086e2b7c625ef
|
7
|
+
data.tar.gz: 068b097e8f59bf4aecf53d8fbf74b08bf00fe1e1c7bd8865613431d6caa7f9e8f999ecf30ca1782a80980ba1ffbceb23aec207b2197207370d66b0c871a7a5d2
|
data/bin/use_case_diagram
CHANGED
@@ -3,28 +3,72 @@
|
|
3
3
|
require 'use_case_diagram'
|
4
4
|
|
5
5
|
def help
|
6
|
-
puts "Usage: $0
|
6
|
+
puts "Usage: $0 [-p] [-f] description_files"
|
7
7
|
end
|
8
8
|
|
9
|
+
|
10
|
+
to_screen=true
|
11
|
+
if ARGV.index('-f')
|
12
|
+
ARGV.delete('-f')
|
13
|
+
to_screen=false
|
14
|
+
end
|
15
|
+
|
16
|
+
process_dot=false
|
17
|
+
if ARGV.index('-p')
|
18
|
+
ARGV.delete('-p')
|
19
|
+
process_dot=true
|
20
|
+
|
21
|
+
if !system('dot -V')
|
22
|
+
puts "ERROR. You need to install graphviz or dot to get pdfs"
|
23
|
+
exit
|
24
|
+
end
|
25
|
+
|
26
|
+
to_screen=false
|
27
|
+
end
|
9
28
|
|
10
|
-
input_file=ARGV.shift
|
11
29
|
|
12
|
-
if
|
13
|
-
puts "Need input file"
|
30
|
+
if ARGV.empty?
|
31
|
+
puts "Need at least one input file"
|
14
32
|
help
|
15
33
|
exit
|
16
34
|
end
|
17
35
|
|
18
36
|
|
19
|
-
|
37
|
+
# the other arguments are files, or must be
|
38
|
+
ARGV.each do |input_file|
|
39
|
+
if !File.exists?(input_file)
|
40
|
+
puts "Not an input file: #{input_file}"
|
41
|
+
next
|
42
|
+
end
|
43
|
+
|
44
|
+
base_name=File.basename(input_file,File.extname(input_file))
|
45
|
+
|
46
|
+
cont=File.read(input_file)
|
20
47
|
|
21
|
-
parse_result=Parser.parse(cont)
|
48
|
+
parse_result=Parser.parse(cont)
|
22
49
|
|
23
|
-
# puts parse_result.obj.inspect
|
50
|
+
# puts parse_result.obj.inspect
|
24
51
|
|
25
52
|
|
26
|
-
if !parse_result.nil?
|
27
|
-
|
28
|
-
|
29
|
-
|
53
|
+
if !parse_result.nil?
|
54
|
+
res=parse_result.to_dot
|
55
|
+
if to_screen
|
56
|
+
puts res
|
57
|
+
else
|
58
|
+
f=File.open("#{base_name}.dot",'w')
|
59
|
+
f.puts res
|
60
|
+
f.close
|
61
|
+
end
|
62
|
+
else
|
63
|
+
raise "No dot file produced"
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
if process_dot
|
68
|
+
system("dot -Tpdf -o \"#{base_name}.pdf\" \"#{base_name}.dot\"")
|
69
|
+
end
|
70
|
+
|
30
71
|
end
|
72
|
+
|
73
|
+
|
74
|
+
|
@@ -16,13 +16,15 @@ class Actor
|
|
16
16
|
#-----------------------------------------
|
17
17
|
def initialize(name)
|
18
18
|
@name=name.to_s
|
19
|
-
|
19
|
+
if !@name.nil?
|
20
|
+
@description=@name.gsub('_',' ')
|
21
|
+
end
|
20
22
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def to_dot
|
24
26
|
res=ACTOR_TPL
|
25
|
-
res=res.gsub('#NAME#',@name)
|
27
|
+
res=res.gsub('#NAME#',@name.dquote)
|
26
28
|
lab=''
|
27
29
|
if !@description.nil?
|
28
30
|
lab=' , label="'+@description.to_s+'"'
|
@@ -59,8 +61,14 @@ class Actors
|
|
59
61
|
end
|
60
62
|
|
61
63
|
@actors<<a
|
64
|
+
end
|
65
|
+
|
66
|
+
def find(name)
|
67
|
+
res=@actors.find{|e| e.name.to_sym==name}
|
68
|
+
return res
|
62
69
|
end
|
63
70
|
|
71
|
+
|
64
72
|
def to_dot
|
65
73
|
res=ACTORS_TPL
|
66
74
|
@actors.each do |actor|
|
@@ -87,7 +87,7 @@ class Diagram
|
|
87
87
|
res=''
|
88
88
|
relations.each do |from_use,to_use|
|
89
89
|
to_use.each do |to_u|
|
90
|
-
res += "#{from_use} -> #{to_u};\n"
|
90
|
+
res += "#{from_use.to_s.dquote} -> #{to_u.to_s.dquote};\n"
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -110,10 +110,29 @@ class Diagram
|
|
110
110
|
def generalises_to_dot
|
111
111
|
return relations_to_dot(@generalises)
|
112
112
|
end
|
113
|
+
|
114
|
+
def fill_nodes_from(hash)
|
115
|
+
hash.to_a.flatten.each do |node|
|
116
|
+
if (!@nodes.find(node) && !@actors.find(node))
|
117
|
+
@nodes.add(node)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# fill nodes not defined by node a line
|
123
|
+
def fill_nodes
|
124
|
+
fill_nodes_from(@uses)
|
125
|
+
fill_nodes_from(@extends)
|
126
|
+
fill_nodes_from(@includes)
|
127
|
+
fill_nodes_from(@generalises)
|
128
|
+
end
|
113
129
|
|
114
130
|
|
115
131
|
def to_dot
|
116
|
-
|
132
|
+
|
133
|
+
fill_nodes
|
134
|
+
|
135
|
+
res=DIAG_TPL
|
117
136
|
|
118
137
|
res=res.gsub('#ACTORS#',@actors.to_dot)
|
119
138
|
res=res.gsub('#NODES#',@nodes.to_dot)
|
@@ -8,7 +8,10 @@ class Node
|
|
8
8
|
#-----------------------------------------
|
9
9
|
def initialize(name)
|
10
10
|
@name=name.to_s
|
11
|
-
|
11
|
+
if !@name.nil?
|
12
|
+
@description=@name.gsub('_','\n')
|
13
|
+
end
|
14
|
+
|
12
15
|
end
|
13
16
|
|
14
17
|
end
|
@@ -45,6 +48,24 @@ class Nodes
|
|
45
48
|
|
46
49
|
end
|
47
50
|
|
51
|
+
def find(name)
|
52
|
+
# puts "="*20
|
53
|
+
# puts "FIND #{name},#{name.class}, count:#{@nodes.count}:"
|
54
|
+
# res=nil
|
55
|
+
# @nodes.each do |n|
|
56
|
+
# puts "- #{n.name}"
|
57
|
+
# if n.name.to_sym==name
|
58
|
+
# res=n
|
59
|
+
# puts "*** FOUND #{res.name}."
|
60
|
+
#
|
61
|
+
# break
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
res=@nodes.find{|e| e.name.to_sym==name}
|
66
|
+
return res
|
67
|
+
end
|
68
|
+
|
48
69
|
def to_dot
|
49
70
|
res=NODES_TPL
|
50
71
|
@nodes.each do |node|
|
@@ -52,7 +73,7 @@ class Nodes
|
|
52
73
|
if !node.description.nil?
|
53
74
|
desc=' [label="'+node.description+'"]'
|
54
75
|
end
|
55
|
-
res=res.gsub('#NODE#',node.name+"#{desc};\n#NODE#")
|
76
|
+
res=res.gsub('#NODE#',node.name.dquote+"#{desc};\n#NODE#")
|
56
77
|
end
|
57
78
|
|
58
79
|
res=res.gsub('#NODE#',"")
|
@@ -1,10 +1,8 @@
|
|
1
1
|
actor :user
|
2
|
-
|
2
|
+
actor :admin "Admin name"
|
3
3
|
|
4
|
-
node :login
|
5
|
-
node :logout
|
6
|
-
node :other
|
7
4
|
node :askpassword "Ask password"
|
5
|
+
node :login
|
8
6
|
|
9
7
|
:user uses :login, :other
|
10
8
|
|
@@ -13,5 +11,5 @@ node :askpassword "Ask password"
|
|
13
11
|
:login includes :askpassword, :askname
|
14
12
|
|
15
13
|
:logout extended :extend1_logout, :extend2_logout
|
16
|
-
:askname includes :askfirstname
|
14
|
+
:askname includes :askfirstname?
|
17
15
|
:askname extended :asksecondname
|
@@ -8,55 +8,57 @@ class TestUseCase < Test::Unit::TestCase
|
|
8
8
|
def test_parse_empty
|
9
9
|
res=Parser.parse("")
|
10
10
|
|
11
|
-
assert(res.
|
11
|
+
assert(res.is_a?(Diagram))
|
12
12
|
|
13
|
-
assert_equal(res.
|
14
|
-
assert_equal(res.
|
15
|
-
# assert_equal(res.
|
16
|
-
# assert_equal(res.
|
17
|
-
# assert_equal(res.
|
13
|
+
assert_equal(res.actors.count,0)
|
14
|
+
assert_equal(res.nodes.count,0)
|
15
|
+
# assert_equal(res.uses.count,0)
|
16
|
+
# assert_equal(res.includes.count,0)
|
17
|
+
# assert_equal(res.extends.count,0)
|
18
18
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_parse_actor
|
22
22
|
res=Parser.parse("actor :dario\n")
|
23
23
|
|
24
|
-
assert(res.
|
24
|
+
assert(res.is_a?(Diagram))
|
25
25
|
|
26
|
-
assert_equal(res.
|
27
|
-
assert_equal(res.
|
26
|
+
assert_equal(res.actors.count,1)
|
27
|
+
assert_equal(res.nodes.count,0)
|
28
28
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_parse_node
|
32
32
|
res=Parser.parse("node :login\n")
|
33
33
|
|
34
|
-
assert(res.
|
34
|
+
assert(res.is_a?(Diagram))
|
35
35
|
|
36
|
-
assert_equal(res.
|
37
|
-
assert_equal(res.
|
36
|
+
assert_equal(res.actors.count,0)
|
37
|
+
assert_equal(res.nodes.count,1)
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_parse
|
42
42
|
res=Parser.parse("actor :dario\n node :login \n node :logout\n")
|
43
43
|
|
44
|
-
assert(res.
|
44
|
+
assert(res.is_a?(Diagram))
|
45
45
|
|
46
|
-
assert_equal(res.
|
47
|
-
assert_equal(res.
|
46
|
+
assert_equal(res.actors.count,1)
|
47
|
+
assert_equal(res.nodes.count,2)
|
48
48
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def test_uses
|
52
52
|
cont=File.read(File.join(@@base_path,'ej1.txt'))
|
53
53
|
res=Parser.parse(cont)
|
54
|
-
|
55
|
-
assert(res.obj.is_a?(Diagram))
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
assert(res.is_a?(Diagram))
|
56
|
+
|
57
|
+
assert_equal(res.actors.count,2)
|
58
|
+
assert_equal(res.nodes.count,9)
|
59
|
+
|
60
|
+
puts res.to_dot
|
61
|
+
|
60
62
|
end
|
61
63
|
|
62
64
|
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: use_case_diagram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dario Guerrero
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-23 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: treetop
|
@@ -71,7 +71,7 @@ files:
|
|
71
71
|
- test/lib/use_case_diagram/ej1.txt
|
72
72
|
- test/lib/use_case_diagram/test_version.rb
|
73
73
|
- test/test_helper.rb
|
74
|
-
-
|
74
|
+
- use_case_diagram.gemspec
|
75
75
|
homepage: ""
|
76
76
|
licenses:
|
77
77
|
- MIT
|