ajax-datatables-rails 0.3.1 → 0.4.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +26 -0
  3. data/.gitignore +20 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +1157 -0
  6. data/.travis.yml +68 -0
  7. data/Appraisals +34 -0
  8. data/Gemfile +5 -1
  9. data/LICENSE +17 -18
  10. data/README.md +239 -239
  11. data/Rakefile +1 -1
  12. data/ajax-datatables-rails.gemspec +31 -24
  13. data/gemfiles/rails_4.0.13.gemfile +14 -0
  14. data/gemfiles/rails_4.1.15.gemfile +14 -0
  15. data/gemfiles/rails_4.2.8.gemfile +13 -0
  16. data/gemfiles/rails_5.0.3.gemfile +13 -0
  17. data/gemfiles/rails_5.1.1.gemfile +13 -0
  18. data/lib/ajax-datatables-rails.rb +9 -8
  19. data/lib/ajax-datatables-rails/base.rb +80 -156
  20. data/lib/ajax-datatables-rails/config.rb +8 -5
  21. data/lib/ajax-datatables-rails/datatable/column.rb +169 -0
  22. data/lib/ajax-datatables-rails/datatable/column_date_filter.rb +41 -0
  23. data/lib/ajax-datatables-rails/datatable/datatable.rb +79 -0
  24. data/lib/ajax-datatables-rails/datatable/simple_order.rb +31 -0
  25. data/lib/ajax-datatables-rails/datatable/simple_search.rb +18 -0
  26. data/lib/ajax-datatables-rails/orm/active_record.rb +52 -0
  27. data/lib/ajax-datatables-rails/version.rb +1 -1
  28. data/lib/generators/datatable/templates/ajax_datatables_rails_config.rb +3 -3
  29. data/lib/generators/rails/datatable_generator.rb +7 -19
  30. data/lib/generators/rails/templates/datatable.rb +26 -14
  31. data/spec/ajax-datatables-rails/base_spec.rb +190 -0
  32. data/spec/ajax-datatables-rails/configuration_spec.rb +43 -0
  33. data/spec/ajax-datatables-rails/datatable/column_spec.rb +109 -0
  34. data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +87 -0
  35. data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +13 -0
  36. data/spec/ajax-datatables-rails/datatable/simple_search_spec.rb +17 -0
  37. data/spec/ajax-datatables-rails/extended_spec.rb +20 -0
  38. data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +439 -0
  39. data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +66 -0
  40. data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +34 -0
  41. data/spec/ajax-datatables-rails/orm/active_record_spec.rb +25 -0
  42. data/spec/factories/user.rb +9 -0
  43. data/spec/install_oracle.sh +12 -0
  44. data/spec/spec_helper.rb +75 -3
  45. data/spec/support/schema.rb +14 -0
  46. data/spec/support/test_helpers.rb +174 -0
  47. data/spec/support/test_models.rb +2 -0
  48. metadata +169 -37
  49. data/lib/ajax-datatables-rails/extensions/kaminari.rb +0 -12
  50. data/lib/ajax-datatables-rails/extensions/simple_paginator.rb +0 -12
  51. data/lib/ajax-datatables-rails/extensions/will_paginate.rb +0 -12
  52. data/lib/ajax-datatables-rails/models.rb +0 -6
  53. data/spec/ajax-datatables-rails/ajax_datatables_rails_spec.rb +0 -351
  54. data/spec/ajax-datatables-rails/kaminari_spec.rb +0 -35
  55. data/spec/ajax-datatables-rails/models_spec.rb +0 -10
  56. data/spec/ajax-datatables-rails/simple_paginator_spec.rb +0 -32
  57. data/spec/ajax-datatables-rails/will_paginate_spec.rb +0 -28
  58. data/spec/schema.rb +0 -35
  59. data/spec/test_models.rb +0 -21
@@ -1,12 +0,0 @@
1
- module AjaxDatatablesRails
2
- module Extensions
3
- module Kaminari
4
-
5
- private
6
-
7
- def paginate_records(records)
8
- records.page(page).per(per_page)
9
- end
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module AjaxDatatablesRails
2
- module Extensions
3
- module SimplePaginator
4
-
5
- private
6
-
7
- def paginate_records(records)
8
- records.offset(offset).limit(per_page)
9
- end
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module AjaxDatatablesRails
2
- module Extensions
3
- module WillPaginate
4
-
5
- private
6
-
7
- def paginate_records(records)
8
- records.paginate(:page => page, :per_page => per_page)
9
- end
10
- end
11
- end
12
- end
@@ -1,6 +0,0 @@
1
- require 'active_support/ordered_options'
2
-
3
- module AjaxDatatablesRails
4
- class Models < ActiveSupport::OrderedOptions
5
- end
6
- end
@@ -1,351 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AjaxDatatablesRails::Base do
4
-
5
- params = {
6
- :draw => '5',
7
- :columns => {
8
- "0" => {
9
- :data => '0',
10
- :name => '',
11
- :searchable => true,
12
- :orderable => true,
13
- :search => { :value => '', :regex => false }
14
- },
15
- "1" => {
16
- :data => '1',
17
- :name => '',
18
- :searchable => true,
19
- :orderable => true,
20
- :search => { :value => '', :regex => false }
21
- }
22
- },
23
- :order => { "0" => { :column => '1', :dir => 'desc' } },
24
- :start => '0',
25
- :length => '10',
26
- :search => { :value => '', :regex => false },
27
- '_' => '1403141483098'
28
- }
29
- let(:view) { double('view', :params => params) }
30
-
31
- describe 'an instance' do
32
- it 'requires a view_context' do
33
- expect { AjaxDatatablesRails::Base.new }.to raise_error
34
- end
35
-
36
- it 'accepts an options hash' do
37
- datatable = AjaxDatatablesRails::Base.new(view, :foo => 'bar')
38
- expect(datatable.options).to eq(:foo => 'bar')
39
- end
40
- end
41
-
42
- describe 'helper methods' do
43
- describe '#offset' do
44
- it 'defaults to 0' do
45
- default_view = double('view', :params => {})
46
- datatable = AjaxDatatablesRails::Base.new(default_view)
47
- expect(datatable.send(:offset)).to eq(0)
48
- end
49
-
50
- it 'matches the value on view params[:start] minus 1' do
51
- paginated_view = double('view', :params => { :start => '11' })
52
- datatable = AjaxDatatablesRails::Base.new(paginated_view)
53
- expect(datatable.send(:offset)).to eq(10)
54
- end
55
- end
56
-
57
- describe '#page' do
58
- it 'calculates page number from params[:start] and #per_page' do
59
- paginated_view = double('view', :params => { :start => '11' })
60
- datatable = AjaxDatatablesRails::Base.new(paginated_view)
61
- expect(datatable.send(:page)).to eq(2)
62
- end
63
- end
64
-
65
- describe '#per_page' do
66
- it 'defaults to 10' do
67
- datatable = AjaxDatatablesRails::Base.new(view)
68
- expect(datatable.send(:per_page)).to eq(10)
69
- end
70
-
71
- it 'matches the value on view params[:length]' do
72
- other_view = double('view', :params => { :length => 20 })
73
- datatable = AjaxDatatablesRails::Base.new(other_view)
74
- expect(datatable.send(:per_page)).to eq(20)
75
- end
76
- end
77
-
78
- describe '#sort_column' do
79
- it 'returns a column name from the #sorting_columns array' do
80
- sort_view = double(
81
- 'view', :params => params
82
- )
83
- datatable = AjaxDatatablesRails::Base.new(sort_view)
84
- allow(datatable).to receive(:sortable_displayed_columns) { ["0", "1"] }
85
- allow(datatable).to receive(:sortable_columns) { ['User.foo', 'User.bar', 'User.baz'] }
86
-
87
- expect(datatable.send(:sort_column, sort_view.params[:order]["0"])).to eq('users.bar')
88
- end
89
- end
90
-
91
- describe '#sort_direction' do
92
- it 'matches value of params[:sSortDir_0]' do
93
- sorting_view = double(
94
- 'view',
95
- :params => {
96
- :order => {
97
- '0' => { :column => '1', :dir => 'desc' }
98
- }
99
- }
100
- )
101
- datatable = AjaxDatatablesRails::Base.new(sorting_view)
102
- expect(datatable.send(:sort_direction, sorting_view.params[:order]["0"])).to eq('DESC')
103
- end
104
-
105
- it 'can only be one option from ASC or DESC' do
106
- sorting_view = double(
107
- 'view',
108
- :params => {
109
- :order => {
110
- '0' => { :column => '1', :dir => 'foo' }
111
- }
112
- }
113
- )
114
- datatable = AjaxDatatablesRails::Base.new(sorting_view)
115
- expect(datatable.send(:sort_direction, sorting_view.params[:order]["0"])).to eq('ASC')
116
- end
117
- end
118
-
119
- describe "#configure" do
120
- let(:datatable) do
121
- class FooDatatable < AjaxDatatablesRails::Base
122
- end
123
-
124
- FooDatatable.new view
125
- end
126
-
127
- context "when model class name is regular" do
128
- it "should successfully get right model class" do
129
- expect(
130
- datatable.send(:search_condition, 'User.bar', 'bar')
131
- ).to be_a(Arel::Nodes::Matches)
132
- end
133
- end
134
-
135
- context "when custom named model class" do
136
- it "should successfully get right model class" do
137
- expect(
138
- datatable.send(:search_condition, 'Statistics::Request.bar', 'bar')
139
- ).to be_a(Arel::Nodes::Matches)
140
- end
141
- end
142
-
143
-
144
- context "when model class name camelcased" do
145
- it "should successfully get right model class" do
146
- expect(
147
- datatable.send(:search_condition, 'PurchasedOrder.bar', 'bar')
148
- ).to be_a(Arel::Nodes::Matches)
149
- end
150
- end
151
-
152
- context "when model class name is namespaced" do
153
- it "should successfully get right model class" do
154
- expect(
155
- datatable.send(:search_condition, 'Statistics::Session.bar', 'bar')
156
- ).to be_a(Arel::Nodes::Matches)
157
- end
158
- end
159
-
160
- context "when model class defined but not found" do
161
- it "raise 'uninitialized constant'" do
162
- expect {
163
- datatable.send(:search_condition, 'UnexistentModel.bar', 'bar')
164
- }.to raise_error(NameError, /uninitialized constant/)
165
- end
166
- end
167
-
168
- context 'when using deprecated notation' do
169
- it 'should successfully get right model class if exists' do
170
- expect(
171
- datatable.send(:search_condition, 'users.bar', 'bar')
172
- ).to be_a(Arel::Nodes::Matches)
173
- end
174
-
175
- it 'should display a deprecated message' do
176
- expect(AjaxDatatablesRails::Base).to receive(:deprecated)
177
- datatable.send(:search_condition, 'users.bar', 'bar')
178
- end
179
- end
180
- end
181
-
182
- describe '#sortable_columns' do
183
- it 'returns an array representing database columns' do
184
- datatable = AjaxDatatablesRails::Base.new(view)
185
- expect(datatable.sortable_columns).to eq([])
186
- end
187
- end
188
-
189
- describe '#searchable_columns' do
190
- it 'returns an array representing database columns' do
191
- datatable = AjaxDatatablesRails::Base.new(view)
192
- expect(datatable.searchable_columns).to eq([])
193
- end
194
- end
195
- end
196
-
197
- describe 'perform' do
198
- let(:results) { double('Collection', :offset => [], :limit => []) }
199
- let(:view) { double('view', :params => params) }
200
- let(:datatable) { AjaxDatatablesRails::Base.new(view) }
201
- let(:records) { double('Array').as_null_object }
202
-
203
- before(:each) do
204
- allow(datatable).to receive(:sortable_columns) { ['User.foo', 'User.bar'] }
205
- allow(datatable).to receive(:sortable_displayed_columns) { ["0", "1"] }
206
- end
207
-
208
- describe '#paginate_records' do
209
- it 'defaults to Extensions::SimplePaginator#paginate_records' do
210
- allow(records).to receive_message_chain(:offset, :limit)
211
-
212
- expect { datatable.send(:paginate_records, records) }.not_to raise_error
213
- end
214
- end
215
-
216
- describe '#sort_records' do
217
- it 'calls #order on a collection' do
218
- expect(results).to receive(:order)
219
- datatable.send(:sort_records, results)
220
- end
221
- end
222
-
223
- describe '#filter_records' do
224
- let(:records) { double('User', :where => []) }
225
- let(:search_view) { double('view', :params => params) }
226
-
227
- it 'applies search like functionality on a collection' do
228
- datatable = AjaxDatatablesRails::Base.new(search_view)
229
- allow(datatable).to receive(:searchable_columns) { ['users.foo'] }
230
-
231
- expect(records).to receive(:where)
232
- records.where
233
- datatable.send(:filter_records, records)
234
- end
235
- end
236
-
237
- describe '#filter_records with multi word model' do
238
- let(:records) { double('UserData', :where => []) }
239
- let(:search_view) { double('view', :params => params) }
240
-
241
- it 'applies search like functionality on a collection' do
242
- datatable = AjaxDatatablesRails::Base.new(search_view)
243
- allow(datatable).to receive(:searchable_columns) { ['user_datas.bar'] }
244
-
245
- expect(records).to receive(:where)
246
- records.where
247
- datatable.send(:filter_records, records)
248
- end
249
- end
250
- end
251
-
252
- describe 'hook methods' do
253
- let(:datatable) { AjaxDatatablesRails::Base.new(view) }
254
-
255
- describe '#data' do
256
- it 'raises a MethodNotImplementedError' do
257
- expect { datatable.data }.to raise_error(
258
- AjaxDatatablesRails::Base::MethodNotImplementedError,
259
- 'Please implement this method in your class.'
260
- )
261
- end
262
- end
263
-
264
- describe '#get_raw_records' do
265
- it 'raises a MethodNotImplementedError' do
266
- expect { datatable.get_raw_records }.to raise_error(
267
- AjaxDatatablesRails::Base::MethodNotImplementedError,
268
- 'Please implement this method in your class.'
269
- )
270
- end
271
- end
272
- end
273
- end
274
-
275
-
276
- describe AjaxDatatablesRails::Configuration do
277
- let(:config) { AjaxDatatablesRails::Configuration.new }
278
-
279
- describe "default config" do
280
- it "default db_adapter should :pg (postgresql)" do
281
- expect(config.db_adapter).to eq(:pg)
282
- end
283
- end
284
-
285
- describe "custom config" do
286
- it 'should accept db_adapter custom value' do
287
- config.db_adapter = :mysql2
288
- expect(config.db_adapter).to eq(:mysql2)
289
- end
290
- end
291
-
292
- describe '#typecast' do
293
- params = {
294
- :draw => '5',
295
- :columns => {
296
- "0" => {
297
- :data => '0',
298
- :name => '',
299
- :searchable => true,
300
- :orderable => true,
301
- :search => { :value => '', :regex => false }
302
- },
303
- "1" => {
304
- :data => '1',
305
- :name => '',
306
- :searchable => true,
307
- :orderable => true,
308
- :search => { :value => '', :regex => false }
309
- }
310
- },
311
- :order => { "0" => { :column => '1', :dir => 'desc' } },
312
- :start => '0',
313
- :length => '10',
314
- :search => { :value => '', :regex => false },
315
- '_' => '1403141483098'
316
- }
317
- let(:view) { double('view', :params => params) }
318
- let(:datatable) { AjaxDatatablesRails::Base.new(view) }
319
-
320
- it 'returns VARCHAR if :db_adapter is :pg' do
321
- expect(datatable.send(:typecast)).to eq('VARCHAR')
322
- end
323
-
324
- it 'returns CHAR if :db_adapter is :mysql2' do
325
- allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :mysql2 }
326
- expect(datatable.send(:typecast)).to eq('CHAR')
327
- end
328
-
329
- it 'returns TEXT if :db_adapter is :sqlite3' do
330
- allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :sqlite3 }
331
- expect(datatable.send(:typecast)).to eq('TEXT')
332
- end
333
- end
334
- end
335
-
336
- describe AjaxDatatablesRails do
337
- describe "configurations" do
338
- context "configurable from outside" do
339
- before(:each) do
340
- AjaxDatatablesRails.configure do |config|
341
- config.db_adapter = :mysql2
342
- end
343
- end
344
-
345
- it "should have custom value" do
346
- expect(AjaxDatatablesRails.config.db_adapter).to eq(:mysql2)
347
- end
348
- end
349
-
350
- end
351
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class KaminariDatatable < AjaxDatatablesRails::Base
4
- end
5
-
6
- describe KaminariDatatable do
7
- before(:each) do
8
- allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:paginator) { :kaminari }
9
- end
10
-
11
- describe '#paginate_records' do
12
- let(:users_database) do
13
- double('User',
14
- :all => double('RecordCollection',
15
- :page => double('Array', :per => [])
16
- )
17
- )
18
- end
19
-
20
- let(:datatable) { KaminariDatatable.new(double('view', :params => {})) }
21
- let(:records) { users_database.all }
22
-
23
- it 'calls #page on passed record collection' do
24
- expect(records).to receive(:page)
25
- datatable.send(:paginate_records, records)
26
- end
27
-
28
- it 'calls #per_page on passed record collection' do
29
- arry = double('Array', :per => [])
30
- allow(records).to receive(:page).and_return(arry)
31
- expect(arry).to receive(:per)
32
- datatable.send(:paginate_records, records)
33
- end
34
- end
35
- end
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe AjaxDatatablesRails::Models do
4
- let(:models){ AjaxDatatablesRails::Models.new }
5
-
6
- it "is configurable" do
7
- models.user = User
8
- expect(models.user).to eq(User)
9
- end
10
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class SimplePaginateDatatable < AjaxDatatablesRails::Base
4
- include AjaxDatatablesRails::Extensions::SimplePaginator
5
- end
6
-
7
- describe SimplePaginateDatatable do
8
- describe '#paginate_records' do
9
- let(:users_database) do
10
- double('User',
11
- :all => double('RecordCollection',
12
- :offset => double('Array', :limit => [])
13
- )
14
- )
15
- end
16
-
17
- let(:datatable) { SimplePaginateDatatable.new(double('view', :params => {})) }
18
- let(:records) { users_database.all }
19
-
20
- it 'calls #offset on passed record collection' do
21
- expect(records).to receive(:offset)
22
- datatable.send(:paginate_records, records)
23
- end
24
-
25
- it 'calls #limit on passed record collection' do
26
- arry = double('Array', :limit => [])
27
- allow(records).to receive(:offset).and_return(arry)
28
- expect(arry).to receive(:limit)
29
- datatable.send(:paginate_records, records)
30
- end
31
- end
32
- end