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 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