snitch_reporting 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f36c08be1ea6ddb5163c77f6545cdf15d428fe924417659435f129371b111fb2
4
- data.tar.gz: 782520924c3822bde5b12360862447bcdce9165cdadf8069206a35dea14ad25c
3
+ metadata.gz: 0360ae61e5fff96546f73c211a32e026f0c86e551d86a4ec56151fee0f16b55a
4
+ data.tar.gz: 3b11b38588632cd9bd5e214ac6e57626c836aebac9e007c3877b38709c7603e4
5
5
  SHA512:
6
- metadata.gz: 9caebc02bbb9246c6296f40a0bb1b9b9adea201291fd9cd54cf83d5209ab4290a1a2ab82b5ae3b410881473bbbccf6015f6e1f22a9aa8046cb981423f90d246c
7
- data.tar.gz: e5e6da918b33c4e2fcf40b80166e6507c902491da65f45db92c708205e6dcab74f6e3113064cd561b6b8dfb39b052b8a327e25f46decff74ad5149d162ddd253
6
+ metadata.gz: '0738cb273eb18dabd7a3d48baccfc5ee98bb2c039f1139cdadb39539d6eb572ccd8413dfb8dbb7d9e193021ddd78aa81346bd70d7fb1a9006ed7d8848f59045e'
7
+ data.tar.gz: 271b1f3fdb87d533c154c4b5d90e20acdf61681e670bb552f847ed5e407d77db95e74e564d59c296d7839969051cdae75fe25573ee402ef57fe7b0aaa9149319
@@ -2,246 +2,169 @@ require_dependency "snitch_reporting/application_controller"
2
2
 
3
3
  class ::SnitchReporting::SnitchReportsController < ApplicationController
4
4
  include ::SnitchReporting::ParamsHelper
5
+ include ::SnitchReporting::SnitchReportHelper
5
6
  helper ::SnitchReporting::SnitchReportHelper
6
7
 
7
8
  layout "application"
8
9
 
9
- def index
10
- ::SnitchReporting::SnitchReport.warn("Error", some: :data)
11
- @reports = ::SnitchReporting::SnitchReport.order("last_occurrence_at DESC NULLS LAST").page(params[:page]).per(params[:per] || 25)
12
-
13
- # set_report_preferences
14
- filter_reports
15
- # sort_reports
16
- end
17
-
18
- def interpret_search
19
- redirect_to snitch_reports_path(filter_string: params[:filter_string])
20
- end
21
-
22
- def show
23
- @report = ::SnitchReporting::SnitchReport.find(params[:id])
24
- occurrences = @report.occurrences.order(created_at: :asc)
25
- @occurrence = occurrences.find_by(id: params[:occurrence]) || occurrences.last
26
- occurrence_ids = occurrences.ids
27
- occurrence_idx = occurrence_ids.index(@occurrence.id)
28
- @paged_ids = {
29
- first: occurrence_idx == 0 ? nil : occurrence_ids.first,
30
- prev: occurrence_idx == 0 ? nil : occurrence_ids[occurrence_idx - 1],
31
- next: occurrence_idx == occurrence_ids.length - 1 ? nil : occurrence_ids[occurrence_idx + 1],
32
- last: occurrence_idx == occurrence_ids.length - 1 ? nil : occurrence_ids.last,
33
- }
34
- # @formatted_occurrence_data = occurrences.staggered_occurrence_data
35
- # @comments = @report.comments.order(created_at: :desc)
36
- end
37
-
38
-
39
- def update
40
- @report = ::SnitchReporting::SnitchReport.find(params[:id])
41
- # @report.acting_user = current_user
42
- @report.update(report_params)
43
-
44
- respond_to do |format|
45
- format.html { redirect_to @report }
46
- format.json
47
- end
48
- end
49
- #
50
- # def comment
51
- # if @report.comments.create(comment_params.merge(author: current_credential).merge(params.permit(:resolved, :ignored)))
52
- # update_report_for(:resolved, comment: false)
53
- # update_report_for(:ignored, comment: false)
54
- #
55
- # redirect_to snitch_report_path(@report)
56
- # else
57
- # redirect_to snitch_report_path(@report), alert: "Failed to comment. Please try again."
58
- # end
59
- # end
60
- #
61
- private
62
-
63
- def report_params
64
- params.require(:snitch_report).permit(
65
- :ignored,
66
- :resolved
67
- )
68
- end
69
- #
70
- # def current_snitch_report
71
- # @report = SnitchReporting::SnitchReport.find(params[:id])
72
- # end
73
- #
74
- # def update_report_for(status, comment: true)
75
- # raise "Value not allowed: #{status}" unless status.in?([:resolved, :ignored])
76
- #
77
- # if true_param?(status)
78
- # @report.update("#{status}_at": Time.current, "#{status}_by": current_credential)
79
- # # @report.comments.create(author: current_credential, message: ">>> Marked as #{status} <<<", skip_notify: true, status => true) if comment
80
- # elsif params[status].present?
81
- # # @report.comments.create(author: current_credential, message: ">>> Marked as un#{status} <<<", skip_notify: true, status => false) if comment
82
- # @report.update("#{status}_at": nil, "#{status}_by": nil)
83
- # end
84
- # end
85
- #
86
- # def report_params
87
- # params.require(:snitch_report).permit(
88
- # :source,
89
- # :severity,
90
- # :assigned_to_id,
91
- # :title,
92
- # :custom_details
93
- # )
94
- # end
95
- #
96
- # def comment_params
97
- # params.require(:snitch_comment).permit(:message)
98
- # end
99
- #
100
- # def set_report_preferences
101
- # @filters = begin
102
- # preferences = JSON.parse(session[:filters].presence || "{}").symbolize_keys
103
- #
104
- # available_preferences = [:level_tags, :severity_tags, :source_tags, :resolved, :ignored]
105
- # available_preferences.each do |pref_key|
106
- # pref_val = params[pref_key]
107
- # preferences[pref_key] = pref_val if pref_val.present?
108
- # preferences.delete(pref_key) if pref_val == "all"
109
- # end
110
- #
111
- # session[:filters] = preferences.to_json
112
- # preferences
113
- # end
114
- # end
115
- def set_filters
116
- @filter_sets = {
117
- status: {
118
- default: :unresolved,
119
- values: [:all, :resolved, :unresolved]
120
- },
121
- # assignee: {
122
- # default: :any,
123
- # values: [:any, :me, :not_me, :not_assigned]
124
- # },
125
- log_level: {
126
- default: :any,
127
- values: [:any] + ::SnitchReporting::SnitchReport.log_levels.keys.map(&:to_sym)
128
- },
129
- # ignored: {
130
- # default: :not_ignored,
131
- # values: [:all, :ignored, :not_ignored]
132
- # }
133
- }
134
-
135
- set_filter_string
136
-
137
- # @filters = @filter_sets.each_with_object({set_filters: {}}) do |(filter_name, filter_set), filters|
138
- # filters[filter_name] = filter_set[:default]
139
- # filter_in_param = params[filter_name].try(:to_sym)
140
- # next unless filter_in_param && filter_set[:values].include?(filter_in_param)
141
- # filters[filter_name] = filter_in_param
142
- # filters[:set_filters][filter_name] = filter_in_param
143
- # end
144
- end
145
-
146
- def filter_reports
147
- set_filters
148
-
149
- @reports = @reports.resolved if @filters[:status] == :resolved
150
- @reports = @reports.unresolved if @filters[:status] == :unresolved
151
- @reports = @reports.search(@filters[:search]) if @filters[:search].present?
152
- @reports = @reports.by_level(@filters[:log_level]) if @filters[:log_level].present?
153
-
154
- @reports = @reports.by_tag(*@filters[:tag]) if @filters[:tag].any?
155
- # @reports = @reports.by_severity(@filters[:severity_tags]) if @filters[:severity_tags].present?
156
- # @reports = @reports.by_source(@filters[:source_tags]) if @filters[:source_tags].present?
157
- #
158
- # @reports = @filters[:resolved].present? && truthy?(@filters[:resolved]) ? @reports.resolved : @reports.unresolved
159
- # @reports = @filters[:ignored].present? && truthy?(@filters[:ignored]) ? @reports.ignored : @reports.unignored
160
- end
161
-
162
- def encode_string(token, str)
163
- @interpolated_strings ||= []
164
-
165
- @interpolated_strings << str
166
- "#{token}(#{@interpolated_strings.length})"
167
- end
168
-
169
- def decode_string(token, encoded_str)
170
- @interpolated_strings ||= []
171
-
172
- encoded_str.gsub(/(\w+)\((\d+)\)/) do |found|
173
- token = Regexp.last_match(1)
174
- idx = Regexp.last_match(2)
175
-
176
- if idx.to_i.to_s == idx
177
- @interpolated_strings[idx.to_i - 1]
178
- else
179
- found
180
- end
181
- end
182
- end
183
-
184
- def param_safe_value(str)
185
- return str unless str.include?(" ")
186
-
187
- "\"#{str}\""
188
- end
189
-
190
- def set_filter_string
191
- @filter_string = params[:filter_string] || session[:snitch_filter_string] || "status:unresolved"
192
- @unknown_strings = []
193
- @filters = {}
194
-
195
- secret_key = loop do
196
- token = SecureRandom.hex(10)
197
- break token unless @filter_string.include?(token)
198
- end
199
-
200
- temp_filter_string = @filter_string.gsub(/\"(.*?)\"/) do |found|
201
- encode_string(secret_key, Regexp.last_match(1))
202
- end
203
-
204
- search_strings = []
205
- tag_strings = []
206
- filter_strings = temp_filter_string.split(" ").select do |filter_string|
207
- search_strings << filter_string unless filter_string.include?(":")
208
- filter_string.include?(":")
209
- end
210
-
211
- filter_strings.each do |filter_string|
212
- filter, value, * = filter_string.split(":")
213
- if value.blank?
214
- # Search pure text by itself
215
- search_strings << value
216
- elsif @filter_sets.keys.include?(filter.to_s.to_sym)
217
- value = decode_string(secret_key, value)
218
- @filters[filter.to_sym] = value.to_sym
219
- elsif filter == "search"
220
- search_strings << decode_string(secret_key, value)
221
- elsif filter == "tag" || filter == "tags"
222
- tag_strings << decode_string(secret_key, value)
223
- else
224
- @unknown_strings << filter_string
225
- end
226
- end
227
-
228
- @filters[:search] = "\"#{search_strings.join(' ')}\"" if search_strings.any?
229
- @filters[:tag] = tag_strings
230
-
231
- new_filter_strings = @filters.each_with_object([]) do |(filter_string, filter_value), filter_array|
232
- next unless filter_value.present?
233
- if filter_value.is_a?(Array)
234
- filter_value.each do |filter_value_i|
235
- filter_array << "#{filter_string}:#{filter_value_i}"
236
- end
237
- else
238
- filter_array << "#{filter_string}:#{filter_value}"
239
- end
240
- end
241
-
242
- @filter_string = new_filter_strings.join(" ")
243
- session[:snitch_filter_string] = @filter_string.dup
10
+ def index
11
+ ::SnitchReporting::SnitchReport.warn("Error", some: :data)
12
+ @reports = ::SnitchReporting::SnitchReport.order("last_occurrence_at DESC NULLS LAST").page(params[:page]).per(params[:per] || 25)
13
+
14
+ # set_report_preferences
15
+ filter_reports
16
+ # sort_reports
17
+ end
18
+
19
+ def interpret_search
20
+ redirect_to snitch_reports_path(filter_string: params[:filter_string])
21
+ end
22
+
23
+ def show
24
+ @report = ::SnitchReporting::SnitchReport.find(params[:id])
25
+ occurrences = @report.occurrences.order(created_at: :asc)
26
+ @occurrence = occurrences.find_by(id: params[:occurrence]) || occurrences.last
27
+ occurrence_ids = occurrences.ids
28
+ occurrence_idx = occurrence_ids.index(@occurrence.id)
29
+ @paged_ids = {
30
+ first: occurrence_idx == 0 ? nil : occurrence_ids.first,
31
+ prev: occurrence_idx == 0 ? nil : occurrence_ids[occurrence_idx - 1],
32
+ next: occurrence_idx == occurrence_ids.length - 1 ? nil : occurrence_ids[occurrence_idx + 1],
33
+ last: occurrence_idx == occurrence_ids.length - 1 ? nil : occurrence_ids.last,
34
+ }
35
+ # @formatted_occurrence_data = occurrences.staggered_occurrence_data
36
+ # @comments = @report.comments.order(created_at: :desc)
37
+ end
38
+
39
+
40
+ def update
41
+ @report = ::SnitchReporting::SnitchReport.find(params[:id])
42
+ # @report.acting_user = current_user
43
+ @report.update(report_params)
44
+
45
+ respond_to do |format|
46
+ format.html { redirect_to @report }
47
+ format.json
244
48
  end
49
+ end
50
+ #
51
+ # def comment
52
+ # if @report.comments.create(comment_params.merge(author: current_credential).merge(params.permit(:resolved, :ignored)))
53
+ # update_report_for(:resolved, comment: false)
54
+ # update_report_for(:ignored, comment: false)
55
+ #
56
+ # redirect_to snitch_report_path(@report)
57
+ # else
58
+ # redirect_to snitch_report_path(@report), alert: "Failed to comment. Please try again."
59
+ # end
60
+ # end
61
+ #
62
+ private
63
+
64
+ def report_params
65
+ params.require(:snitch_report).permit(
66
+ :ignored,
67
+ :resolved
68
+ )
69
+ end
70
+ #
71
+ # def current_snitch_report
72
+ # @report = SnitchReporting::SnitchReport.find(params[:id])
73
+ # end
74
+ #
75
+ # def update_report_for(status, comment: true)
76
+ # raise "Value not allowed: #{status}" unless status.in?([:resolved, :ignored])
77
+ #
78
+ # if true_param?(status)
79
+ # @report.update("#{status}_at": Time.current, "#{status}_by": current_credential)
80
+ # # @report.comments.create(author: current_credential, message: ">>> Marked as #{status} <<<", skip_notify: true, status => true) if comment
81
+ # elsif params[status].present?
82
+ # # @report.comments.create(author: current_credential, message: ">>> Marked as un#{status} <<<", skip_notify: true, status => false) if comment
83
+ # @report.update("#{status}_at": nil, "#{status}_by": nil)
84
+ # end
85
+ # end
86
+ #
87
+ # def report_params
88
+ # params.require(:snitch_report).permit(
89
+ # :source,
90
+ # :severity,
91
+ # :assigned_to_id,
92
+ # :title,
93
+ # :custom_details
94
+ # )
95
+ # end
96
+ #
97
+ # def comment_params
98
+ # params.require(:snitch_comment).permit(:message)
99
+ # end
100
+ #
101
+ # def set_report_preferences
102
+ # @filters = begin
103
+ # preferences = JSON.parse(session[:filters].presence || "{}").symbolize_keys
104
+ #
105
+ # available_preferences = [:level_tags, :severity_tags, :source_tags, :resolved, :ignored]
106
+ # available_preferences.each do |pref_key|
107
+ # pref_val = params[pref_key]
108
+ # preferences[pref_key] = pref_val if pref_val.present?
109
+ # preferences.delete(pref_key) if pref_val == "all"
110
+ # end
111
+ #
112
+ # session[:filters] = preferences.to_json
113
+ # preferences
114
+ # end
115
+ # end
116
+ def set_filters
117
+ @filter_sets = {
118
+ status: {
119
+ default: :unresolved,
120
+ values: [:all, :resolved, :unresolved]
121
+ },
122
+ # assignee: {
123
+ # default: :any,
124
+ # values: [:any, :me, :not_me, :not_assigned]
125
+ # },
126
+ log_level: {
127
+ default: :any,
128
+ values: [:any] + ::SnitchReporting::SnitchReport.log_levels.keys.map(&:to_sym)
129
+ },
130
+ # ignored: {
131
+ # default: :not_ignored,
132
+ # values: [:all, :ignored, :not_ignored]
133
+ # }
134
+ }
135
+
136
+ filter_string_from_params
137
+
138
+ # @filters = @filter_sets.each_with_object({set_filters: {}}) do |(filter_name, filter_set), filters|
139
+ # filters[filter_name] = filter_set[:default]
140
+ # filter_in_param = params[filter_name].try(:to_sym)
141
+ # next unless filter_in_param && filter_set[:values].include?(filter_in_param)
142
+ # filters[filter_name] = filter_in_param
143
+ # filters[:set_filters][filter_name] = filter_in_param
144
+ # end
145
+ end
146
+
147
+ def filter_reports
148
+ set_filters
149
+
150
+ @reports = @reports.resolved if @filters[:status] == :resolved
151
+ @reports = @reports.unresolved if @filters[:status] == :unresolved
152
+ @reports = @reports.search(@filters[:search]) if @filters[:search].present?
153
+ @reports = @reports.by_level(@filters[:log_level]) if @filters[:log_level].present? && @filters[:log_level] != :any
154
+
155
+ @reports = @reports.by_tag(*@filters[:tags]) if @filters[:tags].present?
156
+ # @reports = @reports.by_severity(@filters[:severity_tags]) if @filters[:severity_tags].present?
157
+ # @reports = @reports.by_source(@filters[:source_tags]) if @filters[:source_tags].present?
158
+ #
159
+ # @reports = @filters[:resolved].present? && truthy?(@filters[:resolved]) ? @reports.resolved : @reports.unresolved
160
+ # @reports = @filters[:ignored].present? && truthy?(@filters[:ignored]) ? @reports.ignored : @reports.unignored
161
+ end
162
+
163
+ def param_safe_value(str)
164
+ return str unless str.include?(" ")
165
+
166
+ "\"#{str}\""
167
+ end
245
168
  #
246
169
  # def sort_reports
247
170
  # order = sort_order || "desc"
@@ -1,2 +1,13 @@
1
1
  module ::SnitchReporting::SnitchReportHelper
2
+ def search_path_from_filter_string(new_params={})
3
+ snitch_reports_path(filter_string: filter_string_from_params(new_params))
4
+ end
5
+
6
+ def filter_string_from_params(extra_params={})
7
+ @filter_builder = ::SnitchReporting::Service::FilterStringBuilder.new(from_string: params[:filter_string] || session[:snitch_filter_string] || "status:unresolved")
8
+ @filter_string = @filter_builder.to_filter_string
9
+ @filters = @filter_builder.filters
10
+
11
+ session[:snitch_filter_string] = @filter_string.dup
12
+ end
2
13
  end
@@ -0,0 +1,160 @@
1
+ class ::SnitchReporting::Service::FilterStringBuilder
2
+ attr_accessor :filter_hash, :filters, :unknown_filters
3
+
4
+ def self.filter_sets
5
+ {
6
+ status: {
7
+ default: :unresolved,
8
+ values: [:all, :resolved, :unresolved]
9
+ },
10
+ # assignee: {
11
+ # default: :any,
12
+ # values: [:any, :me, :not_me, :not_assigned]
13
+ # },
14
+ log_level: {
15
+ default: :any,
16
+ values: [:any] + ::SnitchReporting::SnitchReport.log_levels.keys.map(&:to_sym)
17
+ },
18
+ # ignored: {
19
+ # default: :not_ignored,
20
+ # values: [:all, :ignored, :not_ignored]
21
+ # }
22
+ }
23
+ end
24
+
25
+ # extra_params.each do |param_key, param_value|
26
+ # param_key = param_key.to_s
27
+ # param_value = param_value.to_s
28
+ #
29
+ # if param_value.blank?
30
+ # # Search pure text by itself
31
+ # search_strings << param_key
32
+ # elsif @filter_sets.keys.include?(param_key.to_s.to_sym)
33
+ # param_value = decode_string(secret_key, param_value)
34
+ # @filters[param_key.to_sym] = param_value.to_sym
35
+ # elsif param_key == "search"
36
+ # search_strings << decode_string(secret_key, param_value)
37
+ # elsif param_key == "tag" || param_key == "tags"
38
+ # tag_strings << decode_string(secret_key, param_value)
39
+ # else
40
+ # @unknown_strings << "#{param_key}:#{param_value}"
41
+ # end
42
+ # end
43
+
44
+ def filter_sets
45
+ self.class.filter_sets
46
+ end
47
+
48
+ def initialize(from_string: nil, from_data: nil)
49
+ parse_filters_from_string(from_string) if from_string.present?
50
+ end
51
+
52
+ def to_param
53
+ { filter_string: to_filter_string }
54
+ end
55
+
56
+ def to_filter_string
57
+ filter_strings = []
58
+ tag_strings = []
59
+ search_strings = []
60
+
61
+ @filters.each do |filter_key, filter_value|
62
+ if filter_key == :search
63
+ search_strings += filter_value
64
+ elsif filter_key == :tags
65
+ tag_strings += filter_value.map { |value| filter_to_string(filter_key, filter_value) }
66
+ elsif filter_sets.keys.include?(filter_key.to_s.to_sym)
67
+ filter_strings << filter_to_string(filter_key, filter_value)
68
+ else
69
+ # No-op for now. Probably should display these somewhere?
70
+ end
71
+ end
72
+
73
+ (filter_strings + tag_strings + search_strings).join(" ")
74
+ end
75
+
76
+ def add_filter(filter_key, filter_value)
77
+ filter_key = filter_key.to_s.to_sym
78
+ @filters ||= {search: [], tags: [], unknown: []}
79
+
80
+ if filter_value.blank?
81
+ @filters[:search] << filter_key
82
+ elsif filter_key == :search
83
+ @filters[:search] << filter_key
84
+ elsif filter_key == :tags
85
+ @filters[:tags] << {filter_key => filter_value}
86
+ else
87
+ @filters[filter_key] = filter_value.to_s.to_sym
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def encode_string(str)
94
+ @encoded_strings ||= []
95
+
96
+ @encoded_strings << str
97
+ "#{@parse_token}(#{@encoded_strings.length - 1})"
98
+ end
99
+
100
+ def decode_string(encoded_str)
101
+ @encoded_strings ||= []
102
+
103
+ encoded_str.gsub(/#{Regexp.escape(@parse_token)}\((\d+)\)/) do |found|
104
+ encoded_idx = Regexp.last_match(1)
105
+
106
+ if encoded_idx.to_i.to_s == encoded_idx
107
+ @encoded_strings[encoded_idx.to_i]
108
+ else
109
+ found
110
+ end
111
+ end
112
+ end
113
+
114
+ def parse_filters_from_string(filter_string)
115
+ @parse_token = generate_uniq_key(filter_string)
116
+ encoded_string = extract_quoted_strings(filter_string)
117
+ parsed_strings = group_values_without_filter(encoded_string)
118
+
119
+ parsed_strings[:filters].each do |parsed_string|
120
+ filter, value, * = parsed_string.split(":")
121
+
122
+ add_filter(filter, decode_string(value))
123
+ end
124
+ end
125
+
126
+ def group_values_without_filter(encoded_string)
127
+ filter_group_hash = {
128
+ filters: [],
129
+ search: [],
130
+ tags: [],
131
+ unknown: []
132
+ }
133
+ encoded_string.split(" ").each_with_object(filter_group_hash) do |filter, filter_groups|
134
+ if filter.include?(":")
135
+ filter_groups[:filters] << filter
136
+ else
137
+ filter_groups[:search] << filter
138
+ end
139
+ end
140
+ end
141
+
142
+ def filter_to_string(filter, value)
143
+ filter = "\"#{filter}\"" if filter.to_s.include?(" ")
144
+ value = "\"#{value}\"" if value.to_s.include?(" ")
145
+ [filter.presence, value.presence].compact.join(":")
146
+ end
147
+
148
+ def extract_quoted_strings(filter_string)
149
+ filter_string.gsub(/\"(.*?)\"/) do |found|
150
+ encode_string(secret_key, Regexp.last_match(1))
151
+ end
152
+ end
153
+
154
+ def generate_uniq_key(filter_string)
155
+ loop do
156
+ token = SecureRandom.hex(10)
157
+ break token unless filter_string.to_s.include?(token)
158
+ end
159
+ end
160
+ end
@@ -1,3 +1,3 @@
1
1
  module SnitchReporting
2
- VERSION = '1.2.3'
2
+ VERSION = '1.2.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snitch_reporting
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rocco Nicholls
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2020-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pg
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +106,7 @@ files:
92
106
  - app/controllers/snitch_reporting/snitch_reports_controller.rb
93
107
  - app/helpers/snitch_reporting/params_helper.rb
94
108
  - app/helpers/snitch_reporting/snitch_report_helper.rb
109
+ - app/models/snitch_reporting/service/filter_string_builder.rb
95
110
  - app/models/snitch_reporting/service/json_wrapper.rb
96
111
  - app/models/snitch_reporting/snitch_comment.rb
97
112
  - app/models/snitch_reporting/snitch_history.rb