crocon 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b7a9f4c23fc72ce034224faa7f2dfe3b4f9fd947
4
+ data.tar.gz: abcbd12171cf812369df816988926a6e3ffb4a31
5
+ SHA512:
6
+ metadata.gz: 44ed9441c980993347cdf7a3d3ede8dbe6a172ecb54feb3c6d277a5682ae3dd7706968cb04c9beee619a2a1ed6de1f11e63ccd39ae534f1ecef7da10fee14011
7
+ data.tar.gz: 159925da2a917cfd1438603300aed24e8df1dd4534613ee84ce8821fa4042fb4e869875f4d16769e79271cdfebe57eb8d2d07a2118c8ff6e5bf90f58ab873f85
@@ -0,0 +1,283 @@
1
+ # Crocon 🐊
2
+
3
+ **Crocon makes developer console great again.**
4
+
5
+ Crocon is a Javascript wrapper for browser's developer console. Its goal is to make debugging
6
+ painless, convenient and beautiful.
7
+
8
+ This is a Rails gem version of the library. For source files and an npm package, go [here](https://github.com/akxcv/crocon).
9
+
10
+ ## Installation
11
+
12
+ Add this to your `Gemfile`:
13
+ ```
14
+ gem 'crocon'
15
+ ```
16
+
17
+ Add this to your `application.js`:
18
+ ```
19
+ //= require crocon
20
+ ```
21
+
22
+ Add this to your `application.css`:
23
+ ```
24
+ *= require crocon
25
+ ```
26
+
27
+ ## Why?
28
+
29
+ The builtin developer console in modern browsers suffers from a number of problems. Here are some
30
+ of the big ones:
31
+
32
+ **There's no good way to turn logging on/off.**
33
+
34
+ Most of the time you don't want your clients to
35
+ see debugging output in their console on your production website. But, `console.log` does not
36
+ care if it runs in development or production, it's going to log anyway. This leads to developers
37
+ seldom using the console *or* writing `console.log` over and over again just to erase
38
+ it afterwards (...just to write it back again afterwards, and so on). Disabling the console
39
+ is still possible (e.x. `if (!debug) console.log = function () {}`), but it's not a good solution
40
+ if you use other console methods (which you should!). Also, imagine you want to be able to
41
+ see debugging output in production while normal website users don't see anything. What do you do?
42
+
43
+ Crocon solves this problem by introducing a flexible enable/disable mechanism. First of all, you
44
+ can enable or disable it during initialization: `crocon = new Crocon({ enabled: debug })`
45
+ (assuming that `debug` is `true` in development and `false` in production). But also, you can
46
+ enable or disable Crocon in your browser (`crocon.enable()` or `crocon.disable()`), which will
47
+ override the global `enabled` option. Thus, you can easily switch Crocon on/off in any environment,
48
+ and it will only affect *your* console.
49
+
50
+ See [initialization options](#initialization-options).
51
+
52
+ **`console.group` is a great idea, but it's not implemented well**
53
+
54
+ With [`console.group`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#group) you can split your output in foldable groups, which is a *very* good thing
55
+ to be able to do. However, a lot of JS these days is *asynchronous*, which is something you have
56
+ to constantly think about if you want to group your output.
57
+
58
+ Consider this simple scenario:
59
+
60
+ ```js
61
+ async function f1() {
62
+ console.group('group 1');
63
+ console.log('function 1 start');
64
+ await sleep(1000);
65
+ console.log('function 1 end');
66
+ console.groupEnd();
67
+ }
68
+
69
+ async function f2() {
70
+ console.group('group 2');
71
+ console.log('function 2 start');
72
+ await sleep(500);
73
+ console.log('function 2 end');
74
+ console.groupEnd();
75
+ }
76
+
77
+ f1(); f2()
78
+ ```
79
+
80
+ Result:
81
+
82
+ ![Async and groups](/images/async_console_groups.png?raw=true)
83
+
84
+ Crocon solves this by creating a different implementation of groups. With Crocon, you can use
85
+ groups like this:
86
+
87
+ ```js
88
+ crocon.group('my namespace').log('hello from my namespace')
89
+ /* or */
90
+ crocon.group('my namespace', function () {
91
+ crocon.log('hello from my namespace')
92
+ /* ... */
93
+ })
94
+ ```
95
+
96
+ See [grouping](#grouping)
97
+
98
+ **`console.log` supports formatting with CSS, but it's not convenient**
99
+
100
+ `console` supports formatting with CSS rules:
101
+
102
+ ```js
103
+ console.log('roses are %cred%c, violets are %cblue', 'color: red;', 'color: black;', 'color: blue;')
104
+ ```
105
+
106
+ Result:
107
+
108
+ ![Console formatting](/images/console_formatting.png?raw=true)
109
+
110
+ This is awesome, but really not convenient.
111
+
112
+ Crocon makes formatting much easier by introducing a markdown-like syntax. See [formatting](#formatting).
113
+
114
+ ## Browser support
115
+
116
+ TBD
117
+
118
+ ## Usage
119
+
120
+ Methods that work exactly like their console's counterparts:
121
+
122
+ - [`assert`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#assert)
123
+ - [`count`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#count)
124
+ - [`debug`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#consoledebugobject_object)
125
+ [also supports formatting](#formatting)
126
+ - [`dir`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#dir)
127
+ - [`dirxml`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#consoledirxmlobject)
128
+ - [`error`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#error)
129
+ [also supports formatting](#formatting), see [known issues](#known-issues)
130
+ - [`info`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#consoleinfoobject_object) [also supports formatting](#formatting)
131
+ - [`log`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#log)
132
+ [also supports formatting](#formatting)
133
+ - [`timeStamp`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#timestamp)
134
+ - [`trace`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#trace)
135
+ see [known issues](#known-issues)
136
+ - [`warn`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#warn)
137
+ [also supports formatting](#formatting)
138
+
139
+ Also:
140
+
141
+ - [`profile` and `profileEnd`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#profile)
142
+ as well as
143
+ [`time` and `timeEnd`](https://developers.google.com/web/tools/chrome-devtools/console/console-reference#time)
144
+ support lambda syntax:
145
+
146
+ ```js
147
+ crocon.profile('profile1')
148
+ myVar = myFunction()
149
+ crocon.profileEnd()
150
+
151
+ /* is the same as */
152
+
153
+ myVar = crocon.profile('profile1', myFunction)
154
+ ```
155
+
156
+ - `group` is described in [grouping](#grouping).
157
+
158
+ ### Initialization options
159
+
160
+ ```js
161
+ crocon = new Crocon({
162
+ enabled: true,
163
+ enableFormatting: true,
164
+ collapseGroups: false,
165
+ modifyConsole: true
166
+ })
167
+ ```
168
+ - `enabledByDefault`: Defines whether to enable or disable Crocon.
169
+ When Crocon is disabled, it will not produce any output. However, lambda versions of `profile`, `time` and `group` will still execute given functions. Default: `true`.
170
+ - `enableFormatting`: Defines whether [formatting](#formatting) should be enabled. Default: `true`.
171
+ - `collapseGroups`: Defines whether [groups](#grouping) should be
172
+ collapsed or not. Default: `false` (expanded).
173
+ - `modifyConsole`: Defines whether Crocon needs to modify `console` upon initialization.
174
+ Generally, modifying global objects is a bad thing to do, but this is required if you want Crocon to
175
+ handle console output correctly. Crocon is modifying `console` functions *very carefully* (it just
176
+ needs to hook to those methods). You can safely disable this options, but regular console output
177
+ will occasionally get stuck inside groups it does not belong to. see [known issues](#known-issues). Default: `true`.
178
+
179
+ ### Grouping
180
+
181
+ Groups in Crocon work a little different from console's groups. There are two ways to group the output.
182
+
183
+ ```js
184
+ /* method 1 */
185
+ crocon.group('group one').log('inside group 1')
186
+
187
+ /* method 2 */
188
+ crocon.group('group one', function () {
189
+ crocon.log('inside group 1')
190
+ })
191
+ ```
192
+
193
+ You can easily mix methods together and nest groups however you want:
194
+
195
+ ```js
196
+ crocon.group('user login', function () {
197
+ crocon.info('user login started')
198
+ crocon.group('credentials').log('credentials are [correct].green')
199
+ /* code */
200
+ crocon.info('[success].badge.green')
201
+ })
202
+
203
+ crocon.group('group 1').log('some more output')
204
+ crocon.group('group 1', 'another group!').log('still nested correctly')
205
+ ```
206
+
207
+ Output:
208
+
209
+ ![Group output](/images/group_output.png?raw=true)
210
+
211
+ When `document` is not in focus (e.g. your console is in focus), the output becomes:
212
+
213
+ ![Inline group output](/images/inline_group_output.png?raw=true)
214
+
215
+ This behaviour is explained in [known issues](#known-issues).
216
+
217
+ ### Formatting
218
+
219
+ Crocon supports Markdown-like string formatting. Here's the options:
220
+ - `**bold**`
221
+ - `*italic*`
222
+ - `~strikethrough~`
223
+ - `_underline_`
224
+ - `[custom text].classOne.classTwo...`. This syntax allows you to apply CSS classes to text in
225
+ square brackets. Available classes are: `badge`, `bold`, `italic`, `strikethrough`, `underline` and [color classes](#color-classes).
226
+
227
+ At the moment, you cannot nest formatting options into each other.
228
+ Objects and functions are not formattable, but they likely will be in the future.
229
+
230
+ #### Color classes
231
+
232
+ Crocon supports following color classes (both for badges and normal text):
233
+ - `.blue`
234
+ - `.orange`
235
+ - `.red`
236
+ - `.green`
237
+ - `.cyan`
238
+ - `.purple`
239
+
240
+ #### Adding custom / overriding existing styles
241
+
242
+ All styles are declared in a stylesheet and thus are easily extensible.
243
+ See [`index.scss`](index.scss).
244
+ At the moment, only these attributes are supported: `margin`, `color`, `background-color`,
245
+ `border-radius`, `padding`, `font-weight`, `font-style`, `text-decoration`.
246
+
247
+ ## Known issues
248
+
249
+ - **There's no way to detect when console output happens**. Development tools are separate from `window` and `document`,
250
+ and there is no way to know if the output is happening. We can detect things like `console.log`
251
+ by modifying those functions (hence the `modifyConsole` init parameter), but we cannot know when,
252
+ say, an error thrown with `throw` is going to appear in console. Groups are implemented in such a way that they don't get closed
253
+ until it's necessary, so that leads to console output being stuck inside groups it doesn't belong to.
254
+ Part of the problem is solved by modifying `console`, but another part is not solvable without a browser extension.
255
+ The best we can do is to detect whether or not `document` is in focus (with `document.hasFocus()`).
256
+ This enables us to change how groups work if `document` is not in focus (say, `console` is in focus).
257
+ However, some things (like `throw` or click on the "clear console" button) are simply not catchable.
258
+ So, **some output will inevitably get stuck in a group it doesn't belong**. Beware of this, especially when using `collapseGroups = true`.
259
+
260
+ - **Stack traces from `crocon.error` and `crocon.trace` contain unneeded information**.
261
+ Since `crocon.error` and `crocon.trace` call some functions under the hood, the stack trace produced
262
+ by those functions will contain several unneeded calls.
263
+
264
+ *All of this is according to the author's research. If you know a solution to this problem, you're
265
+ highly encouraged to open an issue and/or a pull request at [akxcv/crocon](https://github.com/akxcv/crocon).*
266
+
267
+ ## Contributing
268
+
269
+ Bug reports and pull requests are welcome on GitHub at https://github.com/akxcv/crocon.
270
+
271
+ ## License
272
+
273
+ The package is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
274
+
275
+ ## TODO
276
+
277
+ - Support nested styles
278
+ - Log history
279
+ - Replace stylesheet with in-memory CSS?
280
+ - Focus mode (see only the logs you need **right now**)
281
+ - Custom styles in formatting (e.x. `[my text]{color: #434433;}`)
282
+ - Browser support
283
+ - Object and function formatting
@@ -0,0 +1,4 @@
1
+ require 'crocon/rails'
2
+
3
+ module Crocon
4
+ end
@@ -0,0 +1,7 @@
1
+ require "crocon/rails/engine"
2
+ require "crocon/rails/version"
3
+
4
+ module Crocon
5
+ module Rails
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module Crocon
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Crocon
2
+ module Rails
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
+ window.Crocon=require("./src/index");
3
+ },{"./src/index":5}],2:[function(require,module,exports){
4
+ var BrowserAdapter={log:console.log,debug:console.debug,info:console.info,warn:console.warn,error:console.error,group:console.group,groupCollapsed:console.groupCollapsed,groupEnd:console.groupEnd,assert:console.assert,count:console.count,dir:console.dir,dirxml:console.dirxml,profile:console.profile,profileEnd:console.profileEnd,time:console.time,timeEnd:console.timeEnd,timeStamp:console.timeStamp,trace:console.trace};module.exports=BrowserAdapter;
5
+
6
+ },{}],3:[function(require,module,exports){
7
+ var Formatter={format:function(t){var e,r=[],a=[],s=0;for(var o in t){var n=this.formatObject(t[o]);if("undefined"==typeof n||!n[1].length)break;r.push(n[0]),a.push.apply(a,n[1]),s+=1}return t.splice(0,s),e=[],r.length&&(e.push(r.join(" ")),e.push.apply(e,a)),e.push.apply(e,t),e},formatObject:function(t){if("string"==typeof t)return this.formatString(t)},formatString:function(t){for(var e,r=[];this.canFormat(t);){var a=this.getRelevantMatch(t);e="string"==typeof a.format.classes?a.format.classes:a.format.classes(a.match),t=t.replace(a.format.regex,function(t,e){return"%c"+e+"%c"}),r.push(this.computeStyle(e)),r.push(this.computeStyle("default"))}return[t,r]},canFormat:function(t){for(var e in this.formats)if(this.formats[e].regex.test(t))return!0;return!1},getRelevantMatch:function(t){var e=[];for(var r in this.formats){var a=this.formats[r];a.regex.test(t)&&e.push({match:t.match(a.regex),format:a})}return e.sort(function(t,e){return t.match.index-e.match.index})[0]},computeStyle:function(t){var e=document.createElement("div");e.id="crocon",e.className=t,e.style="display: none;",document.getElementsByTagName("body")[0].appendChild(e);var r=getComputedStyle(e),a=[];for(var s in this.supportedStyles){var o=this.supportedStyles[s];a.push(o+":"+r.getPropertyValue(o))}return a.join(";")},supportedStyles:["margin","color","background-color","border-radius","padding","font-weight","font-style","text-decoration"],formats:[{regex:/\*\*([^\*]+)\*\*/,classes:"bold"},{regex:/\*([^\*]+)\*/,classes:"italic"},{regex:/~([^~]+)~/,classes:"strikethrough"},{regex:/_([^_]+)_/,classes:"underline"},{regex:/\[([^\[\]]+)\](\.[\.\w]+)/,classes:function(t){return t[2].split(".").join(" ")}}]};module.exports=Formatter;
8
+
9
+ },{}],4:[function(require,module,exports){
10
+ var BrowserAdapter=require("./browserAdapter"),GroupManager={currentStack:[],previousStack:[],globalStack:[],bindEvents:function(){var r=this;window.addEventListener("blur",function(){r.clear()})},group:function(r,t,e){if(e?(this.ungroup(!1),this.globalStack.push(t)):this.currentStack=t,document.hasFocus()){var o;if(e)for(o in t)BrowserAdapter[r](t[o]);else{var a=0;for(o in this.currentStack)this.previousStack[o]===this.currentStack[o]&&(a+=1);var n=this.previousStack.length-a;for(o=0;o<n;o++)BrowserAdapter.groupEnd();var c=this.currentStack.slice(a);for(o in c)BrowserAdapter[r](c[o])}}},ungroup:function(r){if(this.previousStack.length&&!this.currentStack.length&&this.previousStack.forEach(function(){BrowserAdapter.groupEnd()}),r){var t=this.globalStack.pop();t.forEach(function(){BrowserAdapter.groupEnd()})}this.previousStack=this.currentStack,this.currentStack=[]},clear:function(){this.previousStack.forEach(function(){BrowserAdapter.groupEnd()}),this.currentStack.forEach(function(){BrowserAdapter.groupEnd()}),this.previousStack=[]}};module.exports=GroupManager;
11
+ },{"./browserAdapter":2}],5:[function(require,module,exports){
12
+ function Crocon(o){var r={enabled:!0,enableFormatting:!0,collapseGroups:!1,modifyConsole:!0};o||(o={});for(var n in r)o.hasOwnProperty(n)||(o[n]=r[n]);if(this.enabled=o.enabled,this.enableFormatting=o.enableFormatting,this.collapseGroups=o.collapseGroups,this.formattableMethods=["log","info","debug","warn","error","focus"],GroupManager.bindEvents(),o.modifyConsole){var e=function(o,r){return GroupManager.clear(),BrowserAdapter[o].apply(BrowserAdapter,r)};console.log=function(){e("log",arguments)},console.debug=function(){e("debug",arguments)},console.info=function(){e("info",arguments)},console.warn=function(){e("warn",arguments)},console.error=function(){e("error",arguments)},console.assert=function(){e("assert",arguments)},console.clear=function(){GroupManager.clear()},console.count=function(){e("count",arguments)},console.dir=function(){e("dir",arguments)},console.dirxml=function(){e("dirxml",arguments)},console.group=function(){e("group",arguments)},console.groupCollapsed=function(){e("groupCollapsed",arguments)},console.groupEnd=function(){e("groupEnd",arguments)},console.profile=function(){e("profile",arguments)},console.profileEnd=function(){e("profileEnd",arguments)},console.time=function(){e("time",arguments)},console.timeEnd=function(){e("timeEnd",arguments)},console.timeStamp=function(){e("timeStamp",arguments)},console.trace=function(){e("trace",arguments)}}}var GroupManager=require("./groupManager"),BrowserAdapter=require("./browserAdapter"),Formatter=require("./formatter");Crocon.prototype={log:function(){this.print("log",[].slice.call(arguments))},debug:function(){this.print("debug",[].slice.call(arguments))},info:function(){this.print("info",[].slice.call(arguments))},warn:function(){this.print("warn",[].slice.call(arguments))},error:function(){this.print("error",[].slice.call(arguments))},assert:function(){this.print("assert",[].slice.call(arguments))},count:function(o){this.print("count",[o])},dir:function(o){this.print("dir",[o])},dirxml:function(o){this.print("dirxml",[o])},profile:function(){var o=[].slice.call(arguments),r=o.pop();if("function"==typeof r){this._isEnabled()&&BrowserAdapter.profile(o[0]);var n=r.call();return this.profileEnd(),n}this._isEnabled()&&BrowserAdapter.profile(o[0])},profileEnd:function(){this._isEnabled()&&BrowserAdapter.profileEnd()},time:function(){var o=[].slice.call(arguments),r=o.pop();if("function"==typeof r){this._isEnabled()&&BrowserAdapter.time(o[0]);var n=r.call();return this.timeEnd(o[0]),n}this._isEnabled()&&BrowserAdapter.time(o[0])},timeEnd:function(o){this._isEnabled()&&BrowserAdapter.timeEnd(o)},timeStamp:function(o){this._isEnabled()&&BrowserAdapter.timeStamp(o)},trace:function(o){this.print("trace",[o])},group:function(){var o=[].slice.call(arguments),r=this.collapseGroups?"groupCollapsed":"group";if("function"==typeof o[o.length-1]){var n=o.pop();this._isEnabled()&&GroupManager.group(r,o,!0);var e=n.call();return this._isEnabled()&&GroupManager.ungroup(!0),e}return this._isEnabled()&&GroupManager.group(r,o),this},print:function(o,r){if(GroupManager.ungroup(),this._isEnabled()){var n=!document.hasFocus()&&GroupManager.previousStack.length+GroupManager.globalStack.length;if(n){var e=[],t=GroupManager.previousStack;t.unshift.apply(t,GroupManager.globalStack.reduce(function(o,r){return o.concat(r)},[])),GroupManager.previousStack=[];for(var i in t)e.push(t[i]);var a=e.join(" -> ")+" :: ";"string"==typeof r[0]?r[0]=a+r[0]:r.unshift(a)}this.formattableMethods.indexOf(o)>-1&&this.enableFormatting&&(r=Formatter.format(r)),n?(BrowserAdapter.groupCollapsed.apply(BrowserAdapter,r),BrowserAdapter.groupEnd()):BrowserAdapter[o].apply(BrowserAdapter,r)}},enable:function(){localStorage&&localStorage.setItem("croconEnabled","true")},disable:function(){localStorage&&localStorage.setItem("croconEnabled","false")},_isEnabled:function(){return localStorage&&localStorage.croconEnabled?"false"!==localStorage.croconEnabled:this.enabled}},module.exports=Crocon;
13
+ },{"./browserAdapter":2,"./formatter":3,"./groupManager":4}]},{},[1]);
@@ -0,0 +1,55 @@
1
+ #crocon {
2
+ color: black;
3
+ background-color: transparent;
4
+ border-radius: 0;
5
+ padding: 0;
6
+ margin: 0;
7
+ font-weight: normal;
8
+ font-style: normal; }
9
+ #crocon.badge {
10
+ color: white;
11
+ background-color: black;
12
+ border-radius: 3px;
13
+ padding: 2px;
14
+ margin: 0 2px; }
15
+ #crocon.badge.blue {
16
+ color: white;
17
+ background-color: #61afef; }
18
+ #crocon.badge.orange {
19
+ color: white;
20
+ background-color: #d19a66; }
21
+ #crocon.badge.red {
22
+ color: white;
23
+ background-color: #e06c75; }
24
+ #crocon.badge.green {
25
+ color: white;
26
+ background-color: #98c379; }
27
+ #crocon.badge.cyan {
28
+ color: white;
29
+ background-color: #56b6c2; }
30
+ #crocon.badge.purple {
31
+ color: white;
32
+ background-color: #c678dd; }
33
+ #crocon.badge.focus {
34
+ color: #bada55;
35
+ background: #444; }
36
+ #crocon.blue {
37
+ color: #4078f2; }
38
+ #crocon.orange {
39
+ color: #986801; }
40
+ #crocon.red {
41
+ color: #e45649; }
42
+ #crocon.green {
43
+ color: #50a14f; }
44
+ #crocon.cyan {
45
+ color: #0184bc; }
46
+ #crocon.purple {
47
+ color: #a626a4; }
48
+ #crocon.bold {
49
+ font-weight: bold; }
50
+ #crocon.italic {
51
+ font-style: italic; }
52
+ #crocon.strikethrough {
53
+ text-decoration: line-through; }
54
+ #crocon.underline {
55
+ text-decoration: underline; }
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crocon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Komarov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: |-
14
+ Crocon is a Javascript wrapper for browser's developer console.
15
+ Its goal is to make debugging painless, convenient and beautiful.
16
+ email:
17
+ - ak@akxcv.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - README.md
23
+ - lib/crocon.rb
24
+ - lib/crocon/rails.rb
25
+ - lib/crocon/rails/engine.rb
26
+ - lib/crocon/rails/version.rb
27
+ - vendor/assets/javascripts/crocon.js
28
+ - vendor/assets/stylesheets/crocon.css
29
+ homepage: https://github.com/akxcv/crocon
30
+ licenses:
31
+ - MIT
32
+ metadata: {}
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubyforge_project:
49
+ rubygems_version: 2.6.8
50
+ signing_key:
51
+ specification_version: 4
52
+ summary: Make your console great again
53
+ test_files: []