gotero 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []