dossier 2.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 (85) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.markdown +181 -0
  3. data/Rakefile +27 -0
  4. data/app/assets/javascripts/dossier/application.js +15 -0
  5. data/app/assets/stylesheets/dossier/application.css +13 -0
  6. data/app/controllers/dossier/application_controller.rb +4 -0
  7. data/app/controllers/dossier/reports_controller.rb +34 -0
  8. data/app/helpers/dossier/application_helper.rb +4 -0
  9. data/app/views/dossier/reports/show.html.haml +21 -0
  10. data/config/routes.rb +5 -0
  11. data/lib/dossier.rb +31 -0
  12. data/lib/dossier/adapter/active_record.rb +40 -0
  13. data/lib/dossier/adapter/active_record/result.rb +24 -0
  14. data/lib/dossier/client.rb +52 -0
  15. data/lib/dossier/configuration.rb +28 -0
  16. data/lib/dossier/engine.rb +7 -0
  17. data/lib/dossier/formatter.rb +33 -0
  18. data/lib/dossier/query.rb +30 -0
  19. data/lib/dossier/report.rb +69 -0
  20. data/lib/dossier/result.rb +67 -0
  21. data/lib/dossier/stream_csv.rb +24 -0
  22. data/lib/dossier/version.rb +3 -0
  23. data/lib/tasks/dossier_tasks.rake +4 -0
  24. data/spec/dossier/adapter/active_record/result_spec.rb +31 -0
  25. data/spec/dossier/adapter/active_record_spec.rb +54 -0
  26. data/spec/dossier/client_spec.rb +109 -0
  27. data/spec/dossier/configuration_spec.rb +35 -0
  28. data/spec/dossier/formatter_spec.rb +39 -0
  29. data/spec/dossier/query_spec.rb +59 -0
  30. data/spec/dossier/report_spec.rb +67 -0
  31. data/spec/dossier/result_spec.rb +119 -0
  32. data/spec/dossier_spec.rb +31 -0
  33. data/spec/dummy/README.rdoc +261 -0
  34. data/spec/dummy/Rakefile +7 -0
  35. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  36. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  37. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  38. data/spec/dummy/app/controllers/site_controller.rb +5 -0
  39. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  40. data/spec/dummy/app/views/dossier/reports/suspended_employee.html.haml +1 -0
  41. data/spec/dummy/app/views/dossier/reports/total.html.haml +11 -0
  42. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  43. data/spec/dummy/config.ru +4 -0
  44. data/spec/dummy/config/application.rb +56 -0
  45. data/spec/dummy/config/boot.rb +10 -0
  46. data/spec/dummy/config/database.yml.example +13 -0
  47. data/spec/dummy/config/environment.rb +9 -0
  48. data/spec/dummy/config/environments/development.rb +37 -0
  49. data/spec/dummy/config/environments/production.rb +67 -0
  50. data/spec/dummy/config/environments/test.rb +37 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/inflections.rb +15 -0
  53. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  54. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  55. data/spec/dummy/config/initializers/session_store.rb +8 -0
  56. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  57. data/spec/dummy/config/locales/en.yml +5 -0
  58. data/spec/dummy/config/routes.rb +5 -0
  59. data/spec/dummy/config/setup_load_paths.rb +15 -0
  60. data/spec/dummy/db/schema.rb +24 -0
  61. data/spec/dummy/dossier_test +0 -0
  62. data/spec/dummy/public/404.html +26 -0
  63. data/spec/dummy/public/422.html +26 -0
  64. data/spec/dummy/public/500.html +25 -0
  65. data/spec/dummy/public/favicon.ico +0 -0
  66. data/spec/dummy/script/rails +6 -0
  67. data/spec/fixtures/customized_employee_report.html +38 -0
  68. data/spec/fixtures/db/mysql2.yml.example +4 -0
  69. data/spec/fixtures/db/sqlite3.yml.example +2 -0
  70. data/spec/fixtures/employee_report.csv +4 -0
  71. data/spec/fixtures/employee_report.html +54 -0
  72. data/spec/fixtures/employee_report_with_footer.html +56 -0
  73. data/spec/fixtures/employee_with_custom_client.html +54 -0
  74. data/spec/requests/employee_report_spec.rb +52 -0
  75. data/spec/requests/employee_with_custom_client_spec.rb +13 -0
  76. data/spec/routing/dossier_routes_spec.rb +11 -0
  77. data/spec/spec_helper.rb +36 -0
  78. data/spec/support/factory.rb +86 -0
  79. data/spec/support/reports/employee_report.rb +78 -0
  80. data/spec/support/reports/employee_with_custom_client.rb +10 -0
  81. data/spec/support/reports/sqlite_employee_report.rb +15 -0
  82. data/spec/support/reports/supended_employee_report.rb +7 -0
  83. data/spec/support/reports/test_report.rb +4 -0
  84. data/spec/support/reports/total_report.rb +35 -0
  85. metadata +361 -0
@@ -0,0 +1,78 @@
1
+ class EmployeeReport < Dossier::Report
2
+
3
+ set_callback :build_query, :before, :example_before_hook
4
+ set_callback :execute, :after do
5
+ # do some stuff
6
+ end
7
+
8
+ # Valid for users to choose via a multi-select
9
+ def self.valid_columns
10
+ %w[id name hired_on suspended]
11
+ end
12
+
13
+ def sql
14
+ "SELECT #{columns} FROM employees WHERE 1=1".tap do |sql|
15
+ sql << "\n AND division in (:divisions)" if divisions.any?
16
+ sql << "\n AND salary > :salary" if salary?
17
+ sql << "\n AND (#{names_like})" if names_like.present?
18
+ sql << "\n ORDER BY name #{order}"
19
+ end
20
+ end
21
+
22
+ def columns
23
+ valid_columns.join(', ').presence || '*'
24
+ end
25
+
26
+ def valid_columns
27
+ self.class.valid_columns & Array.wrap(options[:columns])
28
+ end
29
+
30
+ def order
31
+ options[:order].to_s.upcase === 'DESC' ? 'DESC' : 'ASC'
32
+ end
33
+
34
+ def salary
35
+ 10_000
36
+ end
37
+
38
+ def name
39
+ "%#{names.pop}%"
40
+ end
41
+
42
+ def divisions
43
+ @divisions ||= options.fetch(:divisions) { [] }
44
+ end
45
+
46
+ def salary?
47
+ options[:salary].present?
48
+ end
49
+
50
+ def names_like
51
+ names.map { |name| "name like :name" }.join(' or ')
52
+ end
53
+
54
+ def names
55
+ @names ||= options.fetch(:names) { [] }.dup
56
+ end
57
+
58
+ def format_salary(amount)
59
+ formatter.number_to_currency(amount) # unless format.csv?
60
+ end
61
+
62
+ def format_hired_on(date)
63
+ date.to_s(:db)
64
+ end
65
+
66
+ def format_name(name)
67
+ "Employee #{name}"
68
+ end
69
+
70
+ def format_suspended(value)
71
+ value.to_i == 1 ? 'Yes' : 'No'
72
+ end
73
+
74
+ def example_before_hook
75
+ # do some stuff
76
+ end
77
+
78
+ end
@@ -0,0 +1,10 @@
1
+ class EmployeeWithCustomClientReport < Dossier::Report
2
+
3
+ def sql
4
+ "SELECT * FROM `employees`"
5
+ end
6
+
7
+ def dossier_client
8
+ Dossier::Factory.sqlite3_client
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ class SqliteEmployeeReport < Dossier::Report
2
+
3
+ def sql
4
+ "SELECT * FROM `employees` WHERE name LIKE :name"
5
+ end
6
+
7
+ def name
8
+ '%Jimmy%'
9
+ end
10
+
11
+ def format_salary(salary)
12
+ formatter.number_to_currency(salary)
13
+ end
14
+
15
+ end
@@ -0,0 +1,7 @@
1
+ class SuspendedEmployeeReport < Dossier::Report
2
+
3
+ def sql
4
+ "SELECT * FROM employees WHERE suspended = true"
5
+ end
6
+
7
+ end
@@ -0,0 +1,4 @@
1
+ class TestReport < Dossier::Report
2
+
3
+ end
4
+
@@ -0,0 +1,35 @@
1
+ class TotalReport < Dossier::Report
2
+
3
+ def sql
4
+ <<-SQL.strip_heredoc
5
+ SELECT
6
+ business_id,
7
+ sum( IF( `year` = '2011', amount, 0 ) ) AS 2011_total,
8
+ sum( IF( `year` = '2010', amount, 0 ) ) AS 2010_total,
9
+ sum( IF( `year` = '2009', amount, 0 ) ) AS 2009_total
10
+ FROM
11
+ totals
12
+ WHERE
13
+ business_id IN (:businesses)
14
+ GROUP BY
15
+ business_id
16
+ SQL
17
+ end
18
+
19
+ def businesses
20
+ options.fetch(:businesses) { '' }.split(',')
21
+ end
22
+
23
+ def format_2011_total(value)
24
+ formatter.currency(value)
25
+ end
26
+
27
+ def format_2010_total(value)
28
+ formatter.currency(value)
29
+ end
30
+
31
+ def format_2009_total(value)
32
+ formatter.currency(value)
33
+ end
34
+
35
+ end
metadata ADDED
@@ -0,0 +1,361 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dossier
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adam Hunter
9
+ - Nathan Long
10
+ - Rodney Turnham
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2013-01-18 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: arel
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: '3.0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ version: '3.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: activesupport
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: '3.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ - !ruby/object:Gem::Dependency
49
+ name: actionpack
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '3.2'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '3.2'
64
+ - !ruby/object:Gem::Dependency
65
+ name: actionmailer
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ version: '3.2'
72
+ type: :runtime
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: '3.2'
80
+ - !ruby/object:Gem::Dependency
81
+ name: railties
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '3.2'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ~>
94
+ - !ruby/object:Gem::Version
95
+ version: '3.2'
96
+ - !ruby/object:Gem::Dependency
97
+ name: haml
98
+ requirement: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 3.1.6
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: 3.1.6
112
+ - !ruby/object:Gem::Dependency
113
+ name: activerecord
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ~>
118
+ - !ruby/object:Gem::Version
119
+ version: 3.2.11
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ version: 3.2.11
128
+ - !ruby/object:Gem::Dependency
129
+ name: sqlite3
130
+ requirement: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: 1.3.6
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: 1.3.6
144
+ - !ruby/object:Gem::Dependency
145
+ name: pry
146
+ requirement: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: 0.9.10
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.9.10
160
+ - !ruby/object:Gem::Dependency
161
+ name: rspec-rails
162
+ requirement: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: 2.12.0
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: 2.12.0
176
+ description: Easy SQL based report generation with the ability to accept request parameters
177
+ and render multiple formats.
178
+ email:
179
+ - adamhunter@me.com
180
+ - nathanmlong@gmail.com
181
+ - rodney.turnham@tma1.com
182
+ executables: []
183
+ extensions: []
184
+ extra_rdoc_files: []
185
+ files:
186
+ - app/assets/javascripts/dossier/application.js
187
+ - app/assets/stylesheets/dossier/application.css
188
+ - app/controllers/dossier/application_controller.rb
189
+ - app/controllers/dossier/reports_controller.rb
190
+ - app/helpers/dossier/application_helper.rb
191
+ - app/views/dossier/reports/show.html.haml
192
+ - config/routes.rb
193
+ - lib/dossier/adapter/active_record/result.rb
194
+ - lib/dossier/adapter/active_record.rb
195
+ - lib/dossier/client.rb
196
+ - lib/dossier/configuration.rb
197
+ - lib/dossier/engine.rb
198
+ - lib/dossier/formatter.rb
199
+ - lib/dossier/query.rb
200
+ - lib/dossier/report.rb
201
+ - lib/dossier/result.rb
202
+ - lib/dossier/stream_csv.rb
203
+ - lib/dossier/version.rb
204
+ - lib/dossier.rb
205
+ - lib/tasks/dossier_tasks.rake
206
+ - MIT-LICENSE
207
+ - Rakefile
208
+ - README.markdown
209
+ - spec/dossier/adapter/active_record/result_spec.rb
210
+ - spec/dossier/adapter/active_record_spec.rb
211
+ - spec/dossier/client_spec.rb
212
+ - spec/dossier/configuration_spec.rb
213
+ - spec/dossier/formatter_spec.rb
214
+ - spec/dossier/query_spec.rb
215
+ - spec/dossier/report_spec.rb
216
+ - spec/dossier/result_spec.rb
217
+ - spec/dossier_spec.rb
218
+ - spec/dummy/app/assets/javascripts/application.js
219
+ - spec/dummy/app/assets/stylesheets/application.css
220
+ - spec/dummy/app/controllers/application_controller.rb
221
+ - spec/dummy/app/controllers/site_controller.rb
222
+ - spec/dummy/app/helpers/application_helper.rb
223
+ - spec/dummy/app/views/dossier/reports/suspended_employee.html.haml
224
+ - spec/dummy/app/views/dossier/reports/total.html.haml
225
+ - spec/dummy/app/views/layouts/application.html.erb
226
+ - spec/dummy/config/application.rb
227
+ - spec/dummy/config/boot.rb
228
+ - spec/dummy/config/database.yml.example
229
+ - spec/dummy/config/environment.rb
230
+ - spec/dummy/config/environments/development.rb
231
+ - spec/dummy/config/environments/production.rb
232
+ - spec/dummy/config/environments/test.rb
233
+ - spec/dummy/config/initializers/backtrace_silencers.rb
234
+ - spec/dummy/config/initializers/inflections.rb
235
+ - spec/dummy/config/initializers/mime_types.rb
236
+ - spec/dummy/config/initializers/secret_token.rb
237
+ - spec/dummy/config/initializers/session_store.rb
238
+ - spec/dummy/config/initializers/wrap_parameters.rb
239
+ - spec/dummy/config/locales/en.yml
240
+ - spec/dummy/config/routes.rb
241
+ - spec/dummy/config/setup_load_paths.rb
242
+ - spec/dummy/config.ru
243
+ - spec/dummy/db/schema.rb
244
+ - spec/dummy/dossier_test
245
+ - spec/dummy/public/404.html
246
+ - spec/dummy/public/422.html
247
+ - spec/dummy/public/500.html
248
+ - spec/dummy/public/favicon.ico
249
+ - spec/dummy/Rakefile
250
+ - spec/dummy/README.rdoc
251
+ - spec/dummy/script/rails
252
+ - spec/fixtures/customized_employee_report.html
253
+ - spec/fixtures/db/mysql2.yml.example
254
+ - spec/fixtures/db/sqlite3.yml.example
255
+ - spec/fixtures/employee_report.csv
256
+ - spec/fixtures/employee_report.html
257
+ - spec/fixtures/employee_report_with_footer.html
258
+ - spec/fixtures/employee_with_custom_client.html
259
+ - spec/requests/employee_report_spec.rb
260
+ - spec/requests/employee_with_custom_client_spec.rb
261
+ - spec/routing/dossier_routes_spec.rb
262
+ - spec/spec_helper.rb
263
+ - spec/support/factory.rb
264
+ - spec/support/reports/employee_report.rb
265
+ - spec/support/reports/employee_with_custom_client.rb
266
+ - spec/support/reports/sqlite_employee_report.rb
267
+ - spec/support/reports/supended_employee_report.rb
268
+ - spec/support/reports/test_report.rb
269
+ - spec/support/reports/total_report.rb
270
+ homepage:
271
+ licenses: []
272
+ post_install_message:
273
+ rdoc_options: []
274
+ require_paths:
275
+ - lib
276
+ required_ruby_version: !ruby/object:Gem::Requirement
277
+ none: false
278
+ requirements:
279
+ - - ! '>='
280
+ - !ruby/object:Gem::Version
281
+ version: '0'
282
+ segments:
283
+ - 0
284
+ hash: 2096972700425199909
285
+ required_rubygems_version: !ruby/object:Gem::Requirement
286
+ none: false
287
+ requirements:
288
+ - - ! '>='
289
+ - !ruby/object:Gem::Version
290
+ version: '0'
291
+ segments:
292
+ - 0
293
+ hash: 2096972700425199909
294
+ requirements: []
295
+ rubyforge_project:
296
+ rubygems_version: 1.8.24
297
+ signing_key:
298
+ specification_version: 3
299
+ summary: SQL based report generation.
300
+ test_files:
301
+ - spec/dossier/adapter/active_record/result_spec.rb
302
+ - spec/dossier/adapter/active_record_spec.rb
303
+ - spec/dossier/client_spec.rb
304
+ - spec/dossier/configuration_spec.rb
305
+ - spec/dossier/formatter_spec.rb
306
+ - spec/dossier/query_spec.rb
307
+ - spec/dossier/report_spec.rb
308
+ - spec/dossier/result_spec.rb
309
+ - spec/dossier_spec.rb
310
+ - spec/dummy/app/assets/javascripts/application.js
311
+ - spec/dummy/app/assets/stylesheets/application.css
312
+ - spec/dummy/app/controllers/application_controller.rb
313
+ - spec/dummy/app/controllers/site_controller.rb
314
+ - spec/dummy/app/helpers/application_helper.rb
315
+ - spec/dummy/app/views/dossier/reports/suspended_employee.html.haml
316
+ - spec/dummy/app/views/dossier/reports/total.html.haml
317
+ - spec/dummy/app/views/layouts/application.html.erb
318
+ - spec/dummy/config/application.rb
319
+ - spec/dummy/config/boot.rb
320
+ - spec/dummy/config/database.yml.example
321
+ - spec/dummy/config/environment.rb
322
+ - spec/dummy/config/environments/development.rb
323
+ - spec/dummy/config/environments/production.rb
324
+ - spec/dummy/config/environments/test.rb
325
+ - spec/dummy/config/initializers/backtrace_silencers.rb
326
+ - spec/dummy/config/initializers/inflections.rb
327
+ - spec/dummy/config/initializers/mime_types.rb
328
+ - spec/dummy/config/initializers/secret_token.rb
329
+ - spec/dummy/config/initializers/session_store.rb
330
+ - spec/dummy/config/initializers/wrap_parameters.rb
331
+ - spec/dummy/config/locales/en.yml
332
+ - spec/dummy/config/routes.rb
333
+ - spec/dummy/config/setup_load_paths.rb
334
+ - spec/dummy/config.ru
335
+ - spec/dummy/db/schema.rb
336
+ - spec/dummy/dossier_test
337
+ - spec/dummy/public/404.html
338
+ - spec/dummy/public/422.html
339
+ - spec/dummy/public/500.html
340
+ - spec/dummy/public/favicon.ico
341
+ - spec/dummy/Rakefile
342
+ - spec/dummy/README.rdoc
343
+ - spec/dummy/script/rails
344
+ - spec/fixtures/customized_employee_report.html
345
+ - spec/fixtures/db/mysql2.yml.example
346
+ - spec/fixtures/db/sqlite3.yml.example
347
+ - spec/fixtures/employee_report.csv
348
+ - spec/fixtures/employee_report.html
349
+ - spec/fixtures/employee_report_with_footer.html
350
+ - spec/fixtures/employee_with_custom_client.html
351
+ - spec/requests/employee_report_spec.rb
352
+ - spec/requests/employee_with_custom_client_spec.rb
353
+ - spec/routing/dossier_routes_spec.rb
354
+ - spec/spec_helper.rb
355
+ - spec/support/factory.rb
356
+ - spec/support/reports/employee_report.rb
357
+ - spec/support/reports/employee_with_custom_client.rb
358
+ - spec/support/reports/sqlite_employee_report.rb
359
+ - spec/support/reports/supended_employee_report.rb
360
+ - spec/support/reports/test_report.rb
361
+ - spec/support/reports/total_report.rb