localtower 0.1.9 → 0.2.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 +4 -4
- data/README.md +5 -0
- data/app/views/localtower/pages/logs.html.erb +24 -11
- data/lib/localtower/plugins/capture.rb +70 -22
- data/lib/localtower/version.rb +1 -1
- data/public/js/app.js +33 -5
- metadata +1 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: dcfd04482b7b0798e66c863f019e56a6b5af16d2
         | 
| 4 | 
            +
              data.tar.gz: c8729e1ed2b16a5a09851e3e5ee828d59137cfc7
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2b5f5ad3608a85599a661ae92cb2da043039f7b45a49e2943aafea4b2ae6426bd2edc9dfc037e9dcd8fdd8ef4edb16ca9d0c0a094610a3b2d78624c73a6d3545
         | 
| 7 | 
            +
              data.tar.gz: d71724de93ea68cd9e5f5a4ffd32f8995664dd7d34897ab8a9131eed797a9d0c976e2e402194ccbac0c8887ae6e6fcc6d278924cc6ba1818185cf7b179ac8a6d
         | 
    
        data/README.md
    CHANGED
    
    | @@ -101,3 +101,8 @@ Tests are currently very slow because this is testing rails commands so it boots | |
| 101 101 | 
             
            Thanks for reporting issues, I'll do my best.
         | 
| 102 102 |  | 
| 103 103 | 
             
            [](https://github.com/damln/localtower)
         | 
| 104 | 
            +
             | 
| 105 | 
            +
             | 
| 106 | 
            +
            ## Deploy
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                gem build localtower.gemspec
         | 
| @@ -1,9 +1,18 @@ | |
| 1 1 | 
             
            <style type="text/css">
         | 
| 2 | 
            +
              .string { color: green; }
         | 
| 3 | 
            +
              .number { color: darkorange; }
         | 
| 4 | 
            +
              .boolean { color: blue; }
         | 
| 5 | 
            +
              .null { color: magenta; }
         | 
| 6 | 
            +
              .key { color: red; }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              .code {
         | 
| 9 | 
            +
                font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
         | 
| 10 | 
            +
              }
         | 
| 11 | 
            +
             | 
| 2 12 | 
             
              .value {
         | 
| 13 | 
            +
                padding: 10px;
         | 
| 3 14 | 
             
                border: 1px solid #cacaca;
         | 
| 4 15 | 
             
                line-height: 1.2em;
         | 
| 5 | 
            -
                font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
         | 
| 6 | 
            -
                padding: 10px;
         | 
| 7 16 | 
             
                overflow:auto;
         | 
| 8 17 | 
             
                -moz-background-clip: padding;
         | 
| 9 18 | 
             
                -webkit-background-clip: padding-box;
         | 
| @@ -16,6 +25,9 @@ | |
| 16 25 | 
             
              }
         | 
| 17 26 |  | 
| 18 27 | 
             
            </style>
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 19 31 | 
             
            <% content_for :title do %>Logs<% end %>
         | 
| 20 32 |  | 
| 21 33 | 
             
            <div class="row">
         | 
| @@ -26,26 +38,27 @@ | |
| 26 38 | 
             
                  </div>
         | 
| 27 39 |  | 
| 28 40 | 
             
                  <div class="content">
         | 
| 29 | 
            -
                    <table class="table | 
| 41 | 
            +
                    <table class="table">
         | 
| 30 42 | 
             
                      <thead>
         | 
| 31 43 | 
             
                        <th>Variable</th>
         | 
| 32 44 | 
             
                        <th>Value</th>
         | 
| 45 | 
            +
                        <th>Value Type</th>
         | 
| 33 46 | 
             
                      </thead>
         | 
| 34 47 |  | 
| 35 48 | 
             
                      <tbody data-selector="tbody">
         | 
| 36 | 
            -
                        <% @logs.each do |item| %>
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                        <%
         | 
| 39 | 
            -
                        variable = item[:variable]
         | 
| 40 | 
            -
                        value = item[:value]
         | 
| 41 | 
            -
                        %>
         | 
| 49 | 
            +
                        <% @logs["variables"].each do |item| %>
         | 
| 42 50 |  | 
| 43 51 | 
             
                          <tr data-selector="tr">
         | 
| 52 | 
            +
                            <td class="code">
         | 
| 53 | 
            +
                              <%= item["name"] %>
         | 
| 54 | 
            +
                            </td>
         | 
| 55 | 
            +
             | 
| 44 56 | 
             
                            <td>
         | 
| 45 | 
            -
                               | 
| 57 | 
            +
                              <pre class="value json code"><%= Localtower::Plugins::Capture.printable(item["value"]) %></pre>
         | 
| 46 58 | 
             
                            </td>
         | 
| 59 | 
            +
             | 
| 47 60 | 
             
                            <td>
         | 
| 48 | 
            -
             | 
| 61 | 
            +
                              <pre class="code"><%= item["klass"] %></pre>
         | 
| 49 62 | 
             
                            </td>
         | 
| 50 63 | 
             
                          </tr>
         | 
| 51 64 | 
             
                        <% end %>
         | 
| @@ -18,6 +18,29 @@ module Localtower | |
| 18 18 | 
             
                    "@_response_body",
         | 
| 19 19 | 
             
                  ]
         | 
| 20 20 |  | 
| 21 | 
            +
                  class << self
         | 
| 22 | 
            +
                    def printable(content)
         | 
| 23 | 
            +
                      if content.respond_to?(:to_json)
         | 
| 24 | 
            +
                        # content.to_json
         | 
| 25 | 
            +
                        JSON.pretty_generate(content)
         | 
| 26 | 
            +
                      else
         | 
| 27 | 
            +
                        content.to_s
         | 
| 28 | 
            +
                      end
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    def type_of(value)
         | 
| 32 | 
            +
                      if value.instance_of?(Float); return Float.to_s; end;
         | 
| 33 | 
            +
                      if value.instance_of?(Integer); return Integer.to_s; end;
         | 
| 34 | 
            +
                      if value.instance_of?(String); return String.to_s; end;
         | 
| 35 | 
            +
                      if value.instance_of?(Array); return Array.to_s; end;
         | 
| 36 | 
            +
                      if value.instance_of?(Hash); return Hash.to_s; end;
         | 
| 37 | 
            +
                      if value.instance_of?(ApplicationController); return ApplicationController.to_s; end;
         | 
| 38 | 
            +
                      if value.instance_of?(NilClass); return NilClass.to_s; end;
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                      nil
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 21 44 | 
             
                  def initialize(context = nil, context_binding = nil)
         | 
| 22 45 | 
             
                    @context = context
         | 
| 23 46 | 
             
                    @context_binding = context_binding
         | 
| @@ -25,27 +48,15 @@ module Localtower | |
| 25 48 |  | 
| 26 49 | 
             
                  def logs
         | 
| 27 50 | 
             
                    content = File.open(LOG_FILE).read
         | 
| 28 | 
            -
                    return [] unless content.present?
         | 
| 51 | 
            +
                    return {"variables" => []} unless content.present?
         | 
| 29 52 |  | 
| 30 53 | 
             
                    data = JSON.parse(content)
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                    data.map do |key, value|
         | 
| 33 | 
            -
                      if value.respond_to?(:to_json)
         | 
| 34 | 
            -
                        value = JSON.pretty_generate(value)
         | 
| 35 | 
            -
                      end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                      {
         | 
| 38 | 
            -
                        variable: key,
         | 
| 39 | 
            -
                        value: value,
         | 
| 40 | 
            -
                      }
         | 
| 41 | 
            -
                    end
         | 
| 42 54 | 
             
                  end
         | 
| 43 55 |  | 
| 44 56 | 
             
                  def my_logger
         | 
| 45 57 | 
             
                    @@my_logger ||= Logger.new(LOG_FILE)
         | 
| 46 58 | 
             
                    @@my_logger.formatter = proc do |severity, datetime, progname, msg|
         | 
| 47 59 | 
             
                      "#{msg}\n"
         | 
| 48 | 
            -
                      # "[#{datetime}] | #{msg}\n"
         | 
| 49 60 | 
             
                    end
         | 
| 50 61 |  | 
| 51 62 | 
             
                    @@my_logger
         | 
| @@ -54,37 +65,74 @@ module Localtower | |
| 54 65 | 
             
                  def values
         | 
| 55 66 | 
             
                    hash = {}
         | 
| 56 67 |  | 
| 68 | 
            +
                    a = @context.send(:caller)[1] # xx/xx/app/controllers/clients/events_controller.rb:57:in `new'
         | 
| 69 | 
            +
                    a = a.split(Rails.root.to_s).last # events_controller.rb:57:in `new'
         | 
| 70 | 
            +
                    a = a.split("\:")
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    file = a[0].strip
         | 
| 73 | 
            +
                    line_number = a[1].strip
         | 
| 74 | 
            +
                    method = a[2].strip.gsub("in \`", "").gsub("\'", "")
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    hash["class"] = self.klass_name
         | 
| 77 | 
            +
                    hash["method"] = "#{file}##{method}:#{line_number}"
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    variables = []
         | 
| 80 | 
            +
             | 
| 57 81 | 
             
                    @context_binding.local_variables.each do |var|
         | 
| 58 82 | 
             
                      next if EXCLUDE_INSTANCE_VARIABLES.include?(var.to_s)
         | 
| 59 | 
            -
                      hash[var] = @context_binding.local_variable_get(var)
         | 
| 60 83 |  | 
| 61 | 
            -
                       | 
| 62 | 
            -
             | 
| 84 | 
            +
                      value = @context_binding.local_variable_get(var)
         | 
| 85 | 
            +
                      klass = self.class.type_of(value)
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      variables << {
         | 
| 88 | 
            +
                        name: var,
         | 
| 89 | 
            +
                        value: value,
         | 
| 90 | 
            +
                        klass: klass
         | 
| 91 | 
            +
                      }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                      if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
         | 
| 94 | 
            +
                        variables << {
         | 
| 95 | 
            +
                          name: "#{var}_count",
         | 
| 96 | 
            +
                          value: value.count,
         | 
| 97 | 
            +
                          klass: nil
         | 
| 98 | 
            +
                        }
         | 
| 63 99 | 
             
                      end
         | 
| 64 100 | 
             
                    end
         | 
| 65 101 |  | 
| 66 102 | 
             
                    @context.instance_variables.each do |var|
         | 
| 67 103 | 
             
                      next if EXCLUDE_INSTANCE_VARIABLES.include?(var.to_s)
         | 
| 68 104 |  | 
| 69 | 
            -
                       | 
| 70 | 
            -
                       | 
| 105 | 
            +
                      value = @context.instance_variable_get(var.to_sym)
         | 
| 106 | 
            +
                      klass = self.class.type_of(value)
         | 
| 71 107 |  | 
| 72 | 
            -
                       | 
| 108 | 
            +
                      variables << {
         | 
| 109 | 
            +
                        name: var,
         | 
| 110 | 
            +
                        value: value,
         | 
| 111 | 
            +
                        klass: klass
         | 
| 112 | 
            +
                      }
         | 
| 73 113 |  | 
| 74 | 
            -
                      if  | 
| 75 | 
            -
                         | 
| 114 | 
            +
                      if value.is_a?(ActiveRecord::AssociationRelation) and value.respond_to?(:count)
         | 
| 115 | 
            +
                        variables << {
         | 
| 116 | 
            +
                          name: "#{var}_count",
         | 
| 117 | 
            +
                          value: value.count,
         | 
| 118 | 
            +
                          klass: nil
         | 
| 119 | 
            +
                        }
         | 
| 76 120 | 
             
                      end
         | 
| 77 121 | 
             
                    end
         | 
| 78 122 |  | 
| 123 | 
            +
                    hash["variables"] = variables
         | 
| 124 | 
            +
             | 
| 79 125 | 
             
                    hash
         | 
| 80 126 | 
             
                  end
         | 
| 81 127 |  | 
| 82 128 | 
             
                  def klass_name
         | 
| 83 | 
            -
                    if @context.class == "Class"
         | 
| 129 | 
            +
                    value = if @context.class == "Class"
         | 
| 84 130 | 
             
                      @context
         | 
| 85 131 | 
             
                    else
         | 
| 86 132 | 
             
                      @context.class
         | 
| 87 133 | 
             
                    end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    value.to_s
         | 
| 88 136 | 
             
                  end
         | 
| 89 137 |  | 
| 90 138 | 
             
                  # def context_caller
         | 
    
        data/lib/localtower/version.rb
    CHANGED
    
    
    
        data/public/js/app.js
    CHANGED
    
    | @@ -2,10 +2,16 @@ window.MainApp = {}; | |
| 2 2 |  | 
| 3 3 | 
             
            MainApp = {
         | 
| 4 4 | 
             
              init: function() {
         | 
| 5 | 
            -
             | 
| 6 5 | 
             
              },
         | 
| 7 6 |  | 
| 8 7 | 
             
              ready: function() {
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                $(".json").each(function() {
         | 
| 10 | 
            +
                  var $el = $(this);
         | 
| 11 | 
            +
                  var done = MainApp.syntaxHighlight($el.text());
         | 
| 12 | 
            +
                  $el.html(done);
         | 
| 13 | 
            +
                });
         | 
| 14 | 
            +
             | 
| 9 15 | 
             
                MainApp.whenActionOnElement("click", "duplicate", function(e) {
         | 
| 10 16 | 
             
                  e.preventDefault();
         | 
| 11 17 | 
             
                  MainApp.duplicateLine();
         | 
| @@ -41,7 +47,28 @@ MainApp = { | |
| 41 47 | 
             
                });
         | 
| 42 48 | 
             
              },
         | 
| 43 49 |  | 
| 44 | 
            -
              // INSTANCE
         | 
| 50 | 
            +
              // INSTANCE --------------------------------------------------
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              syntaxHighlight: function(json) {
         | 
| 53 | 
            +
                json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
         | 
| 54 | 
            +
                return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function(match) {
         | 
| 55 | 
            +
                  var cls = 'number';
         | 
| 56 | 
            +
                  if (/^"/.test(match)) {
         | 
| 57 | 
            +
                    if (/:$/.test(match)) {
         | 
| 58 | 
            +
                      cls = 'key';
         | 
| 59 | 
            +
                    } else {
         | 
| 60 | 
            +
                      cls = 'string';
         | 
| 61 | 
            +
                    }
         | 
| 62 | 
            +
                  } else if (/true|false/.test(match)) {
         | 
| 63 | 
            +
                    cls = 'boolean';
         | 
| 64 | 
            +
                  } else if (/null/.test(match)) {
         | 
| 65 | 
            +
                    cls = 'null';
         | 
| 66 | 
            +
                  }
         | 
| 67 | 
            +
                  return '<span class="' + cls + '">' + match + '</span>';
         | 
| 68 | 
            +
                });
         | 
| 69 | 
            +
              },
         | 
| 70 | 
            +
             | 
| 71 | 
            +
             | 
| 45 72 |  | 
| 46 73 | 
             
              // This is a little bit dirty but it works well for the moment:
         | 
| 47 74 | 
             
              // We dynamically show/hide fields
         | 
| @@ -95,9 +122,10 @@ MainApp = { | |
| 95 122 |  | 
| 96 123 | 
             
                      nullable_input,
         | 
| 97 124 | 
             
                      nullable_label,
         | 
| 98 | 
            -
                    ], | 
| 99 | 
            -
                    el | 
| 100 | 
            -
             | 
| 125 | 
            +
                    ],
         | 
| 126 | 
            +
                    function(i, el) {
         | 
| 127 | 
            +
                      el.hide();
         | 
| 128 | 
            +
                    });
         | 
| 101 129 |  | 
| 102 130 | 
             
                  var mapping = {
         | 
| 103 131 | 
             
                    add_column: [
         |