snitch_reporting 0.1.0 → 1.0.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -3
  3. data/app/assets/javascripts/snitch_reporting/snitch_report.js +60 -0
  4. data/app/assets/stylesheets/snitch_reporting/_variables.scss +5 -0
  5. data/app/assets/stylesheets/snitch_reporting/components.scss +120 -0
  6. data/app/assets/stylesheets/snitch_reporting/containers.scss +6 -0
  7. data/app/assets/stylesheets/snitch_reporting/default.scss +18 -0
  8. data/app/assets/stylesheets/snitch_reporting/forms.scss +36 -0
  9. data/app/assets/stylesheets/snitch_reporting/navigation.scss +37 -0
  10. data/app/assets/stylesheets/snitch_reporting/snitch_report.scss +1 -0
  11. data/app/assets/stylesheets/snitch_reporting/tables.scss +127 -0
  12. data/app/controllers/snitch_reporting/application_controller.rb +4 -0
  13. data/app/controllers/snitch_reporting/snitch_reports_controller.rb +167 -0
  14. data/app/helpers/snitch_reporting/params_helper.rb +38 -0
  15. data/app/helpers/snitch_reporting/snitch_report_helper.rb +2 -0
  16. data/app/models/snitch_reporting/service/json_wrapper.rb +5 -0
  17. data/app/models/snitch_reporting/snitch_comment.rb +7 -0
  18. data/app/models/snitch_reporting/snitch_history.rb +7 -0
  19. data/app/models/snitch_reporting/snitch_occurrence.rb +183 -0
  20. data/app/models/snitch_reporting/snitch_report.rb +301 -0
  21. data/app/models/snitch_reporting/snitch_tracker.rb +17 -0
  22. data/app/views/snitch_reporting/snitch_reports/_filters.html.erb +16 -0
  23. data/app/views/snitch_reporting/snitch_reports/_navigation.html.erb +0 -0
  24. data/app/views/snitch_reporting/snitch_reports/edit.html.erb +19 -0
  25. data/app/views/snitch_reporting/snitch_reports/index.html.erb +75 -0
  26. data/app/views/snitch_reporting/snitch_reports/show.html.erb +189 -0
  27. data/config/routes.rb +4 -1
  28. data/lib/generators/snitch_reporting/install/install_generator.rb +24 -0
  29. data/lib/generators/snitch_reporting/install/templates/install_snitch_reporting.rb +62 -0
  30. data/lib/snitch_reporting/engine.rb +3 -0
  31. data/lib/snitch_reporting/rack.rb +29 -0
  32. data/lib/snitch_reporting/version.rb +1 -1
  33. data/lib/snitch_reporting.rb +3 -1
  34. metadata +58 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42659deb579e275f8560748493f95ebb4567d7aec7f4111698babf36dda930b8
4
- data.tar.gz: fca0c396a544420d6e868971bbc1525349751db67b9f3cd699a77a5cb190b6b2
3
+ metadata.gz: 39e98ad05cdaa6ead3d81003f273cfdea222889ee63be8ef6503c31b29cfe055
4
+ data.tar.gz: 331b7c7e03b98ee862a21e41f33c05c97b25a12a45676ebb3a560f30c968b136
5
5
  SHA512:
6
- metadata.gz: f6712d89f7b64fe724cf7dfc176e739160599bf381c7fd2e7abd44b650638283f8a0d779a60b12ec4d12d80fef038ada009095da8cc45935637ceb1efa5dcfd4
7
- data.tar.gz: 54fe9f2331d2b424d0fd7f789648a423ed06c391731c972200ac5b15d4cd4635ffad067d48409d6501d25decb1b1f4dc2eb0be61c0669d33b375b28fb10bb01a
6
+ metadata.gz: 1cf2bb2295389d228b4718e9cb19bfa0699373ac65d3072f2bfe511557005e8128936269a6de657f959a3edd2001645574688e319a515c8eb1fb289c397f5cdd
7
+ data.tar.gz: 8d68383d8af3a2b93ed050b7fe77bcb5b3a32fcd7a33573b4cfaeddc13ee495b7bdebb8eb8609cb77fe0b04bd6a05a249cfefb0a3f8313c11b2fcd51376530ef
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # SnitchReporting
2
- Short description and motivation.
2
+ Snitch Reporting adds middleware to your Rails app to automatically track errors.
3
+ This is a self-hosted gem that plugs directly into your app.
3
4
 
4
5
  ## Usage
5
- How to use my plugin.
6
+ Install the gem, run the migrations, add to your middleware, then mount the route to view. Let the gem find and track your bugs for you!
6
7
 
7
8
  ## Installation
8
9
  Add this line to your application's Gemfile:
@@ -21,8 +22,27 @@ Or install it yourself as:
21
22
  $ gem install snitch_reporting
22
23
  ```
23
24
 
25
+ Add the migrations to your app with
26
+ ```bash
27
+ rails g snitch_reporting:install
28
+ rails db:migrate
29
+ ```
30
+
31
+ Add the middleware to your app by including the following in your application.rb
32
+ ```ruby
33
+ Rails.application.config.middleware.use SnitchReporting::Rack, ->(occurrence) {
34
+ # Use the `occurrence` and `occurrence.report` to retrieve the info and notify to your reception box of choice, whether it be Email, SMS, Slack, or some other API.
35
+ }
36
+ ```
37
+
24
38
  ## Contributing
25
- Contribution directions go here.
39
+ Lots of things to do, and would love some PRs! Feel free to pull the code down and submit a PR with some changes.
40
+ A few things I'd like to do:
41
+
42
+ [] Track/display how many unique users are affected by the error
43
+ [] Visually graph history of the error
44
+ [] Add commenting capabilities
45
+ [] Track history of changes, whether they be marking as resolved, commenting, etc.
26
46
 
27
47
  ## License
28
48
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,60 @@
1
+ document.addEventListener("change", function(evt) {
2
+ if (evt.target && evt.target.hasAttribute("data-mark-resolution-url")) {
3
+ var report_url = evt.target.getAttribute("data-mark-resolution-url")
4
+ var data = JSON.stringify({
5
+ snitch_report: {
6
+ resolved: evt.target.checked
7
+ }
8
+ })
9
+
10
+ fetch(report_url, {
11
+ headers: {
12
+ "Accept": "application/json",
13
+ "Content-Type": "application/json",
14
+ "X-CSRF-Token": document.querySelector("meta[name='csrf-token']").content
15
+ },
16
+ method: "PATCH",
17
+ body: data
18
+ })
19
+ }
20
+ })
21
+
22
+ // Must include Jquery
23
+ // Or rewrite to use pure JS
24
+ // $(document).ready(function() {
25
+ //
26
+ // function revealStacktrace() {
27
+ // $(".occurrence-details").addClass("hidden")
28
+ // $(window.location.hash).removeClass("hidden")
29
+ // $(".reveal-occurrence").removeClass("selected")
30
+ //
31
+ // if (window.location.hash == "") {
32
+ // $(".occurrence-details").first().removeClass("hidden")
33
+ // } else {
34
+ // $(".reveal-occurrence[href='" + window.location.hash + "']").addClass("selected")
35
+ // }
36
+ // }
37
+ // revealStacktrace()
38
+ //
39
+ // $(".reveal-occurrence").click(function() {
40
+ // // We want the hash/anchor to be updated before running the function
41
+ // setTimeout(revealStacktrace, 100)
42
+ // })
43
+ //
44
+ // $(".open-compressed").click(function(evt) {
45
+ // evt.preventDefault()
46
+ // $("[data-wrapname=" + $(this).attr("data-target") + "]").toggleClass("open")
47
+ // })
48
+ //
49
+ // $(".update-dropdown").change(function(evt) {
50
+ // var report_data = { bug_report: {} }
51
+ // report_data.bug_report[$(this).attr("data-name")] = $(this).val()
52
+ //
53
+ // $.ajax({
54
+ // method: "PATCH",
55
+ // url: $(this).attr("data-url"),
56
+ // data: report_data,
57
+ // dataType: "json"
58
+ // })
59
+ // })
60
+ // })
@@ -0,0 +1,5 @@
1
+ $snitch-blue: #3D94F6;
2
+ $border-grey: #DEDEDE;
3
+ $background-grey: #F5F5F9;
4
+ $text-color: #22222F;
5
+ $danger: #E91212;
@@ -0,0 +1,120 @@
1
+ todo {
2
+ animation: 1.5s todo-pulse infinite;
3
+ }
4
+ @keyframes todo-pulse {
5
+ 0% {
6
+ transform: scale(1);
7
+ }
8
+
9
+ 50% {
10
+ transform: scale(1.01);
11
+ background: orange;
12
+ }
13
+
14
+ 100% {
15
+ transform: scale(1);
16
+ }
17
+ }
18
+
19
+ .snitch-center {
20
+ text-align: center;
21
+ }
22
+
23
+ .scrollable {
24
+ margin: 0;
25
+ padding: 0;
26
+ width: 100%;
27
+ height: 100%;
28
+ overflow: auto;
29
+ }
30
+
31
+ .flex-row {
32
+ display: flex;
33
+ display: 100%;
34
+ align-items: center;
35
+ justify-content: space-between;
36
+ }
37
+
38
+ .snitch-banner {
39
+ box-shadow: 2px 2px 4px $border-grey;
40
+ border-radius: 8px;
41
+ background: green;
42
+ padding: 15px;
43
+ color: white;
44
+ text-align: center;
45
+ }
46
+
47
+ .line-trace {
48
+ margin: 20px 0;
49
+ background: #E0DFDF;
50
+ padding: 10px;
51
+ overflow: scroll;
52
+
53
+ &.cap-height {
54
+ max-height: 300px;
55
+ }
56
+
57
+ .trace-details {
58
+ margin: 10px;
59
+
60
+ .trace-full {
61
+ color: grey;
62
+ font-size: 12px;
63
+ }
64
+ }
65
+
66
+ .current-line {
67
+ background: lighten($snitch-blue, 25%);
68
+ }
69
+ }
70
+
71
+ code {
72
+ overflow: scroll;
73
+ white-space: pre;
74
+ }
75
+
76
+ .snitch-resolution-switch {
77
+ -webkit-appearance: none;
78
+ -moz-appearance: none;
79
+ appearance: none;
80
+ display: inline-block;
81
+ position: relative;
82
+ transition: background-color ease 0.3s;
83
+ cursor: pointer;
84
+ outline: none;
85
+ border: none;
86
+ background-color: #707070;
87
+ width: 120px;
88
+ height: 32px;
89
+ overflow: hidden;
90
+
91
+ &:before {
92
+ display: block;
93
+ position: absolute;
94
+ top: 2px;
95
+ left: 2px;
96
+ z-index: 2;
97
+ transition: 0.4s;
98
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
99
+ background: #fff;
100
+ width: 28px;
101
+ height: 28px;
102
+ color: #fff;
103
+ font: 10px/28px Helvetica;
104
+ font-weight: bold;
105
+ text-indent: -70px;
106
+ text-shadow: -1px -1px rgba(0,0,0,0.15);
107
+ text-transform: uppercase;
108
+ white-space: nowrap;
109
+ word-spacing: 52px;
110
+ content: "Resolved Unresolved";
111
+ }
112
+
113
+ &:checked {
114
+ background-color: #4CD964;
115
+ }
116
+
117
+ &:checked:before {
118
+ left: 90px;
119
+ }
120
+ }
@@ -0,0 +1,6 @@
1
+ .snitch-section {
2
+ margin: 10px 0;
3
+ background: darken($background-grey, 1%);
4
+ padding: 10px;
5
+ overflow: hidden;
6
+ }
@@ -0,0 +1,18 @@
1
+ * { box-sizing: border-box; }
2
+
3
+ .snitch-reporting {
4
+ position: relative;
5
+ margin: 0;
6
+ padding: 50px;
7
+ padding-top: 100px;
8
+ width: 100%;
9
+ height: 100%;
10
+ color: $text-color;
11
+ font-family: Helvetica;
12
+
13
+ h1, h2, h3, h4, h5 { color: darken($snitch-blue, 10%); }
14
+
15
+ .snitch-skinny-container {
16
+ margin: 0 40px;
17
+ }
18
+ }
@@ -0,0 +1,36 @@
1
+ .snitch-reporting {
2
+ .snitch-btn {
3
+ display: inline-block;
4
+ position: relative;
5
+ box-sizing: border-box;
6
+ margin: 2px;
7
+ border: 1px solid $border-grey;
8
+ border-radius: 6px;
9
+ background: linear-gradient(white, $background-grey);
10
+ padding: 8px;
11
+ color: $text-color;
12
+ text-decoration: none;
13
+
14
+ &:hover {
15
+ background: linear-gradient($background-grey, $background-grey, white);
16
+ }
17
+
18
+ &.danger {
19
+ background: linear-gradient($danger, darken($danger, 15%));
20
+ color: white;
21
+
22
+ &:hover {
23
+ background: linear-gradient(darken($danger, 15%), $danger, $danger);
24
+ }
25
+ }
26
+
27
+ &.primary {
28
+ background: linear-gradient($snitch-blue, darken($snitch-blue, 15%));
29
+ color: white;
30
+
31
+ &:hover {
32
+ background: linear-gradient(darken($snitch-blue, 15%), $snitch-blue, $snitch-blue);
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,37 @@
1
+ .snitch-reporting {
2
+ .snitch-nav {
3
+ position: fixed;
4
+ top: 0;
5
+ right: 0;
6
+ left: 0;
7
+ z-index: 1000;
8
+ background: $snitch-blue;
9
+ height: 50px;
10
+
11
+ .nav-tab,
12
+ a {
13
+ display: inline-block;
14
+ vertical-align: top;
15
+ margin: 0;
16
+ padding: 0 20px;
17
+ height: 100%;
18
+ color: white;
19
+ font-size: 18px;
20
+ font-weight: normal;
21
+ line-height: 50px;
22
+ text-decoration: none;
23
+ white-space: nowrap;
24
+
25
+ input {
26
+ border-radius: 0;
27
+ font-size: 18px;
28
+ }
29
+ }
30
+
31
+ a:hover {
32
+ background: lighten($snitch-blue, 10%);
33
+ }
34
+ }
35
+
36
+ .snitch-breadcrumbs {}
37
+ }
@@ -0,0 +1,127 @@
1
+ .snitch-reporting {
2
+ .snitch-table {
3
+ display: table;
4
+ border-spacing: 0 0;
5
+ background: white;
6
+ width: 100%;
7
+ max-width: 100%;
8
+ overflow: hidden;
9
+
10
+ &.fixed {
11
+ table-layout: fixed;
12
+ }
13
+
14
+ .snitch-thead {
15
+ display: table-header-group;
16
+ }
17
+
18
+ .snitch-tbody {
19
+ display: table-row-group;
20
+ }
21
+
22
+ .snitch-tr {
23
+ display: table-row;
24
+ }
25
+
26
+ .snitch-td,
27
+ .snitch-th {
28
+ display: table-cell;
29
+ border: 1px solid $border-grey;
30
+
31
+ max-width: 100%;
32
+ overflow: hidden;
33
+ text-align: left;
34
+
35
+ &.text-center {
36
+ text-align: center;
37
+ }
38
+ }
39
+
40
+ .link-cell {
41
+ color: $text-color;
42
+ text-decoration: none;
43
+
44
+ &:hover {
45
+ background: darken($background-grey, 5%);
46
+ }
47
+ }
48
+
49
+ &.bordered {
50
+ .snitch-tbody .snitch-tr:nth-child(odd) {
51
+ background: $background-grey;
52
+ }
53
+ }
54
+
55
+ &.padded {
56
+ .link-cell,
57
+ .snitch-td,
58
+ .snitch-th {
59
+ padding: 20px;
60
+ }
61
+ }
62
+ }
63
+
64
+ .snitch-errors {
65
+ .report-title-wrapper {
66
+ margin-bottom: 5px;
67
+
68
+ .report-title {
69
+ color: $snitch-blue;
70
+ }
71
+ }
72
+
73
+ .report-location {
74
+ display: inline-block;
75
+ color: orange;
76
+ }
77
+
78
+ .report-message {
79
+ padding-top: 5px;
80
+ color: grey;
81
+ }
82
+ }
83
+
84
+ .snitch-section {
85
+ &#summary {
86
+ .snitch-table {
87
+ .snitch-td:first-of-type {
88
+ background: $background-grey;
89
+ width: 100px;
90
+ color: #AAA;
91
+ font-size: 12px;
92
+ text-align: right;
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ .filters {
99
+ text-align: center;
100
+
101
+ .filter-table {
102
+ display: inline-block;
103
+ vertical-align: top;
104
+ width: 300px;
105
+
106
+ .link-cell,
107
+ .snitch-td,
108
+ .snitch-th {
109
+ padding: 10px;
110
+ width: 300px;
111
+ }
112
+
113
+ .snitch-th {
114
+ text-align: center;
115
+ }
116
+
117
+ .snitch-td {
118
+ font-size: 14px;
119
+
120
+ &.selected {
121
+ background: darken($background-grey, 10%);
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ }