logster 2.1.2 → 2.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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,27 +1,27 @@
1
- ---
2
- language: node_js
3
- node_js:
4
- - "6"
5
-
6
- sudo: false
7
- dist: trusty
8
-
9
- addons:
10
- chrome: stable
11
-
12
- cache:
13
- directories:
14
- - $HOME/.npm
15
-
16
- env:
17
- global:
18
- # See https://git.io/vdao3 for details.
19
- - JOBS=1
20
-
21
- before_install:
22
- - npm config set spin false
23
-
24
- script:
25
- - npm run lint:hbs
26
- - npm run lint:js
27
- - npm test
1
+ ---
2
+ language: node_js
3
+ node_js:
4
+ - "6"
5
+
6
+ sudo: false
7
+ dist: trusty
8
+
9
+ addons:
10
+ chrome: stable
11
+
12
+ cache:
13
+ directories:
14
+ - $HOME/.npm
15
+
16
+ env:
17
+ global:
18
+ # See https://git.io/vdao3 for details.
19
+ - JOBS=1
20
+
21
+ before_install:
22
+ - npm config set spin false
23
+
24
+ script:
25
+ - npm run lint:hbs
26
+ - npm run lint:js
27
+ - npm test
@@ -1,3 +1,3 @@
1
- {
2
- "ignore_dirs": ["tmp", "dist"]
3
- }
1
+ {
2
+ "ignore_dirs": ["tmp", "dist"]
3
+ }
@@ -1,57 +1,57 @@
1
- # client-app
2
-
3
- This README outlines the details of collaborating on this Ember application.
4
- A short introduction of this app could easily go here.
5
-
6
- ## Prerequisites
7
-
8
- You will need the following things properly installed on your computer.
9
-
10
- * [Git](https://git-scm.com/)
11
- * [Node.js](https://nodejs.org/) (with npm)
12
- * [Ember CLI](https://ember-cli.com/)
13
- * [Google Chrome](https://google.com/chrome/)
14
-
15
- ## Installation
16
-
17
- * `git clone <repository-url>` this repository
18
- * `cd client-app`
19
- * `npm install`
20
-
21
- ## Running / Development
22
-
23
- * `ember serve`
24
- * Visit your app at [http://localhost:4200](http://localhost:4200).
25
- * Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests).
26
-
27
- ### Code Generators
28
-
29
- Make use of the many generators for code, try `ember help generate` for more details
30
-
31
- ### Running Tests
32
-
33
- * `ember test`
34
- * `ember test --server`
35
-
36
- ### Linting
37
-
38
- * `npm run lint:hbs`
39
- * `npm run lint:js`
40
- * `npm run lint:js -- --fix`
41
-
42
- ### Building
43
-
44
- * `ember build` (development)
45
- * `ember build --environment production` (production)
46
-
47
- ### Deploying
48
-
49
- Specify what it takes to deploy your app.
50
-
51
- ## Further Reading / Useful Links
52
-
53
- * [ember.js](https://emberjs.com/)
54
- * [ember-cli](https://ember-cli.com/)
55
- * Development Browser Extensions
56
- * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
57
- * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)
1
+ # client-app
2
+
3
+ This README outlines the details of collaborating on this Ember application.
4
+ A short introduction of this app could easily go here.
5
+
6
+ ## Prerequisites
7
+
8
+ You will need the following things properly installed on your computer.
9
+
10
+ * [Git](https://git-scm.com/)
11
+ * [Node.js](https://nodejs.org/) (with npm)
12
+ * [Ember CLI](https://ember-cli.com/)
13
+ * [Google Chrome](https://google.com/chrome/)
14
+
15
+ ## Installation
16
+
17
+ * `git clone <repository-url>` this repository
18
+ * `cd client-app`
19
+ * `npm install`
20
+
21
+ ## Running / Development
22
+
23
+ * `ember serve`
24
+ * Visit your app at [http://localhost:4200](http://localhost:4200).
25
+ * Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests).
26
+
27
+ ### Code Generators
28
+
29
+ Make use of the many generators for code, try `ember help generate` for more details
30
+
31
+ ### Running Tests
32
+
33
+ * `ember test`
34
+ * `ember test --server`
35
+
36
+ ### Linting
37
+
38
+ * `npm run lint:hbs`
39
+ * `npm run lint:js`
40
+ * `npm run lint:js -- --fix`
41
+
42
+ ### Building
43
+
44
+ * `ember build` (development)
45
+ * `ember build --environment production` (production)
46
+
47
+ ### Deploying
48
+
49
+ Specify what it takes to deploy your app.
50
+
51
+ ## Further Reading / Useful Links
52
+
53
+ * [ember.js](https://emberjs.com/)
54
+ * [ember-cli](https://ember-cli.com/)
55
+ * Development Browser Extensions
56
+ * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
57
+ * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)
File without changes
@@ -1,43 +1,43 @@
1
- import Component from "@ember/component";
2
- import { observer } from "@ember/object";
3
-
4
- export default Component.extend({
5
- showMenu: false,
6
- tagName: "span",
7
-
8
- init() {
9
- this._super(...arguments);
10
- this.bindingFunction = this.bindingFunction.bind(this);
11
- },
12
-
13
- bindingFunction(event) {
14
- const context = this.$()[0];
15
- if (!Em.$.contains(context, event.target) && context !== event.target) {
16
- this.set("showMenu", false);
17
- }
18
- },
19
-
20
- bindDocument: observer("showMenu", function() {
21
- const $document = Em.$(document);
22
- if (this.get("showMenu")) {
23
- $document.on("click", this.get("bindingFunction"));
24
- } else {
25
- $document.off("click", this.get("bindingFunction"));
26
- }
27
- }),
28
-
29
- willDestroyElement() {
30
- this._super(...arguments);
31
- const $document = Em.$(document);
32
- $document.off("click", this.get("bindingFunction"));
33
- },
34
-
35
- actions: {
36
- expandMenu() {
37
- this.toggleProperty("showMenu");
38
- },
39
- share() {
40
- this.share();
41
- }
42
- }
43
- });
1
+ import Component from "@ember/component";
2
+ import { observer } from "@ember/object";
3
+
4
+ export default Component.extend({
5
+ showMenu: false,
6
+ tagName: "span",
7
+
8
+ init() {
9
+ this._super(...arguments);
10
+ this.bindingFunction = this.bindingFunction.bind(this);
11
+ },
12
+
13
+ bindingFunction(event) {
14
+ const context = this.$()[0];
15
+ if (!Em.$.contains(context, event.target) && context !== event.target) {
16
+ this.set("showMenu", false);
17
+ }
18
+ },
19
+
20
+ bindDocument: observer("showMenu", function() {
21
+ const $document = Em.$(document);
22
+ if (this.get("showMenu")) {
23
+ $document.on("click", this.get("bindingFunction"));
24
+ } else {
25
+ $document.off("click", this.get("bindingFunction"));
26
+ }
27
+ }),
28
+
29
+ willDestroyElement() {
30
+ this._super(...arguments);
31
+ const $document = Em.$(document);
32
+ $document.off("click", this.get("bindingFunction"));
33
+ },
34
+
35
+ actions: {
36
+ expandMenu() {
37
+ this.toggleProperty("showMenu");
38
+ },
39
+ share() {
40
+ this.share();
41
+ }
42
+ }
43
+ });
@@ -1,80 +1,80 @@
1
- import Component from "@ember/component";
2
- import { computed } from "@ember/object";
3
- import { buildHashString } from "client-app/lib/utilities";
4
- import Preload from "client-app/lib/preload";
5
-
6
- export default Component.extend({
7
- current: 1,
8
-
9
- didUpdateAttrs() {
10
- this.setProperties({
11
- current: 1,
12
- expanded: null
13
- });
14
- },
15
-
16
- isEnvArray: computed("message.env", function() {
17
- return Array.isArray(this.get("message.env"));
18
- }),
19
-
20
- html: computed("isEnvArray", "current", "expanded.[]", function() {
21
- if (!this.get("isEnvArray")) {
22
- return buildHashString(this.get("message.env"));
23
- } else {
24
- const currentEnv = Em.$.extend(
25
- {},
26
- this.get("message.env")[this.get("current") - 1]
27
- );
28
- const expandableKeys = Preload.get("env_expandable_keys") || [];
29
- expandableKeys.forEach(key => {
30
- if (currentEnv.hasOwnProperty(key) && !Array.isArray(currentEnv[key])) {
31
- const list = [currentEnv[key]];
32
- this.get("message.env").forEach(env => {
33
- if (env[key] && list.indexOf(env[key]) === -1) {
34
- list.push(env[key]);
35
- }
36
- });
37
- currentEnv[key] = list.length > 1 ? list : list[0];
38
- }
39
- });
40
- return buildHashString(currentEnv, false, this.get("expanded") || []);
41
- }
42
- }),
43
-
44
- click(e) {
45
- const $elem = Em.$(e.target);
46
- const dataKey = $elem.attr("data-key");
47
- const expandableKeys = Preload.get("env_expandable_keys") || [];
48
- if (
49
- expandableKeys.indexOf(dataKey) !== -1 &&
50
- $elem.hasClass("expand-list")
51
- ) {
52
- e.preventDefault();
53
- if (!this.get("expanded")) {
54
- this.set("expanded", [dataKey]);
55
- } else {
56
- this.get("expanded").pushObject(dataKey);
57
- }
58
- }
59
- },
60
-
61
- disableBackButtons: computed("current", function() {
62
- return this.get("current") === 1;
63
- }),
64
-
65
- disableForwardButtons: computed("current", "message.env.length", function() {
66
- return this.get("current") === this.get("message.env.length");
67
- }),
68
-
69
- actions: {
70
- takeStep(dir) {
71
- const amount = dir === "back" ? -1 : 1;
72
- this.set("current", this.get("current") + amount);
73
- },
74
-
75
- bigJump(dir) {
76
- const newCurrent = dir === "back" ? 1 : this.get("message.env.length");
77
- this.set("current", newCurrent);
78
- }
79
- }
80
- });
1
+ import Component from "@ember/component";
2
+ import { computed } from "@ember/object";
3
+ import { buildHashString } from "client-app/lib/utilities";
4
+ import Preload from "client-app/lib/preload";
5
+
6
+ export default Component.extend({
7
+ current: 1,
8
+
9
+ didUpdateAttrs() {
10
+ this.setProperties({
11
+ current: 1,
12
+ expanded: null
13
+ });
14
+ },
15
+
16
+ isEnvArray: computed("message.env", function() {
17
+ return Array.isArray(this.get("message.env"));
18
+ }),
19
+
20
+ html: computed("isEnvArray", "current", "expanded.[]", function() {
21
+ if (!this.get("isEnvArray")) {
22
+ return buildHashString(this.get("message.env"));
23
+ } else {
24
+ const currentEnv = Em.$.extend(
25
+ {},
26
+ this.get("message.env")[this.get("current") - 1]
27
+ );
28
+ const expandableKeys = Preload.get("env_expandable_keys") || [];
29
+ expandableKeys.forEach(key => {
30
+ if (currentEnv.hasOwnProperty(key) && !Array.isArray(currentEnv[key])) {
31
+ const list = [currentEnv[key]];
32
+ this.get("message.env").forEach(env => {
33
+ if (env[key] && list.indexOf(env[key]) === -1) {
34
+ list.push(env[key]);
35
+ }
36
+ });
37
+ currentEnv[key] = list.length > 1 ? list : list[0];
38
+ }
39
+ });
40
+ return buildHashString(currentEnv, false, this.get("expanded") || []);
41
+ }
42
+ }),
43
+
44
+ click(e) {
45
+ const $elem = Em.$(e.target);
46
+ const dataKey = $elem.attr("data-key");
47
+ const expandableKeys = Preload.get("env_expandable_keys") || [];
48
+ if (
49
+ expandableKeys.indexOf(dataKey) !== -1 &&
50
+ $elem.hasClass("expand-list")
51
+ ) {
52
+ e.preventDefault();
53
+ if (!this.get("expanded")) {
54
+ this.set("expanded", [dataKey]);
55
+ } else {
56
+ this.get("expanded").pushObject(dataKey);
57
+ }
58
+ }
59
+ },
60
+
61
+ disableBackButtons: computed("current", function() {
62
+ return this.get("current") === 1;
63
+ }),
64
+
65
+ disableForwardButtons: computed("current", "message.env.length", function() {
66
+ return this.get("current") === this.get("message.env.length");
67
+ }),
68
+
69
+ actions: {
70
+ takeStep(dir) {
71
+ const amount = dir === "back" ? -1 : 1;
72
+ this.set("current", this.get("current") + amount);
73
+ },
74
+
75
+ bigJump(dir) {
76
+ const newCurrent = dir === "back" ? 1 : this.get("message.env.length");
77
+ this.set("current", newCurrent);
78
+ }
79
+ }
80
+ });
File without changes
File without changes
@@ -0,0 +1,109 @@
1
+ import Component from "@ember/component";
2
+ import { not } from "@ember/object/computed";
3
+ import { computed } from "@ember/object";
4
+ import Pattern from "client-app/models/pattern-item";
5
+ import { ajax } from "client-app/lib/utilities";
6
+
7
+ export default Component.extend({
8
+ immutable: not("mutable"),
9
+
10
+ init() {
11
+ this._super(...arguments);
12
+ if (this.get("patterns.length") < 1 && this.get("mutable")) {
13
+ this.send("create");
14
+ }
15
+ },
16
+
17
+ allPatterns: computed("patterns.[]", "newPatterns.[]", function() {
18
+ const patterns = this.get("patterns").map(pattern =>
19
+ Pattern.create({ value: pattern })
20
+ );
21
+ const newPatterns = this.get("newPatterns") || [];
22
+ return [...newPatterns.reverse(), ...patterns.reverse()];
23
+ }),
24
+
25
+ makeAPICall(data = {}) {
26
+ const { method } = data;
27
+ delete data.method;
28
+
29
+ return ajax(`/patterns/${this.get("key")}.json`, { method, data });
30
+ },
31
+
32
+ alwaysBlock(pattern) {
33
+ pattern.set("saving", false);
34
+ },
35
+
36
+ catchBlock(pattern, response) {
37
+ if (response.responseText) {
38
+ pattern.set("error", response.responseText);
39
+ } else {
40
+ pattern.set("error", "Unkown error occured. Please see dev console.");
41
+ }
42
+ },
43
+
44
+ requestInit(pattern) {
45
+ pattern.setProperties({
46
+ saving: true,
47
+ error: null
48
+ });
49
+ },
50
+
51
+ actions: {
52
+ create() {
53
+ if (!this.get("newPatterns")) {
54
+ this.set("newPatterns", []);
55
+ }
56
+ this.get("newPatterns").pushObject(Pattern.create({ isNew: true }));
57
+ },
58
+
59
+ trash(pattern) {
60
+ if (pattern.get("isNew")) {
61
+ this.get("newPatterns").removeObject(pattern);
62
+ pattern.destroy();
63
+ } else {
64
+ this.requestInit(pattern);
65
+ this.makeAPICall({
66
+ method: "DELETE",
67
+ pattern: pattern.get("value")
68
+ })
69
+ .then(() => {
70
+ this.get("patterns").removeObject(pattern.get("value"));
71
+ pattern.destroy();
72
+ })
73
+ .catch(response => this.catchBlock(pattern, response))
74
+ .always(() => this.alwaysBlock(pattern));
75
+ }
76
+ },
77
+
78
+ save(pattern) {
79
+ this.requestInit(pattern);
80
+ let promise;
81
+ if (pattern.get("isNew")) {
82
+ promise = this.makeAPICall({
83
+ method: "POST",
84
+ pattern: pattern.get("valueBuffer")
85
+ }).then(response => {
86
+ pattern.updateValue(response.pattern);
87
+ pattern.set("isNew", false);
88
+ this.get("patterns").pushObject(pattern.get("value"));
89
+ this.get("newPatterns").removeObject(pattern);
90
+ });
91
+ } else {
92
+ promise = this.makeAPICall({
93
+ method: "PUT",
94
+ pattern: pattern.get("value"),
95
+ new_pattern: pattern.get("valueBuffer")
96
+ }).then(response => {
97
+ const index = this.get("patterns").indexOf(pattern.get("value"));
98
+ pattern.updateValue(response.pattern);
99
+ this.get("patterns")[index] = pattern.get("value");
100
+ });
101
+ }
102
+ promise
103
+ .catch(response => {
104
+ this.catchBlock(pattern, response);
105
+ })
106
+ .always(() => this.alwaysBlock(pattern));
107
+ }
108
+ }
109
+ });