crocon 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.
@@ -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: []