reports_kit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rubocop.yml +83 -0
  4. data/Gemfile +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +468 -0
  7. data/Rakefile +2 -0
  8. data/app/assets/javascripts/reports_kit/application.js +14 -0
  9. data/app/assets/javascripts/reports_kit/lib/_init.js +8 -0
  10. data/app/assets/javascripts/reports_kit/lib/chart.js +39 -0
  11. data/app/assets/javascripts/reports_kit/lib/report.js +119 -0
  12. data/app/assets/javascripts/reports_kit/vendor/chart.js +12269 -0
  13. data/app/assets/javascripts/reports_kit/vendor/daterangepicker.js +1627 -0
  14. data/app/assets/javascripts/reports_kit/vendor/moment.js +4040 -0
  15. data/app/assets/javascripts/reports_kit/vendor/select2.full.js +6436 -0
  16. data/app/assets/stylesheets/reports_kit/application.css.scss +3 -0
  17. data/app/assets/stylesheets/reports_kit/reports.css.sass +7 -0
  18. data/app/assets/stylesheets/reports_kit/select2_overrides.css.sass +7 -0
  19. data/app/assets/stylesheets/reports_kit/vendor/daterangepicker.css +269 -0
  20. data/app/assets/stylesheets/reports_kit/vendor/select2-bootstrap.css +721 -0
  21. data/app/assets/stylesheets/reports_kit/vendor/select2.css +484 -0
  22. data/config/routes.rb +10 -0
  23. data/docs/images/chart_options.png +0 -0
  24. data/docs/images/dashed_line.png +0 -0
  25. data/docs/images/flights_by_carrier.png +0 -0
  26. data/docs/images/flights_by_carrier_and_flight_at.png +0 -0
  27. data/docs/images/flights_by_delay.png +0 -0
  28. data/docs/images/flights_by_flight_at.png +0 -0
  29. data/docs/images/flights_by_hours_delayed.png +0 -0
  30. data/docs/images/flights_with_check_box.png +0 -0
  31. data/docs/images/flights_with_configured_boolean.png +0 -0
  32. data/docs/images/flights_with_configured_datetime.png +0 -0
  33. data/docs/images/flights_with_configured_number.png +0 -0
  34. data/docs/images/flights_with_configured_string.png +0 -0
  35. data/docs/images/flights_with_date_range.png +0 -0
  36. data/docs/images/flights_with_filters.png +0 -0
  37. data/docs/images/flights_with_multi_autocomplete.png +0 -0
  38. data/docs/images/flights_with_string_filter.png +0 -0
  39. data/docs/images/horizontal_bar.png +0 -0
  40. data/docs/images/legend_right.png +0 -0
  41. data/docs/images/users_by_created_at.png +0 -0
  42. data/gists/doc.txt +58 -0
  43. data/lib/reports_kit.rb +17 -0
  44. data/lib/reports_kit/base_controller.rb +11 -0
  45. data/lib/reports_kit/configuration.rb +10 -0
  46. data/lib/reports_kit/engine.rb +21 -0
  47. data/lib/reports_kit/helper.rb +19 -0
  48. data/lib/reports_kit/model.rb +16 -0
  49. data/lib/reports_kit/model_configuration.rb +23 -0
  50. data/lib/reports_kit/rails.rb +5 -0
  51. data/lib/reports_kit/report_builder.rb +76 -0
  52. data/lib/reports_kit/reports/data/chart_options.rb +132 -0
  53. data/lib/reports_kit/reports/data/generate.rb +65 -0
  54. data/lib/reports_kit/reports/data/one_dimension.rb +71 -0
  55. data/lib/reports_kit/reports/data/two_dimensions.rb +129 -0
  56. data/lib/reports_kit/reports/data/utils.rb +79 -0
  57. data/lib/reports_kit/reports/dimension.rb +78 -0
  58. data/lib/reports_kit/reports/filter.rb +84 -0
  59. data/lib/reports_kit/reports/filter_types/base.rb +47 -0
  60. data/lib/reports_kit/reports/filter_types/boolean.rb +30 -0
  61. data/lib/reports_kit/reports/filter_types/datetime.rb +27 -0
  62. data/lib/reports_kit/reports/filter_types/number.rb +28 -0
  63. data/lib/reports_kit/reports/filter_types/records.rb +26 -0
  64. data/lib/reports_kit/reports/filter_types/string.rb +38 -0
  65. data/lib/reports_kit/reports/generate_autocomplete_results.rb +55 -0
  66. data/lib/reports_kit/reports/inferrable_configuration.rb +113 -0
  67. data/lib/reports_kit/reports/measure.rb +58 -0
  68. data/lib/reports_kit/reports_controller.rb +15 -0
  69. data/lib/reports_kit/resources_controller.rb +8 -0
  70. data/lib/reports_kit/version.rb +3 -0
  71. data/reports_kit.gemspec +23 -0
  72. data/spec/factories/issue_factory.rb +4 -0
  73. data/spec/factories/issues_label_factory.rb +4 -0
  74. data/spec/factories/label_factory.rb +4 -0
  75. data/spec/factories/repo_factory.rb +5 -0
  76. data/spec/factories/tag_factory.rb +4 -0
  77. data/spec/fixtures/generate_inputs.yml +35 -0
  78. data/spec/fixtures/generate_outputs.yml +208 -0
  79. data/spec/reports_kit/reports/data/generate_spec.rb +275 -0
  80. data/spec/reports_kit/reports/dimension_spec.rb +38 -0
  81. data/spec/reports_kit/reports/filter_spec.rb +38 -0
  82. data/spec/spec_helper.rb +58 -0
  83. data/spec/support/factory_girl.rb +5 -0
  84. data/spec/support/helpers.rb +13 -0
  85. data/spec/support/models/issue.rb +6 -0
  86. data/spec/support/models/issues_label.rb +4 -0
  87. data/spec/support/models/label.rb +5 -0
  88. data/spec/support/models/repo.rb +7 -0
  89. data/spec/support/models/tag.rb +4 -0
  90. data/spec/support/schema.rb +38 -0
  91. metadata +232 -0
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReportsKit::Reports::Dimension do
4
+ subject { described_class.new(properties, measure: measure) }
5
+ let(:measure) { ReportsKit::Reports::Measure.new('issue') }
6
+
7
+ context 'with a datetime dimension' do
8
+ let(:properties) { 'opened_at' }
9
+
10
+ it 'returns the settings' do
11
+ expect(subject.settings).to eq({ column: 'issues.opened_at', group: "date_trunc('week', issues.opened_at::timestamp)" })
12
+ end
13
+ end
14
+
15
+ context 'with a belongs_to association dimension' do
16
+ let(:properties) { 'repo' }
17
+
18
+ it 'returns the settings' do
19
+ expect(subject.settings).to eq({ column: 'issues.repo_id', group: 'issues.repo_id' })
20
+ end
21
+ end
22
+
23
+ context 'with a has_many association dimension' do
24
+ let(:properties) { 'tags' }
25
+
26
+ it 'returns the settings' do
27
+ expect(subject.settings).to eq({ joins: :tags, column: 'tags.id', group: 'issues.issue_id' })
28
+ end
29
+ end
30
+
31
+ context 'with a has_many :through association dimension' do
32
+ let(:properties) { 'labels' }
33
+
34
+ it 'returns the settings' do
35
+ expect(subject.settings).to eq({ joins: :issues_labels, column: 'issues_labels.label_id', group: 'issues.label_id' })
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReportsKit::Reports::Filter do
4
+ subject { described_class.new(properties, measure: measure) }
5
+ let(:measure) { ReportsKit::Reports::Measure.new('issue') }
6
+
7
+ context 'with a datetime filter' do
8
+ let(:properties) { 'opened_at' }
9
+
10
+ it 'returns the settings' do
11
+ expect(subject.settings).to eq({ column: 'issues.opened_at' })
12
+ end
13
+ end
14
+
15
+ context 'with a belongs_to association filter' do
16
+ let(:properties) { 'repo' }
17
+
18
+ it 'returns the settings' do
19
+ expect(subject.settings).to eq({ column: 'issues.repo_id' })
20
+ end
21
+ end
22
+
23
+ context 'with a has_many association filter' do
24
+ let(:properties) { 'tags' }
25
+
26
+ it 'returns the settings' do
27
+ expect(subject.settings).to eq({ joins: :tags, column: 'tags.id' })
28
+ end
29
+ end
30
+
31
+ context 'with a has_many :through association filter' do
32
+ let(:properties) { 'labels' }
33
+
34
+ it 'returns the settings' do
35
+ expect(subject.settings).to eq({ joins: :issues_labels, column: 'issues_labels.label_id' })
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,58 @@
1
+ require 'reports_kit'
2
+
3
+ require 'database_cleaner'
4
+ require 'pry'
5
+ require 'timecop'
6
+ require 'support/factory_girl'
7
+ require 'support/helpers'
8
+
9
+ directory = File.dirname(File.absolute_path(__FILE__))
10
+ Dir.glob("#{directory}/factories/*.rb") { |file| require file }
11
+ Dir.glob("#{directory}/support/models/*.rb") { |file| require file }
12
+
13
+ Time.zone = ActiveSupport::TimeZone.new('UTC')
14
+ ActiveRecord::Base.default_timezone = :utc
15
+ ActiveRecord::Base.establish_connection(
16
+ adapter: 'postgresql',
17
+ host: 'localhost',
18
+ database: 'reports_kit_test',
19
+ username: 'postgres',
20
+ encoding: 'unicode'
21
+ )
22
+ require 'support/schema'
23
+
24
+ RSpec.configure do |config|
25
+ # ## Mock Framework
26
+ #
27
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
28
+ #
29
+ # config.mock_with :mocha
30
+ # config.mock_with :flexmock
31
+ # config.mock_with :rr
32
+
33
+ # Run specs in random order to surface order dependencies. If you find an
34
+ # order dependency and want to debug it, you can fix the order by providing
35
+ # the seed, which is printed after each run.
36
+ # --seed 1234
37
+ config.order = 'random'
38
+
39
+ config.before(:each) do
40
+ Timecop.freeze(Time.utc(2010))
41
+ end
42
+ config.after(:each) do
43
+ Timecop.return
44
+ end
45
+
46
+ config.before(:suite) do
47
+ DatabaseCleaner.strategy = :transaction
48
+ DatabaseCleaner.clean_with(:truncation)
49
+ end
50
+
51
+ config.around(:each) do |example|
52
+ DatabaseCleaner.cleaning do
53
+ example.run
54
+ end
55
+ end
56
+
57
+ config.include Helpers
58
+ end
@@ -0,0 +1,5 @@
1
+ require 'factory_girl'
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryGirl::Syntax::Methods
5
+ end
@@ -0,0 +1,13 @@
1
+ module Helpers
2
+ def now
3
+ Time.zone.now
4
+ end
5
+
6
+ def date_string_for_filter(time)
7
+ time.strftime('%b %-d, %Y')
8
+ end
9
+
10
+ def format_time(week_offset)
11
+ ReportsKit::Reports::Data::Utils.format_time((now - week_offset.weeks).beginning_of_week)
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ class Issue < ActiveRecord::Base
2
+ belongs_to :repo
3
+ has_many :issues_labels
4
+ has_many :labels, through: :issues_labels
5
+ has_many :tags
6
+ end
@@ -0,0 +1,4 @@
1
+ class IssuesLabel < ActiveRecord::Base
2
+ belongs_to :issue
3
+ belongs_to :label
4
+ end
@@ -0,0 +1,5 @@
1
+ class Label < ActiveRecord::Base
2
+ belongs_to :repo
3
+ has_many :issues_labels
4
+ has_many :issues, through: :issues_labels
5
+ end
@@ -0,0 +1,7 @@
1
+ class Repo < ActiveRecord::Base
2
+ has_many :issues
3
+
4
+ def to_s
5
+ full_name
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ class Tag < ActiveRecord::Base
2
+ belongs_to :repo
3
+ belongs_to :issue
4
+ end
@@ -0,0 +1,38 @@
1
+ ActiveRecord::Schema.define do
2
+ self.verbose = false
3
+
4
+ create_table :issues, :force => :cascade do |t|
5
+ t.integer :repo_id
6
+ t.string :title
7
+ t.integer :source_user_id
8
+ t.string :state
9
+ t.boolean :locked
10
+ t.datetime :opened_at
11
+ t.datetime :closed_at
12
+ t.timestamps
13
+ end
14
+
15
+ create_table :issues_labels, force: :cascade do |t|
16
+ t.integer :issue_id
17
+ t.integer :label_id
18
+ t.timestamps
19
+ end
20
+
21
+ create_table :labels, force: :cascade do |t|
22
+ t.integer :repo_id
23
+ t.string :name
24
+ t.timestamps
25
+ end
26
+
27
+ create_table :repos, :force => :cascade do |t|
28
+ t.string :full_name
29
+ t.timestamps
30
+ end
31
+
32
+ create_table :tags, force: :cascade do |t|
33
+ t.integer :repo_id
34
+ t.integer :issue_id
35
+ t.string :name
36
+ t.timestamps
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reports_kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tom Benner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: database_cleaner
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Beautiful, interactive charts for Ruby on Rails
112
+ email:
113
+ - tombenner@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rubocop.yml"
120
+ - Gemfile
121
+ - MIT-LICENSE
122
+ - README.md
123
+ - Rakefile
124
+ - app/assets/javascripts/reports_kit/application.js
125
+ - app/assets/javascripts/reports_kit/lib/_init.js
126
+ - app/assets/javascripts/reports_kit/lib/chart.js
127
+ - app/assets/javascripts/reports_kit/lib/report.js
128
+ - app/assets/javascripts/reports_kit/vendor/chart.js
129
+ - app/assets/javascripts/reports_kit/vendor/daterangepicker.js
130
+ - app/assets/javascripts/reports_kit/vendor/moment.js
131
+ - app/assets/javascripts/reports_kit/vendor/select2.full.js
132
+ - app/assets/stylesheets/reports_kit/application.css.scss
133
+ - app/assets/stylesheets/reports_kit/reports.css.sass
134
+ - app/assets/stylesheets/reports_kit/select2_overrides.css.sass
135
+ - app/assets/stylesheets/reports_kit/vendor/daterangepicker.css
136
+ - app/assets/stylesheets/reports_kit/vendor/select2-bootstrap.css
137
+ - app/assets/stylesheets/reports_kit/vendor/select2.css
138
+ - config/routes.rb
139
+ - docs/images/chart_options.png
140
+ - docs/images/dashed_line.png
141
+ - docs/images/flights_by_carrier.png
142
+ - docs/images/flights_by_carrier_and_flight_at.png
143
+ - docs/images/flights_by_delay.png
144
+ - docs/images/flights_by_flight_at.png
145
+ - docs/images/flights_by_hours_delayed.png
146
+ - docs/images/flights_with_check_box.png
147
+ - docs/images/flights_with_configured_boolean.png
148
+ - docs/images/flights_with_configured_datetime.png
149
+ - docs/images/flights_with_configured_number.png
150
+ - docs/images/flights_with_configured_string.png
151
+ - docs/images/flights_with_date_range.png
152
+ - docs/images/flights_with_filters.png
153
+ - docs/images/flights_with_multi_autocomplete.png
154
+ - docs/images/flights_with_string_filter.png
155
+ - docs/images/horizontal_bar.png
156
+ - docs/images/legend_right.png
157
+ - docs/images/users_by_created_at.png
158
+ - gists/doc.txt
159
+ - lib/reports_kit.rb
160
+ - lib/reports_kit/base_controller.rb
161
+ - lib/reports_kit/configuration.rb
162
+ - lib/reports_kit/engine.rb
163
+ - lib/reports_kit/helper.rb
164
+ - lib/reports_kit/model.rb
165
+ - lib/reports_kit/model_configuration.rb
166
+ - lib/reports_kit/rails.rb
167
+ - lib/reports_kit/report_builder.rb
168
+ - lib/reports_kit/reports/data/chart_options.rb
169
+ - lib/reports_kit/reports/data/generate.rb
170
+ - lib/reports_kit/reports/data/one_dimension.rb
171
+ - lib/reports_kit/reports/data/two_dimensions.rb
172
+ - lib/reports_kit/reports/data/utils.rb
173
+ - lib/reports_kit/reports/dimension.rb
174
+ - lib/reports_kit/reports/filter.rb
175
+ - lib/reports_kit/reports/filter_types/base.rb
176
+ - lib/reports_kit/reports/filter_types/boolean.rb
177
+ - lib/reports_kit/reports/filter_types/datetime.rb
178
+ - lib/reports_kit/reports/filter_types/number.rb
179
+ - lib/reports_kit/reports/filter_types/records.rb
180
+ - lib/reports_kit/reports/filter_types/string.rb
181
+ - lib/reports_kit/reports/generate_autocomplete_results.rb
182
+ - lib/reports_kit/reports/inferrable_configuration.rb
183
+ - lib/reports_kit/reports/measure.rb
184
+ - lib/reports_kit/reports_controller.rb
185
+ - lib/reports_kit/resources_controller.rb
186
+ - lib/reports_kit/version.rb
187
+ - reports_kit.gemspec
188
+ - spec/factories/issue_factory.rb
189
+ - spec/factories/issues_label_factory.rb
190
+ - spec/factories/label_factory.rb
191
+ - spec/factories/repo_factory.rb
192
+ - spec/factories/tag_factory.rb
193
+ - spec/fixtures/generate_inputs.yml
194
+ - spec/fixtures/generate_outputs.yml
195
+ - spec/reports_kit/reports/data/generate_spec.rb
196
+ - spec/reports_kit/reports/dimension_spec.rb
197
+ - spec/reports_kit/reports/filter_spec.rb
198
+ - spec/spec_helper.rb
199
+ - spec/support/factory_girl.rb
200
+ - spec/support/helpers.rb
201
+ - spec/support/models/issue.rb
202
+ - spec/support/models/issues_label.rb
203
+ - spec/support/models/label.rb
204
+ - spec/support/models/repo.rb
205
+ - spec/support/models/tag.rb
206
+ - spec/support/schema.rb
207
+ homepage: https://github.com/tombenner/reports_kit
208
+ licenses:
209
+ - MIT
210
+ metadata: {}
211
+ post_install_message:
212
+ rdoc_options: []
213
+ require_paths:
214
+ - lib
215
+ required_ruby_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ requirements: []
226
+ rubyforge_project:
227
+ rubygems_version: 2.4.8
228
+ signing_key:
229
+ specification_version: 4
230
+ summary: Beautiful, interactive charts for Ruby on Rails
231
+ test_files: []
232
+ has_rdoc: