gotero 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/gotero.rb +78 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8b603c0e3c2cd0a4f324336df9a100281e55a0a4
|
4
|
+
data.tar.gz: 288ebeb2aace424e4a2835a22766f3b7dced3d88
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d25c28f7d68eb8ef81947c68c2f3d771b8b41fa908599195c814a08840bea002d724bf3021b5695c7d320824f3f1a410cdc74faddb72f6a21320d0dd779a0bed
|
7
|
+
data.tar.gz: 202e9f79f54f152906d69c3ed7241c464ff3664fb980c596a6f53861cce20e3025086b5d902c98ad4a02da6a48f356026a4da70f642d16138891834c8ddd41a7
|
data/lib/gotero.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# La principal funcion de gotero es ofrecer al usuario comprensión sobre los
|
2
|
+
# llamados realizados por la aplicación para ententer la interacción entre los
|
3
|
+
# objetos.
|
4
|
+
#
|
5
|
+
# Para hacerlo la idea es ejecutar un bloque de código con un gotero, el cual
|
6
|
+
# pone luego a disposición un diagrama de secuencias.
|
7
|
+
#
|
8
|
+
# Entonces lo primero va a ser definir una clase Gotero
|
9
|
+
|
10
|
+
class Gotero
|
11
|
+
|
12
|
+
# Por el momento, vamos a guardar el resultado como un string y lo vamos a
|
13
|
+
# hacer accesible, después vamos a ver como podemos guardar esta información
|
14
|
+
# de una forma más adaptada a nuestras necesidades.
|
15
|
+
attr_accessor :output
|
16
|
+
|
17
|
+
# Inicialmente la secuencia va a estar vacía y nuestro primer objeto va a ser
|
18
|
+
# un sujeto `:t` (ya que se me ocurre que esto lo estamos corriendo como un
|
19
|
+
# test)
|
20
|
+
def initialize
|
21
|
+
@output = ''
|
22
|
+
@emiters = [:t]
|
23
|
+
end
|
24
|
+
|
25
|
+
# La interface publica de gotero simplemente recibe un bloque y lo ejecuta con
|
26
|
+
# el gotero habilitado
|
27
|
+
def trace &block
|
28
|
+
tracer.enable &block
|
29
|
+
end
|
30
|
+
|
31
|
+
# Más allá de esa interface pública, el resto es privado
|
32
|
+
private
|
33
|
+
|
34
|
+
# Para hacer el seguimiento, lo que vamos a usar es `TracePoint` al cual, si
|
35
|
+
# le pasamos un bloque ejecuta el bloque cada vez que un evento del tipo
|
36
|
+
# indicado se realiza.
|
37
|
+
#
|
38
|
+
# Los eventos que nos interesan son `call` y `return`, o sea llamados a
|
39
|
+
# métodos y retornos de métodos.
|
40
|
+
def tracer
|
41
|
+
TracePoint.new(:call, :return) do |tp|
|
42
|
+
case tp.event
|
43
|
+
when :call then on_call(tp)
|
44
|
+
when :return then on_return(tp)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Cuando se hace un llamado a un método necesitamos saber quien lo llamó y
|
50
|
+
# quien es el receptor, para guardamos la pila de emisores, el receptor de un
|
51
|
+
# mensaje siempre es el emisor del siguiente mensaje, excepto en el caso en
|
52
|
+
# que un mensaje vuelva.
|
53
|
+
#
|
54
|
+
# Además de emisor y receptor, necesitamos saber el método que estamos
|
55
|
+
# llamando y, ya que estamos, los argumentos con los que se llama al método.
|
56
|
+
def on_call tracepoint
|
57
|
+
current_emiter = @emiters.last
|
58
|
+
receiver = tracepoint.defined_class
|
59
|
+
subject = receiver.name.downcase
|
60
|
+
method = tracepoint.method_id
|
61
|
+
detached_method = receiver.instance_method(method)
|
62
|
+
arguments = detached_method.parameters.map do |param|
|
63
|
+
tracepoint.binding.local_variable_get param[1]
|
64
|
+
end.join(', ')
|
65
|
+
message_details = " #{ method } (#{ arguments })"
|
66
|
+
self.output << "#{ current_emiter }->#{ subject }:#{ message_details }\n"
|
67
|
+
@emiters << subject.to_sym
|
68
|
+
end
|
69
|
+
|
70
|
+
# En el caso del return el receptor es el que está pen-último en la pila, así
|
71
|
+
# que lo que hacemos es sacar el último de la pila (y dejarlo como emisor) y
|
72
|
+
# tomar como receptor al que queda último.
|
73
|
+
def on_return tracepoint
|
74
|
+
emiter = @emiters.pop
|
75
|
+
receiver = @emiters.last
|
76
|
+
self.output << "#{ emiter }->#{ receiver }:\n"
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gotero
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- RubyLit
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Use a tracer to build a sequence diagram of a block of code.
|
14
|
+
email: rubylitar@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/gotero.rb
|
20
|
+
homepage: https://github.com/rubylit/gotero
|
21
|
+
licenses:
|
22
|
+
- AGPL-3.0+
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.2.2
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Sequence diagrams from runtime.
|
44
|
+
test_files: []
|