datatable 0.1.1alpha4 → 0.2pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +3 -0
- data/example_app/.gitignore +1 -0
- data/example_app/Gemfile.lock +1 -1
- data/example_app/app/controllers/orders_controller.rb +13 -1
- data/example_app/app/datatables/{orders_index.rb → example1.rb} +1 -1
- data/example_app/app/datatables/example2.rb +13 -0
- data/example_app/app/views/orders/example1.html.erb +11 -0
- data/example_app/app/views/orders/example2.html.erb +10 -0
- data/example_app/app/views/orders/index.html.erb +5 -14
- data/example_app/config/routes.rb +4 -1
- data/example_app/spec/datatables/active_record_dsl_spec.rb +1 -8
- data/example_app/spec/datatables/sql_search_global_spec.rb +2 -0
- data/example_app/spec/datatables/sql_variables_spec.rb +47 -80
- data/lib/datatable/active_record_dsl.rb +8 -4
- data/lib/datatable/version.rb +1 -1
- data/lib/datatable.rb +87 -42
- metadata +31 -55
data/.gitignore
CHANGED
data/Rakefile
CHANGED
data/example_app/.gitignore
CHANGED
data/example_app/Gemfile.lock
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
class OrdersController < ApplicationController
|
2
2
|
|
3
3
|
def index
|
4
|
-
|
4
|
+
end
|
5
|
+
|
6
|
+
def example1
|
7
|
+
@datatable = Example1
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.js { render :json => @datatable.query(params).to_json }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def example2
|
15
|
+
@datatable = Example2
|
16
|
+
@datatable.relation = Order.select([:order_number, :memo]).where(["memo like ?", 'red'])
|
5
17
|
respond_to do |format|
|
6
18
|
format.html
|
7
19
|
format.js { render :json => @datatable.query(params).to_json }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Example2 < Datatable::Base
|
2
|
+
|
3
|
+
set_model Order
|
4
|
+
|
5
|
+
column :id, :type => :integer, :sTitle => "Id"
|
6
|
+
column :memo
|
7
|
+
|
8
|
+
option('individual_column_searching', true)
|
9
|
+
option('sDom', '<"clear"><"H"Trf>t<"F"i>')
|
10
|
+
option('bScrollInfinite', true)
|
11
|
+
option('bScrollCollapse', true)
|
12
|
+
option('sScrollY', '200px')
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<h1>Example #1</h1>
|
2
|
+
|
3
|
+
<%#= stylesheet_link_tag '/datatable/css/demo_table.css' %>
|
4
|
+
|
5
|
+
<%= stylesheet_link_tag '/datatable/css/smoothness/jquery-ui-1.8.14.custom.css' %>
|
6
|
+
<%= stylesheet_link_tag '/datatable/css/demo_table_jui.css' %>
|
7
|
+
|
8
|
+
<%= datatable %>
|
9
|
+
|
10
|
+
|
11
|
+
<%= javascript_include_datatable %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h1>Example #2</h1>
|
2
|
+
|
3
|
+
<%#= stylesheet_link_tag '/datatable/css/demo_table.css' %>
|
4
|
+
|
5
|
+
<%= stylesheet_link_tag '/datatable/css/smoothness/jquery-ui-1.8.14.custom.css' %>
|
6
|
+
<%= stylesheet_link_tag '/datatable/css/demo_table_jui.css' %>
|
7
|
+
|
8
|
+
<%= datatable %>
|
9
|
+
|
10
|
+
<%= javascript_include_datatable %>
|
@@ -1,14 +1,5 @@
|
|
1
|
-
|
2
|
-
<
|
3
|
-
|
4
|
-
</
|
5
|
-
|
6
|
-
<%#= stylesheet_link_tag '/datatable/css/demo_table.css' %>
|
7
|
-
|
8
|
-
<%= stylesheet_link_tag '/datatable/css/smoothness/jquery-ui-1.8.14.custom.css' %>
|
9
|
-
<%= stylesheet_link_tag '/datatable/css/demo_table_jui.css' %>
|
10
|
-
|
11
|
-
<%= datatable %>
|
12
|
-
|
13
|
-
|
14
|
-
<%= javascript_include_datatable %>
|
1
|
+
<h1>Datatable Examples</h1>
|
2
|
+
<ul>
|
3
|
+
<li><%= link_to "example 1", example1_path %> - sql override</li>
|
4
|
+
<li><%= link_to "example 2", example2_path %> - active relation</li>
|
5
|
+
</ul>
|
@@ -2,14 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'Generating sql based on our DSL' do
|
4
4
|
|
5
|
-
# it 'should work' do
|
6
|
-
# Order.create!(:order_number => 32)
|
7
|
-
# datatable = OrdersIndex.new
|
8
|
-
# params = {}
|
9
|
-
# json = datatable.query(params).json
|
10
|
-
# json['aaRecords'][0][0].should == 32
|
11
|
-
# end
|
12
|
-
|
13
5
|
it 'should select two fields' do
|
14
6
|
class OrdersSimple < Datatable::Base
|
15
7
|
set_model Order
|
@@ -37,6 +29,7 @@ describe 'Generating sql based on our DSL' do
|
|
37
29
|
OrdersSimple.relation.should == Order.select(orders[:memo]).joins(:customer)
|
38
30
|
end
|
39
31
|
|
32
|
+
|
40
33
|
it 'should handle a join with an inner column' do
|
41
34
|
class OrdersSimple < Datatable::Base
|
42
35
|
set_model Order
|
@@ -46,6 +46,8 @@ describe 'SQL defined datatable supports global search' do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'integer columns' do
|
49
|
+
# make sure all of the order numbers are nil so they don't match
|
50
|
+
Order.update_all(:order_number => nil)
|
49
51
|
order_id = Order.all[rand(Order.count)].id.to_s
|
50
52
|
@params['sSearch'] = order_id
|
51
53
|
T.query(@params).to_json['aaData'][0][0].should == order_id
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe 'variable substitution' do
|
3
|
+
describe 'variable substitution in' do
|
4
4
|
|
5
5
|
before do
|
6
6
|
Object.send(:remove_const, :T) rescue nil
|
@@ -8,97 +8,64 @@ describe 'variable substitution' do
|
|
8
8
|
@params = { "iColumns" => 1 }
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
orders.id
|
17
|
-
FROM
|
18
|
-
orders
|
19
|
-
WHERE
|
20
|
-
orders.id = {{order_id}}
|
21
|
-
SQL
|
22
|
-
columns(
|
23
|
-
{'orders.id' => {:type => :integer}}
|
24
|
-
)
|
25
|
-
end
|
26
|
-
order_id = Order.last.id
|
27
|
-
T.query(@params, :order_id => order_id).to_json['aaData'].length.should == 1
|
28
|
-
T.query(@params, :order_id => order_id).to_json['aaData'].flatten.first.should == order_id.to_s
|
11
|
+
it "sql clause handles strings" do
|
12
|
+
class T < Datatable::Base
|
13
|
+
count "SELECT count(orders.id) FROM orders"
|
14
|
+
sql "SELECT orders.id FROM {{table}}"
|
15
|
+
columns({'orders.id' => {:type => :integer}})
|
29
16
|
end
|
17
|
+
T.query(@params, :table => "orders").to_json['aaData'].flatten.sort.should == Order.all.map(&:id).map(&:to_s).sort
|
18
|
+
end
|
30
19
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
T.query(@params, :order_ids => order_ids).to_json['aaData'].flatten.sort.should == Order.order(:id).all.map {|o| o.id.to_s }
|
20
|
+
it "count clause handles strings" do
|
21
|
+
class T < Datatable::Base
|
22
|
+
count "SELECT count(orders.id) FROM {{table}}"
|
23
|
+
sql "SELECT orders.id FROM orders"
|
24
|
+
columns({'orders.id' => {:type => :integer}})
|
25
|
+
end
|
26
|
+
T.query(@params, :table => "orders").to_json['aaData'].flatten.sort.should == Order.all.map(&:id).map(&:to_s).sort
|
27
|
+
end
|
28
|
+
|
29
|
+
it "where clause handles strings" do
|
30
|
+
class T < Datatable::Base
|
31
|
+
count "SELECT count(orders.id) FROM orders"
|
32
|
+
sql "SELECT orders.id FROM orders"
|
33
|
+
where "{{table}}.id IS NOT NULL"
|
34
|
+
columns({'orders.id' => {:type => :integer}})
|
47
35
|
end
|
36
|
+
T.query(@params, :table => "orders").to_json['aaData'].flatten.sort.should == Order.all.map(&:id).map(&:to_s).sort
|
48
37
|
end
|
49
38
|
|
50
|
-
it
|
39
|
+
it "where clause handles arrays" do
|
51
40
|
class T < Datatable::Base
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
orders
|
57
|
-
SQL
|
58
|
-
sql <<-SQL
|
59
|
-
SELECT
|
60
|
-
orders.id
|
61
|
-
FROM
|
62
|
-
orders
|
63
|
-
SQL
|
64
|
-
where <<-SQL
|
65
|
-
orders.id = {{order_id}}
|
66
|
-
SQL
|
67
|
-
columns(
|
68
|
-
{'orders.id' => {:type => :integer}}
|
69
|
-
)
|
41
|
+
count "SELECT count(orders.id) FROM orders"
|
42
|
+
sql "SELECT orders.id FROM orders"
|
43
|
+
where "orders.id in {{order_ids}}"
|
44
|
+
columns({'orders.id' => {:type => :integer}})
|
70
45
|
end
|
71
|
-
|
72
|
-
T.query(@params, :order_id => order_id).to_json['aaData'].length.should == 1
|
73
|
-
T.query(@params, :order_id => order_id).to_json['aaData'].should == [[order_id.to_s]]
|
46
|
+
T.query(@params, :order_ids => Order.all.map(&:id)).to_json['aaData'].flatten.sort.should == Order.all.map(&:id).map(&:to_s).sort
|
74
47
|
end
|
75
48
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
FROM
|
83
|
-
orders
|
84
|
-
SQL
|
85
|
-
sql <<-SQL
|
86
|
-
SELECT
|
87
|
-
orders.id
|
88
|
-
FROM
|
89
|
-
orders
|
90
|
-
SQL
|
91
|
-
where <<-SQL
|
92
|
-
orders.id = {{order_id}}
|
93
|
-
SQL
|
94
|
-
columns(
|
95
|
-
{'orders.id' => {:type => :integer}}
|
96
|
-
)
|
97
|
-
end
|
98
|
-
order_id = Order.last.id
|
49
|
+
it "where clause handles empty arrays" do
|
50
|
+
class T < Datatable::Base
|
51
|
+
count "SELECT count(orders.id) FROM orders"
|
52
|
+
sql "SELECT orders.id FROM orders"
|
53
|
+
where "orders.id in {{order_ids}}"
|
54
|
+
columns({'orders.id' => {:type => :integer}})
|
99
55
|
end
|
56
|
+
T.query(@params, :order_ids => []).to_json['aaData'].flatten.should == []
|
100
57
|
end
|
101
58
|
|
59
|
+
it "where clause handles multiple calls" do
|
60
|
+
class T < Datatable::Base
|
61
|
+
count "SELECT count(orders.id) FROM orders"
|
62
|
+
sql "SELECT orders.id FROM orders"
|
63
|
+
where "orders.id = {{order_ids}}"
|
64
|
+
columns({'orders.id' => {:type => :integer}})
|
65
|
+
end
|
66
|
+
T.query(@params, :order_ids => Order.order(:id).first.id ).to_json['aaData'].flatten.sort.should == [Order.order(:id).first.id.to_s]
|
67
|
+
T.query(@params, :order_ids => Order.order(:id).last.id ).to_json['aaData'].flatten.sort.should == [Order.order(:id).last.id.to_s]
|
68
|
+
end
|
102
69
|
|
103
70
|
|
104
71
|
end
|
@@ -10,6 +10,10 @@ module Datatable
|
|
10
10
|
@relation
|
11
11
|
end
|
12
12
|
|
13
|
+
def relation=(arg)
|
14
|
+
@relation = arg
|
15
|
+
end
|
16
|
+
|
13
17
|
def set_model(model)
|
14
18
|
@model = model
|
15
19
|
@relation = model
|
@@ -25,9 +29,10 @@ module Datatable
|
|
25
29
|
|
26
30
|
@columns ||= ActiveSupport::OrderedHash.new
|
27
31
|
|
28
|
-
column_hash =
|
29
|
-
column_hash[:type]
|
30
|
-
|
32
|
+
column_hash = options
|
33
|
+
unless column_hash[:type]
|
34
|
+
column_hash[:type] = current_model.columns.detect{ |col| col.name == c.to_s}.type
|
35
|
+
end
|
31
36
|
|
32
37
|
@columns["#{current_model.table_name}.#{c}"] = column_hash
|
33
38
|
|
@@ -36,7 +41,6 @@ module Datatable
|
|
36
41
|
|
37
42
|
# TODO: Change to joins to match arel
|
38
43
|
def join(association, &block)
|
39
|
-
|
40
44
|
@inner_model = current_model.reflect_on_association(association).klass
|
41
45
|
@relation = @relation.joins(association)
|
42
46
|
instance_eval(&block) if block_given?
|
data/lib/datatable/version.rb
CHANGED
data/lib/datatable.rb
CHANGED
@@ -58,14 +58,16 @@ module Datatable
|
|
58
58
|
attr_accessor :records
|
59
59
|
|
60
60
|
def self.sql(*args)
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
if args.empty?
|
62
|
+
@sql_string
|
63
|
+
else
|
64
|
+
@sql_string = args.first
|
65
|
+
end
|
64
66
|
end
|
65
|
-
|
67
|
+
|
66
68
|
def self.count(*args)
|
67
69
|
if args.empty?
|
68
|
-
|
70
|
+
@count_sql
|
69
71
|
else
|
70
72
|
@count_sql = args.first
|
71
73
|
end
|
@@ -73,14 +75,14 @@ module Datatable
|
|
73
75
|
|
74
76
|
def self.where(*args)
|
75
77
|
if args.empty?
|
76
|
-
|
78
|
+
@where_sql
|
77
79
|
else
|
78
80
|
@where_sql = args.first
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
def self.
|
83
|
-
|
84
|
+
def self.template_text
|
85
|
+
(where || "") + (count || "") + (sql || "")
|
84
86
|
end
|
85
87
|
|
86
88
|
def self.columns(*args)
|
@@ -126,28 +128,20 @@ module Datatable
|
|
126
128
|
skparams[key] = (value ? true : false) if key =~ /^b/
|
127
129
|
end
|
128
130
|
|
129
|
-
|
130
|
-
|
131
|
+
# scan the template text looking for the variables so
|
132
|
+
# we can give a sensible error if it's missing
|
133
|
+
variables.each do |key, value|
|
134
|
+
unless template_text =~ /#{key}/m
|
135
|
+
fail "Substitution key: '#{key}' not in found in SQL text"
|
136
|
+
end
|
131
137
|
end
|
132
|
-
|
133
|
-
|
138
|
+
|
134
139
|
datatable = new(skparams)
|
135
|
-
datatable.count
|
136
|
-
datatable.instance_query
|
140
|
+
datatable.count(variables)
|
141
|
+
datatable.instance_query(variables)
|
137
142
|
datatable
|
138
143
|
end
|
139
144
|
|
140
|
-
def self.substitute_variables(substitutions)
|
141
|
-
substitutions.stringify_keys.each do |key, value|
|
142
|
-
unless "#{@where_sql}#{@count_sql}#{@sql_string}" =~ /#{key}/m
|
143
|
-
fail "Substitution key: '#{key}' not in found in SQL text"
|
144
|
-
end
|
145
|
-
new_text = value.kind_of?(Array) ? "(#{value.join(', ')})" : value.to_s
|
146
|
-
@where_sql.try(:gsub!,"{{#{key}}}", new_text )
|
147
|
-
@sql_string.try(:gsub!, "{{#{key}}}", new_text)
|
148
|
-
@count_sql.try(:gsub!,"{{#{key}}}", new_text)
|
149
|
-
end
|
150
|
-
end
|
151
145
|
|
152
146
|
# only used in testing
|
153
147
|
def self.to_sql
|
@@ -174,13 +168,13 @@ module Datatable
|
|
174
168
|
@records = []
|
175
169
|
end
|
176
170
|
|
177
|
-
def instance_query
|
178
|
-
@records = self.class.
|
171
|
+
def instance_query(variables={})
|
172
|
+
@records = self.class.sql ? sql_instance_query(variables) : active_record_instance_query
|
179
173
|
self
|
180
174
|
end
|
181
175
|
|
182
|
-
def count
|
183
|
-
@count = self.class.
|
176
|
+
def count(variables={})
|
177
|
+
@count = self.class.sql ? sql_count(variables) : self.class.relation.count
|
184
178
|
end
|
185
179
|
|
186
180
|
|
@@ -195,27 +189,78 @@ module Datatable
|
|
195
189
|
|
196
190
|
private
|
197
191
|
|
198
|
-
def sql_count
|
199
|
-
if self.class.count
|
200
|
-
count_sql = self.class.count.dup
|
201
|
-
if self.class.where && !@already_counted
|
202
|
-
count_sql << " WHERE " + self.class.where
|
203
|
-
end
|
204
|
-
@already_counted = true
|
192
|
+
# def sql_count
|
193
|
+
# if self.class.count
|
194
|
+
# count_sql = self.class.count.dup
|
195
|
+
# if self.class.where && !@already_counted
|
196
|
+
# count_sql << " WHERE " + self.class.where
|
197
|
+
# end
|
198
|
+
# @already_counted = true
|
199
|
+
# else
|
200
|
+
# count_sql = query_sql.sub(/^\s*SELECT(.*?)FROM/mi, 'SELECT count(*) FROM')
|
201
|
+
# # we don't tak the where on because it's already been done inside query_sql
|
202
|
+
# end
|
203
|
+
# ActiveRecord::Base.connection.select_value(count_sql).to_i
|
204
|
+
# end
|
205
|
+
#
|
206
|
+
def sql_string
|
207
|
+
self.class.sql ? self.class.sql.dup : nil
|
208
|
+
end
|
209
|
+
|
210
|
+
def where_string
|
211
|
+
self.class.where ? self.class.where.dup : nil
|
212
|
+
end
|
213
|
+
|
214
|
+
def count_string
|
215
|
+
self.class.count ? self.class.count.dup : nil
|
216
|
+
end
|
217
|
+
|
218
|
+
def sql_count(variables)
|
219
|
+
if count_string.blank?
|
220
|
+
query = query_sql.sub(/^\s*SELECT(.*?)FROM/mi, 'SELECT count(*) FROM')
|
205
221
|
else
|
206
|
-
|
207
|
-
|
222
|
+
if where_string.blank?
|
223
|
+
query = count_string
|
224
|
+
else
|
225
|
+
query = count_string + " WHERE " + where_string
|
226
|
+
end
|
208
227
|
end
|
209
|
-
|
228
|
+
query = substitute_variables(query.dup, variables)
|
229
|
+
ActiveRecord::Base.connection.select_value(query).to_i
|
210
230
|
end
|
211
231
|
|
212
232
|
def column_attributes
|
213
233
|
self.class.columns
|
214
234
|
end
|
215
235
|
|
216
|
-
def
|
236
|
+
def evaluate_variable(value)
|
237
|
+
if value.kind_of?(Array)
|
238
|
+
if value.empty?
|
239
|
+
return "(NULL)"
|
240
|
+
else
|
241
|
+
return "(#{value.join(',')})"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
value.to_s
|
245
|
+
end
|
246
|
+
|
247
|
+
def substitute_variables(template, substitutions)
|
248
|
+
result = template.dup
|
249
|
+
substitutions.stringify_keys.each do |key, value|
|
250
|
+
if template =~ /#{key}/m
|
251
|
+
result.gsub!("{{#{key}}}", evaluate_variable(value))
|
252
|
+
else
|
253
|
+
#fail "Substitution key: '#{key}' not in found in SQL text\n#{template}"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
result
|
257
|
+
end
|
258
|
+
|
259
|
+
def sql_instance_query(variables)
|
260
|
+
query = query_sql + order_by_sql_fragment + limit_offset_sql_fragment
|
261
|
+
query = substitute_variables(query.dup, variables)
|
217
262
|
connection = self.class.model ? self.class.model.connection : ActiveRecord::Base.connection
|
218
|
-
connection.select_rows(
|
263
|
+
connection.select_rows(query)
|
219
264
|
end
|
220
265
|
|
221
266
|
def active_record_instance_query
|
@@ -319,7 +364,7 @@ module Datatable
|
|
319
364
|
end
|
320
365
|
|
321
366
|
def query_sql
|
322
|
-
result = self.class.
|
367
|
+
result = self.class.sql.dup
|
323
368
|
if self.class.where
|
324
369
|
result << " WHERE " + self.class.where
|
325
370
|
if search_string
|
metadata
CHANGED
@@ -1,50 +1,35 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: datatable
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
- alpha
|
11
|
-
- 4
|
12
|
-
version: 0.1.1alpha4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2pre1
|
5
|
+
prerelease: 3
|
13
6
|
platform: ruby
|
14
|
-
authors:
|
7
|
+
authors:
|
15
8
|
- Michael Greenly
|
16
9
|
- Mischa Fierer
|
17
10
|
autorequire:
|
18
11
|
bindir: bin
|
19
12
|
cert_chain: []
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-08-07 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
24
16
|
name: rails
|
25
|
-
|
17
|
+
requirement: &12836780 !ruby/object:Gem::Requirement
|
26
18
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
segments:
|
32
|
-
- 3
|
33
|
-
- 0
|
34
|
-
version: "3.0"
|
35
|
-
prerelease: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
36
23
|
type: :runtime
|
37
|
-
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *12836780
|
38
26
|
description: A Rails plugin for the jquery.datatables library
|
39
|
-
email:
|
27
|
+
email:
|
40
28
|
- michaelgreenly@logic-refinery.com
|
41
29
|
executables: []
|
42
|
-
|
43
30
|
extensions: []
|
44
|
-
|
45
31
|
extra_rdoc_files: []
|
46
|
-
|
47
|
-
files:
|
32
|
+
files:
|
48
33
|
- .bundle/config
|
49
34
|
- .gitignore
|
50
35
|
- .rspec
|
@@ -63,7 +48,8 @@ files:
|
|
63
48
|
- example_app/Rakefile
|
64
49
|
- example_app/app/controllers/application_controller.rb
|
65
50
|
- example_app/app/controllers/orders_controller.rb
|
66
|
-
- example_app/app/datatables/
|
51
|
+
- example_app/app/datatables/example1.rb
|
52
|
+
- example_app/app/datatables/example2.rb
|
67
53
|
- example_app/app/helpers/application_helper.rb
|
68
54
|
- example_app/app/models/customer.rb
|
69
55
|
- example_app/app/models/item.rb
|
@@ -71,6 +57,8 @@ files:
|
|
71
57
|
- example_app/app/models/order_item.rb
|
72
58
|
- example_app/app/models/sales_rep.rb
|
73
59
|
- example_app/app/views/layouts/application.html.erb
|
60
|
+
- example_app/app/views/orders/example1.html.erb
|
61
|
+
- example_app/app/views/orders/example2.html.erb
|
74
62
|
- example_app/app/views/orders/index.html.erb
|
75
63
|
- example_app/config.ru
|
76
64
|
- example_app/config/application.rb
|
@@ -233,38 +221,26 @@ files:
|
|
233
221
|
- vendor/datatable/media/js/jquery.dataTables.min.js
|
234
222
|
homepage: https://github.com/logic-refinery/datatable
|
235
223
|
licenses: []
|
236
|
-
|
237
224
|
post_install_message:
|
238
225
|
rdoc_options: []
|
239
|
-
|
240
|
-
require_paths:
|
226
|
+
require_paths:
|
241
227
|
- lib
|
242
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
228
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
243
229
|
none: false
|
244
|
-
requirements:
|
245
|
-
- -
|
246
|
-
- !ruby/object:Gem::Version
|
247
|
-
|
248
|
-
|
249
|
-
- 0
|
250
|
-
version: "0"
|
251
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - ! '>='
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '0'
|
234
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
235
|
none: false
|
253
|
-
requirements:
|
254
|
-
- -
|
255
|
-
- !ruby/object:Gem::Version
|
256
|
-
hash: 25
|
257
|
-
segments:
|
258
|
-
- 1
|
259
|
-
- 3
|
260
|
-
- 1
|
236
|
+
requirements:
|
237
|
+
- - ! '>'
|
238
|
+
- !ruby/object:Gem::Version
|
261
239
|
version: 1.3.1
|
262
240
|
requirements: []
|
263
|
-
|
264
241
|
rubyforge_project:
|
265
242
|
rubygems_version: 1.8.5
|
266
243
|
signing_key:
|
267
244
|
specification_version: 3
|
268
245
|
summary: A Rails plugin for the jquery.datatables library
|
269
246
|
test_files: []
|
270
|
-
|