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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/gotero.rb +78 -0
  3. metadata +44 -0
@@ -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
@@ -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: []