use_case_diagram 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7cb0a1b24c6a4f7893337480579677fb697fdd48
4
- data.tar.gz: 0e3d5f298934ee0b888b6b49678ffdd4d77b80eb
3
+ metadata.gz: f3e98ef474368401223c80c0162fa7c7bb044028
4
+ data.tar.gz: 056206cf7cca3167924a1bf13f6ec7b611dc050a
5
5
  SHA512:
6
- metadata.gz: 29219f1c48533930623dbe93733ee629b60577745cf523fbae4155057290181c2dc58220613a1773dda8ee2b3bc261cc752a46ccd4a23aa57eaae0b462283a29
7
- data.tar.gz: 5304397c25394106241d7924d4fc1383eaf8376647e1d2d12bb7c80cb52dc8da8646f862cd73055cb8e624ed681c8bbe34b211b1cab8cf4e90d519bdd8c10ad5
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 description_file"
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 input_file.nil? || !File.exists?(input_file)
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
- cont=File.read(input_file)
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
- puts parse_result.obj.to_dot
28
- else
29
- raise "No dot file produced"
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
- @description=nil
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
- res=DIAG_TPL;
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
- @description=nil
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#',"")
@@ -37,7 +37,11 @@ class Parser
37
37
  raise Exception, "Parse error at offset: #{@@parser.index}"
38
38
  end
39
39
 
40
- return tree
40
+ diag=tree.obj
41
+
42
+ diag.fill_nodes
43
+
44
+ return diag
41
45
  end
42
46
 
43
47
  end
@@ -30,3 +30,14 @@ end
30
30
 
31
31
  class Expression < Treetop::Runtime::SyntaxNode
32
32
  end
33
+
34
+ class String
35
+
36
+ def dquote
37
+ return "\""+self+"\""
38
+ end
39
+ def squote
40
+ return "'"+self+"'"
41
+ end
42
+
43
+ end
@@ -1,3 +1,3 @@
1
1
  module UseCaseDiagram
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,10 +1,8 @@
1
1
  actor :user
2
- actor :admin "Admin name"
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.obj.is_a?(Diagram))
11
+ assert(res.is_a?(Diagram))
12
12
 
13
- assert_equal(res.obj.actors.count,0)
14
- assert_equal(res.obj.nodes.count,0)
15
- # assert_equal(res.obj.uses.count,0)
16
- # assert_equal(res.obj.includes.count,0)
17
- # assert_equal(res.obj.extends.count,0)
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.obj.is_a?(Diagram))
24
+ assert(res.is_a?(Diagram))
25
25
 
26
- assert_equal(res.obj.actors.count,1)
27
- assert_equal(res.obj.nodes.count,0)
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.obj.is_a?(Diagram))
34
+ assert(res.is_a?(Diagram))
35
35
 
36
- assert_equal(res.obj.actors.count,0)
37
- assert_equal(res.obj.nodes.count,1)
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.obj.is_a?(Diagram))
44
+ assert(res.is_a?(Diagram))
45
45
 
46
- assert_equal(res.obj.actors.count,1)
47
- assert_equal(res.obj.nodes.count,2)
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
- assert_equal(res.obj.actors.count,2)
58
- assert_equal(res.obj.nodes.count,4)
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.2
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-21 00:00:00 Z
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
- - use_case.gemspec
74
+ - use_case_diagram.gemspec
75
75
  homepage: ""
76
76
  licenses:
77
77
  - MIT