gotero 0.1.0
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 +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: []
|