datagrid 1.5.6 → 1.6.1
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.
- checksums.yaml +5 -5
- data/.travis.yml +6 -3
- data/Gemfile +7 -3
- data/Readme.markdown +6 -0
- data/VERSION +1 -1
- data/app/views/datagrid/_table.html.erb +1 -1
- data/datagrid.gemspec +9 -8
- data/lib/datagrid/columns.rb +9 -15
- data/lib/datagrid/columns/column.rb +1 -6
- data/lib/datagrid/core.rb +18 -2
- data/lib/datagrid/drivers/active_record.rb +2 -1
- data/lib/datagrid/drivers/mongoid.rb +5 -1
- data/lib/datagrid/filters.rb +1 -1
- data/lib/datagrid/filters/base_filter.rb +3 -16
- data/lib/datagrid/filters/dynamic_filter.rb +15 -5
- data/lib/datagrid/filters/select_options.rb +1 -4
- data/lib/datagrid/form_builder.rb +3 -30
- data/lib/datagrid/helper.rb +1 -1
- data/lib/datagrid/locale/en.yml +6 -6
- data/lib/datagrid/renderer.rb +1 -2
- data/lib/datagrid/scaffold.rb +7 -1
- data/lib/datagrid/utils.rb +2 -6
- data/spec/datagrid/core_spec.rb +49 -0
- data/spec/datagrid/filters/date_filter_spec.rb +6 -3
- data/spec/datagrid/form_builder_spec.rb +4 -34
- data/spec/datagrid/helper_spec.rb +66 -8
- data/spec/datagrid/scaffold_spec.rb +7 -1
- data/spec/datagrid_spec.rb +13 -2
- data/spec/spec_helper.rb +16 -7
- data/spec/support/active_record.rb +1 -0
- data/spec/support/simple_report.rb +1 -1
- data/spec/support/test_partials/client/datagrid/_order_for.html.erb +2 -2
- data/spec/support/test_partials/client/datagrid/_table.html.erb +1 -1
- data/templates/base.rb.erb +2 -0
- metadata +11 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 76bece54343c202c79e7ca4d5e90ae1cc91d2c5a77b965a175b36df801e10bd1
|
4
|
+
data.tar.gz: 68e58ec9dec5f010b43a7e078fdbf2c3c1b0923c9f2ab38c327d3665570d08fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aeb7a29ea7df278090a6417e1f940dfe9f8b1aa57dd907f9f739c4d2bc3e613be66be28635c5cf51a70b9067a7f7da4a00e7adaf09ae8ddea0247c7f34a56b1
|
7
|
+
data.tar.gz: 8660381aa1d508c624b0bc6d1c6e71ca3e6c1e89cad518733aeaee31d1968dc6382c45d1d06cbb60cd33ea1407d3e79e92e5920d93483bdfd47a31ffa1e23cef
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -6,17 +6,21 @@ group :development do
|
|
6
6
|
|
7
7
|
gem "bundler"
|
8
8
|
if RUBY_VERSION >= "2.3"
|
9
|
-
gem "jeweler", ">= 2.1.2", platform:
|
9
|
+
gem "jeweler", ">= 2.1.2", platform: :mri, github: 'technicalpickles/jeweler'
|
10
10
|
end
|
11
11
|
|
12
12
|
|
13
13
|
#gem "json", ">= 1.9"
|
14
|
-
gem "pry-byebug"
|
14
|
+
gem "pry-byebug"
|
15
15
|
|
16
16
|
gem "rspec", ">= 3"
|
17
17
|
gem "nokogiri" # used to test html output
|
18
18
|
|
19
|
-
|
19
|
+
if RUBY_VERSION >= "2.5"
|
20
|
+
gem "sqlite3", "~> 1.4", platform: :mri
|
21
|
+
else
|
22
|
+
gem "sqlite3", "~> 1.3.6"
|
23
|
+
end
|
20
24
|
gem "sequel"
|
21
25
|
|
22
26
|
group :mongo do
|
data/Readme.markdown
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/bogdan/datagrid)
|
4
4
|
|
5
|
+
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid?ref=badge_shield)
|
6
|
+
|
5
7
|
Ruby library that helps you to build and represent table-like data with:
|
6
8
|
|
7
9
|
* Customizable filtering
|
@@ -197,3 +199,7 @@ Like datagrid?
|
|
197
199
|
Follow the repository on [GitHub](https://github.com/bogdan/datagrid).
|
198
200
|
|
199
201
|
Read [author blog](http://gusiev.com).
|
202
|
+
|
203
|
+
|
204
|
+
## License
|
205
|
+
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fbogdan%2Fdatagrid?ref=badge_large)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.6.1
|
@@ -11,7 +11,7 @@ Local variables:
|
|
11
11
|
</thead>
|
12
12
|
<tbody>
|
13
13
|
<% if assets.any? %>
|
14
|
-
<%= datagrid_rows(grid, assets, options) %>
|
14
|
+
<%= datagrid_rows(grid, assets, **options) %>
|
15
15
|
<% else %>
|
16
16
|
<tr><td class="noresults" colspan="100%"><%= I18n.t('datagrid.no_results').html_safe %></td></tr>
|
17
17
|
<% end %>
|
data/datagrid.gemspec
CHANGED
@@ -2,20 +2,21 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: datagrid 1.
|
5
|
+
# stub: datagrid 1.6.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "datagrid".freeze
|
9
|
-
s.version = "1.
|
9
|
+
s.version = "1.6.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Bogdan Gusiev".freeze]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2020-09-07"
|
15
15
|
s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters".freeze
|
16
16
|
s.email = "agresso@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
18
|
-
"LICENSE.txt"
|
18
|
+
"LICENSE.txt",
|
19
|
+
"Readme.markdown"
|
19
20
|
]
|
20
21
|
s.files = [
|
21
22
|
".document",
|
@@ -130,7 +131,7 @@ Gem::Specification.new do |s|
|
|
130
131
|
s.homepage = "http://github.com/bogdan/datagrid".freeze
|
131
132
|
s.licenses = ["MIT".freeze]
|
132
133
|
s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
|
133
|
-
s.rubygems_version = "
|
134
|
+
s.rubygems_version = "3.0.8".freeze
|
134
135
|
s.summary = "Ruby gem to create datagrids".freeze
|
135
136
|
|
136
137
|
if s.respond_to? :specification_version then
|
@@ -143,7 +144,7 @@ Gem::Specification.new do |s|
|
|
143
144
|
s.add_development_dependency(%q<pry-byebug>.freeze, [">= 0"])
|
144
145
|
s.add_development_dependency(%q<rspec>.freeze, [">= 3"])
|
145
146
|
s.add_development_dependency(%q<nokogiri>.freeze, [">= 0"])
|
146
|
-
s.add_development_dependency(%q<sqlite3>.freeze, ["
|
147
|
+
s.add_development_dependency(%q<sqlite3>.freeze, ["~> 1.4"])
|
147
148
|
s.add_development_dependency(%q<sequel>.freeze, [">= 0"])
|
148
149
|
s.add_development_dependency(%q<mongoid>.freeze, [">= 0"])
|
149
150
|
s.add_development_dependency(%q<bson>.freeze, [">= 0"])
|
@@ -155,7 +156,7 @@ Gem::Specification.new do |s|
|
|
155
156
|
s.add_dependency(%q<pry-byebug>.freeze, [">= 0"])
|
156
157
|
s.add_dependency(%q<rspec>.freeze, [">= 3"])
|
157
158
|
s.add_dependency(%q<nokogiri>.freeze, [">= 0"])
|
158
|
-
s.add_dependency(%q<sqlite3>.freeze, ["
|
159
|
+
s.add_dependency(%q<sqlite3>.freeze, ["~> 1.4"])
|
159
160
|
s.add_dependency(%q<sequel>.freeze, [">= 0"])
|
160
161
|
s.add_dependency(%q<mongoid>.freeze, [">= 0"])
|
161
162
|
s.add_dependency(%q<bson>.freeze, [">= 0"])
|
@@ -168,7 +169,7 @@ Gem::Specification.new do |s|
|
|
168
169
|
s.add_dependency(%q<pry-byebug>.freeze, [">= 0"])
|
169
170
|
s.add_dependency(%q<rspec>.freeze, [">= 3"])
|
170
171
|
s.add_dependency(%q<nokogiri>.freeze, [">= 0"])
|
171
|
-
s.add_dependency(%q<sqlite3>.freeze, ["
|
172
|
+
s.add_dependency(%q<sqlite3>.freeze, ["~> 1.4"])
|
172
173
|
s.add_dependency(%q<sequel>.freeze, [">= 0"])
|
173
174
|
s.add_dependency(%q<mongoid>.freeze, [">= 0"])
|
174
175
|
s.add_dependency(%q<bson>.freeze, [">= 0"])
|
data/lib/datagrid/columns.rb
CHANGED
@@ -16,6 +16,7 @@ module Datagrid
|
|
16
16
|
self.default_column_options = {}
|
17
17
|
|
18
18
|
class_attribute :batch_size
|
19
|
+
self.batch_size = 1000
|
19
20
|
|
20
21
|
class_attribute :columns_array
|
21
22
|
self.columns_array = []
|
@@ -313,10 +314,10 @@ module Datagrid
|
|
313
314
|
# grid.to_csv(:id, :name)
|
314
315
|
# grid.to_csv(:col_sep => ';')
|
315
316
|
def to_csv(*column_names)
|
317
|
+
require "csv"
|
316
318
|
options = column_names.extract_options!
|
317
|
-
|
318
|
-
|
319
|
-
) do |csv|
|
319
|
+
options = {:headers => self.header(*column_names), :write_headers => true}.merge!(options)
|
320
|
+
CSV.generate(**options) do |csv|
|
320
321
|
each_with_batches do |asset|
|
321
322
|
csv << row_for(asset, *column_names)
|
322
323
|
end
|
@@ -405,7 +406,7 @@ module Datagrid
|
|
405
406
|
# Defines a column at instance level
|
406
407
|
#
|
407
408
|
# See Datagrid::Columns::ClassMethods#column for more info
|
408
|
-
def column(name, options_or_query = {}, options = {}, &block)
|
409
|
+
def column(name, options_or_query = {}, options = {}, &block)
|
409
410
|
self.class.define_column(columns_array, name, options_or_query, options, &block)
|
410
411
|
end
|
411
412
|
|
@@ -414,7 +415,7 @@ module Datagrid
|
|
414
415
|
super
|
415
416
|
end
|
416
417
|
|
417
|
-
# Returns all columns
|
418
|
+
# Returns all columns that are possible to be displayed for the current grid object
|
418
419
|
#
|
419
420
|
# class MyGrid
|
420
421
|
# filter(:search) {|scope, value| scope.full_text_search(value)}
|
@@ -531,19 +532,12 @@ module Datagrid
|
|
531
532
|
end
|
532
533
|
end
|
533
534
|
|
534
|
-
def csv_class
|
535
|
-
if RUBY_VERSION >= "1.9"
|
536
|
-
require 'csv'
|
537
|
-
CSV
|
538
|
-
else
|
539
|
-
require "fastercsv"
|
540
|
-
FasterCSV
|
541
|
-
end
|
542
|
-
end
|
543
|
-
|
544
535
|
def value_from_html_block(context, asset, column)
|
545
536
|
args = []
|
546
537
|
remaining_arity = column.html_block.arity
|
538
|
+
remaining_arity = 1 if remaining_arity < 0
|
539
|
+
|
540
|
+
asset = decorate(asset)
|
547
541
|
|
548
542
|
if column.data?
|
549
543
|
args << data_value(column, asset)
|
@@ -123,11 +123,6 @@ class Datagrid::Columns::Column
|
|
123
123
|
end
|
124
124
|
|
125
125
|
|
126
|
-
def block
|
127
|
-
Datagrid::Utils.warn_once("Datagrid::Columns::Column#block is deprecated. Use #html_block or #data_block instead")
|
128
|
-
data_block
|
129
|
-
end
|
130
|
-
|
131
126
|
def generic_value(model, grid)
|
132
127
|
grid.generic_value(self, model)
|
133
128
|
end
|
@@ -149,7 +144,7 @@ class Datagrid::Columns::Column
|
|
149
144
|
def preload
|
150
145
|
preload = options[:preload]
|
151
146
|
|
152
|
-
if
|
147
|
+
if preload == true && driver.can_preload?(driver.to_scope(grid_class.scope), name)
|
153
148
|
name
|
154
149
|
else
|
155
150
|
preload
|
data/lib/datagrid/core.rb
CHANGED
@@ -9,10 +9,12 @@ module Datagrid
|
|
9
9
|
base.class_eval do
|
10
10
|
class_attribute :scope_value
|
11
11
|
|
12
|
-
class_attribute :datagrid_attributes
|
12
|
+
class_attribute :datagrid_attributes, instance_writer: false
|
13
13
|
self.datagrid_attributes = []
|
14
14
|
|
15
15
|
class_attribute :dynamic_block, :instance_writer => false
|
16
|
+
class_attribute :forbidden_attributes_protection, instance_writer: false
|
17
|
+
self.forbidden_attributes_protection = false
|
16
18
|
if defined?(::ActiveModel::AttributeAssignment)
|
17
19
|
include ::ActiveModel::AttributeAssignment
|
18
20
|
end
|
@@ -148,6 +150,9 @@ module Datagrid
|
|
148
150
|
# Updates datagrid attributes with a passed hash argument
|
149
151
|
def attributes=(attributes)
|
150
152
|
if respond_to?(:assign_attributes)
|
153
|
+
if !forbidden_attributes_protection && attributes.respond_to?(:permit!)
|
154
|
+
attributes.permit!
|
155
|
+
end
|
151
156
|
assign_attributes(attributes)
|
152
157
|
else
|
153
158
|
attributes.each do |name, value|
|
@@ -158,6 +163,9 @@ module Datagrid
|
|
158
163
|
end
|
159
164
|
|
160
165
|
# Returns serializable query arguments skipping all nil values
|
166
|
+
#
|
167
|
+
# grid = ProductsGrid.new(category: 'dresses', available: true)
|
168
|
+
# grid.as_query # => {category: 'dresses', available: true}
|
161
169
|
def as_query
|
162
170
|
attributes = self.attributes.clone
|
163
171
|
attributes.each do |key, value|
|
@@ -166,6 +174,15 @@ module Datagrid
|
|
166
174
|
attributes
|
167
175
|
end
|
168
176
|
|
177
|
+
# Returns query parameters to link this grid from a page
|
178
|
+
#
|
179
|
+
# grid = ProductsGrid.new(category: 'dresses', available: true)
|
180
|
+
# Rails.application.routes.url_helpers.products_path(grid.query_params)
|
181
|
+
# # => "/products?products_grid[category]=dresses&products_grid[available]=true"
|
182
|
+
def query_params(attributes = {})
|
183
|
+
{ param_name.to_sym => as_query.merge(attributes) }
|
184
|
+
end
|
185
|
+
|
169
186
|
# Redefines scope at instance level
|
170
187
|
#
|
171
188
|
# class MyGrid
|
@@ -223,7 +240,6 @@ module Datagrid
|
|
223
240
|
attributes == other.attributes &&
|
224
241
|
scope == other.scope
|
225
242
|
end
|
226
|
-
|
227
243
|
end # InstanceMethods
|
228
244
|
end
|
229
245
|
end
|
@@ -105,7 +105,8 @@ module Datagrid
|
|
105
105
|
if scope.limit_value
|
106
106
|
raise Datagrid::ConfigurationError, "ActiveRecord can not use batches in combination with SQL limit"
|
107
107
|
end
|
108
|
-
|
108
|
+
options = batch_size ? { batch_size: batch_size } : {}
|
109
|
+
scope.find_each(**options, &block)
|
109
110
|
end
|
110
111
|
|
111
112
|
def default_cache_key(asset)
|
data/lib/datagrid/filters.rb
CHANGED
@@ -7,7 +7,7 @@ class Datagrid::Filters::BaseFilter #:nodoc:
|
|
7
7
|
|
8
8
|
def initialize(grid_class, name, options = {}, &block)
|
9
9
|
self.grid_class = grid_class
|
10
|
-
self.name = name
|
10
|
+
self.name = name.to_sym
|
11
11
|
self.options = options
|
12
12
|
self.block = block || default_filter_block
|
13
13
|
end
|
@@ -61,18 +61,10 @@ class Datagrid::Filters::BaseFilter #:nodoc:
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
def default(object
|
65
|
-
unless object
|
66
|
-
Datagrid::Utils.warn_once("#{self.class.name}#default without argument is deprecated")
|
67
|
-
end
|
64
|
+
def default(object)
|
68
65
|
default = self.options[:default]
|
69
66
|
if default.is_a?(Symbol)
|
70
|
-
|
71
|
-
object.send(default)
|
72
|
-
else
|
73
|
-
Datagrid::Utils.warn_once(":default as a Symbol is now treated as a method name. Use String instead or -> { default } if you really want default value to be a Symbol but not a String.")
|
74
|
-
default
|
75
|
-
end
|
67
|
+
object.send(default)
|
76
68
|
elsif default.respond_to?(:call)
|
77
69
|
Datagrid::Utils.apply_args(object, &default)
|
78
70
|
else
|
@@ -80,11 +72,6 @@ class Datagrid::Filters::BaseFilter #:nodoc:
|
|
80
72
|
end
|
81
73
|
end
|
82
74
|
|
83
|
-
def multiple
|
84
|
-
Datagrid::Utils.warn_once("Filter#multiple method is deprecated. Use Filter#multiple? instead")
|
85
|
-
multiple?
|
86
|
-
end
|
87
|
-
|
88
75
|
def multiple?
|
89
76
|
self.options[:multiple]
|
90
77
|
end
|
@@ -4,12 +4,22 @@ class Datagrid::Filters::DynamicFilter < Datagrid::Filters::BaseFilter
|
|
4
4
|
|
5
5
|
include Datagrid::Filters::SelectOptions
|
6
6
|
|
7
|
+
EQUAL_OPERATION = '='
|
8
|
+
LIKE_OPERATION = '=~'
|
9
|
+
MORE_EQUAL_OPERATION = '>='
|
10
|
+
LESS_EQUAL_OPERATION = '<='
|
11
|
+
DEFAULT_OPERATIONS = [
|
12
|
+
EQUAL_OPERATION,
|
13
|
+
LIKE_OPERATION,
|
14
|
+
MORE_EQUAL_OPERATION,
|
15
|
+
LESS_EQUAL_OPERATION,
|
16
|
+
]
|
7
17
|
AVAILABLE_OPERATIONS = %w(= =~ >= <=)
|
8
18
|
|
9
19
|
def initialize(*)
|
10
20
|
super
|
11
21
|
options[:select] ||= default_select
|
12
|
-
options[:operations] ||=
|
22
|
+
options[:operations] ||= DEFAULT_OPERATIONS
|
13
23
|
unless options.has_key?(:include_blank)
|
14
24
|
options[:include_blank] = false
|
15
25
|
end
|
@@ -35,12 +45,12 @@ class Datagrid::Filters::DynamicFilter < Datagrid::Filters::BaseFilter
|
|
35
45
|
raise Datagrid::FilteringError, "Unknown operation: #{operation.inspect}. Available operations: #{operations.join(' ')}"
|
36
46
|
end
|
37
47
|
case operation
|
38
|
-
when
|
48
|
+
when EQUAL_OPERATION
|
39
49
|
if date_conversion
|
40
50
|
value = Datagrid::Utils.format_date_as_timestamp(value)
|
41
51
|
end
|
42
52
|
driver.where(scope, field, value)
|
43
|
-
when
|
53
|
+
when LIKE_OPERATION
|
44
54
|
if column_type(field) == :string
|
45
55
|
driver.contains(scope, field, value)
|
46
56
|
else
|
@@ -49,12 +59,12 @@ class Datagrid::Filters::DynamicFilter < Datagrid::Filters::BaseFilter
|
|
49
59
|
end
|
50
60
|
driver.where(scope, field, value)
|
51
61
|
end
|
52
|
-
when
|
62
|
+
when MORE_EQUAL_OPERATION
|
53
63
|
if date_conversion
|
54
64
|
value = value.beginning_of_day
|
55
65
|
end
|
56
66
|
driver.greater_equal(scope, field, value)
|
57
|
-
when
|
67
|
+
when LESS_EQUAL_OPERATION
|
58
68
|
if date_conversion
|
59
69
|
value = value.end_of_day
|
60
70
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
module Datagrid::Filters::SelectOptions
|
2
2
|
|
3
|
-
def select(object
|
4
|
-
unless object
|
5
|
-
Datagrid::Utils.warn_once("#{self.class.name}#select without argument is deprecated")
|
6
|
-
end
|
3
|
+
def select(object)
|
7
4
|
select = self.options[:select]
|
8
5
|
if select.is_a?(Symbol)
|
9
6
|
object.send(select)
|
@@ -140,43 +140,16 @@ module Datagrid
|
|
140
140
|
if filter.range?
|
141
141
|
partial = partial_path('range_filter')
|
142
142
|
options = options.merge(:multiple => true)
|
143
|
-
|
144
|
-
|
145
143
|
from_options = datagrid_range_filter_options(object, filter, :from, options)
|
146
144
|
to_options = datagrid_range_filter_options(object, filter, :to, options)
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
format_key = "datagrid.filters.#{type}.range_format"
|
151
|
-
separator_key = "datagrid.filters.#{type}.range_separator"
|
152
|
-
# 2 inputs: "from date" and "to date" to specify a range
|
153
|
-
if I18n.exists?(separator_key)
|
154
|
-
# Support deprecated translation option: range_separator
|
155
|
-
warn_deprecated_range_localization(separator_key)
|
156
|
-
separator = I18n.t(separator_key, default: '').presence
|
157
|
-
[from_input, separator, to_input].join.html_safe
|
158
|
-
elsif I18n.exists?(format_key)
|
159
|
-
# Support deprecated translation option: range_format
|
160
|
-
warn_deprecated_range_localization(format_key)
|
161
|
-
I18n.t(format_key, :from_input => from_input, :to_input => to_input).html_safe
|
162
|
-
else
|
163
|
-
# More flexible way to render via partial
|
164
|
-
@template.render :partial => partial, :locals => {
|
165
|
-
:from_options => from_options, :to_options => to_options, :filter => filter, :form => self
|
166
|
-
}
|
167
|
-
end
|
145
|
+
@template.render :partial => partial, :locals => {
|
146
|
+
:from_options => from_options, :to_options => to_options, :filter => filter, :form => self
|
147
|
+
}
|
168
148
|
else
|
169
149
|
datagrid_default_filter(filter, options)
|
170
150
|
end
|
171
151
|
end
|
172
152
|
|
173
|
-
def warn_deprecated_range_localization(key)
|
174
|
-
Datagrid::Utils.warn_once(
|
175
|
-
"#{key} localization key is deprectated. " +
|
176
|
-
"Customize formatting by rake datagrid:copy_partials and editing app/views/datagrid/range_filter partial."
|
177
|
-
)
|
178
|
-
end
|
179
|
-
|
180
153
|
def datagrid_range_filter_options(object, filter, type, options)
|
181
154
|
type_method_map = {:from => :first, :to => :last}
|
182
155
|
options = add_html_classes(options, type)
|
data/lib/datagrid/helper.rb
CHANGED
@@ -73,7 +73,7 @@ module Datagrid
|
|
73
73
|
# %td= row.project_name
|
74
74
|
# %td.project-status{class: row.status}= row.status
|
75
75
|
def datagrid_rows(grid, assets = grid.assets, **options, &block)
|
76
|
-
datagrid_renderer.rows(grid, assets, options, &block)
|
76
|
+
datagrid_renderer.rows(grid, assets, **options, &block)
|
77
77
|
end
|
78
78
|
|
79
79
|
# Renders ordering controls for the given column name
|
data/lib/datagrid/locale/en.yml
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
en:
|
2
2
|
datagrid:
|
3
3
|
no_results:
|
4
|
-
"
|
4
|
+
"――"
|
5
5
|
table:
|
6
6
|
order:
|
7
|
-
asc: "
|
8
|
-
desc: "
|
7
|
+
asc: "↑"
|
8
|
+
desc: "↓"
|
9
9
|
no_columns: "No columns selected"
|
10
10
|
form:
|
11
11
|
search: "Search"
|
@@ -17,7 +17,7 @@ en:
|
|
17
17
|
|
18
18
|
dynamic:
|
19
19
|
operations:
|
20
|
-
">=": "
|
21
|
-
"<=": "
|
20
|
+
">=": "≥"
|
21
|
+
"<=": "≤"
|
22
22
|
"=": "="
|
23
|
-
"=~": "
|
23
|
+
"=~": "≈"
|
data/lib/datagrid/renderer.rb
CHANGED
@@ -81,10 +81,9 @@ module Datagrid
|
|
81
81
|
def order_path(grid, column, descending, request)
|
82
82
|
column = grid.column_by_name(column)
|
83
83
|
query = request ? request.query_parameters : {}
|
84
|
-
order_parameter = {grid.param_name => grid.as_query.merge(:order => column.name, :descending => descending)}
|
85
84
|
ActionDispatch::Http::URL.path_for(
|
86
85
|
path: request ? request.path : '/',
|
87
|
-
params: query.merge(
|
86
|
+
params: query.merge(grid.query_params(order: column.name, descending: descending))
|
88
87
|
)
|
89
88
|
end
|
90
89
|
|
data/lib/datagrid/scaffold.rb
CHANGED
@@ -84,10 +84,16 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
|
|
84
84
|
def index_action
|
85
85
|
indent(<<-RUBY)
|
86
86
|
def index
|
87
|
-
@grid = #{grid_class_name}.new(
|
87
|
+
@grid = #{grid_class_name}.new(grid_params) do |scope|
|
88
88
|
scope.page(params[:page])
|
89
89
|
end
|
90
90
|
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
|
94
|
+
def grid_params
|
95
|
+
params.fetch(:#{grid_param_name}, {}).permit!
|
96
|
+
end
|
91
97
|
RUBY
|
92
98
|
end
|
93
99
|
|
data/lib/datagrid/utils.rb
CHANGED
@@ -72,12 +72,8 @@ module Datagrid
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def apply_args(*args, &block)
|
75
|
-
|
76
|
-
args
|
77
|
-
(args.size - block.arity).times do
|
78
|
-
args.pop
|
79
|
-
end
|
80
|
-
block.call(*args)
|
75
|
+
size = block.arity < 0 ? args.size : block.arity
|
76
|
+
block.call(*args.slice(0, size))
|
81
77
|
end
|
82
78
|
|
83
79
|
def parse_date(value)
|
data/spec/datagrid/core_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require "action_controller/metal/strong_parameters"
|
2
3
|
|
3
4
|
describe Datagrid::Core do
|
4
5
|
|
@@ -158,4 +159,52 @@ describe Datagrid::Core do
|
|
158
159
|
expect(grid.assets.limit_value).to eq(2)
|
159
160
|
end
|
160
161
|
end
|
162
|
+
|
163
|
+
describe "ActionController::Parameters" do
|
164
|
+
|
165
|
+
let(:params) do
|
166
|
+
::ActionController::Parameters.new(name: 'one')
|
167
|
+
end
|
168
|
+
|
169
|
+
it "permites all attributes by default" do
|
170
|
+
expect {
|
171
|
+
test_report(params) do
|
172
|
+
scope { Entry }
|
173
|
+
filter(:name)
|
174
|
+
end
|
175
|
+
}.to_not raise_error
|
176
|
+
end
|
177
|
+
it "doesn't permit attributes when forbidden_attributes_protection is set" do
|
178
|
+
expect {
|
179
|
+
test_report(params) do
|
180
|
+
scope { Entry }
|
181
|
+
self.forbidden_attributes_protection = true
|
182
|
+
filter(:name)
|
183
|
+
end
|
184
|
+
}.to raise_error(ActiveModel::ForbiddenAttributesError)
|
185
|
+
end
|
186
|
+
it "permits attributes when forbidden_attributes_protection is set and attributes are permitted" do
|
187
|
+
expect {
|
188
|
+
test_report(params.permit!) do
|
189
|
+
scope { Entry }
|
190
|
+
self.forbidden_attributes_protection = true
|
191
|
+
filter(:name)
|
192
|
+
end
|
193
|
+
}.to_not raise_error
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
|
198
|
+
describe ".query_param" do
|
199
|
+
it "works" do
|
200
|
+
grid = test_report(name: 'value') do
|
201
|
+
scope {Entry}
|
202
|
+
filter(:name)
|
203
|
+
def param_name
|
204
|
+
'grid'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
expect(grid.query_params).to eq({grid: {name: 'value'}})
|
208
|
+
end
|
209
|
+
end
|
161
210
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require "active_support/testing/time_helpers"
|
2
3
|
|
3
4
|
describe Datagrid::Filters::DateFilter do
|
4
5
|
|
@@ -122,14 +123,16 @@ describe Datagrid::Filters::DateFilter do
|
|
122
123
|
|
123
124
|
|
124
125
|
it "should support block" do
|
125
|
-
|
126
|
+
date = Date.new(2018, 01, 07)
|
127
|
+
time = Time.utc(2018, 01, 07, 2, 2)
|
128
|
+
report = test_report(:created_at => date) do
|
126
129
|
scope { Entry }
|
127
130
|
filter(:created_at, :date, :range => true) do |value|
|
128
131
|
where("created_at >= ?", value)
|
129
132
|
end
|
130
133
|
end
|
131
|
-
expect(report.assets).not_to include(Entry.create!(:created_at => 1.day
|
132
|
-
expect(report.assets).to include(Entry.create!(:created_at =>
|
134
|
+
expect(report.assets).not_to include(Entry.create!(:created_at => time - 1.day))
|
135
|
+
expect(report.assets).to include(Entry.create!(:created_at => time))
|
133
136
|
end
|
134
137
|
|
135
138
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'spec_helper'
|
3
|
+
require "action_controller"
|
3
4
|
|
4
5
|
class MyFormBuilder
|
5
6
|
include Datagrid::FormBuilder
|
@@ -11,19 +12,15 @@ end
|
|
11
12
|
|
12
13
|
|
13
14
|
describe Datagrid::FormBuilder do
|
14
|
-
|
15
15
|
let(:template) do
|
16
|
-
|
17
|
-
v.view_paths << File.expand_path("../../../app/views", __FILE__)
|
18
|
-
v.view_paths << File.expand_path("../../support/test_partials", __FILE__)
|
19
|
-
end
|
16
|
+
action_view_template
|
20
17
|
end
|
18
|
+
|
21
19
|
let(:view) { ActionView::Helpers::FormBuilder.new(:report, _grid, template, view_options)}
|
22
20
|
let(:view_options) { {} }
|
23
21
|
|
24
22
|
|
25
23
|
describe ".datagrid_filter" do
|
26
|
-
|
27
24
|
it "should work for every filter type" do
|
28
25
|
Datagrid::Filters::FILTER_TYPES.each do |type, klass|
|
29
26
|
expect(Datagrid::FormBuilder.instance_methods.map(&:to_sym)).to include(klass.form_builder_helper_name)
|
@@ -154,34 +151,8 @@ describe Datagrid::FormBuilder do
|
|
154
151
|
) }
|
155
152
|
|
156
153
|
end
|
157
|
-
|
158
|
-
context "when deprecated format translation specified" do
|
159
|
-
let(:_range) { nil }
|
160
|
-
around(:each) do |example|
|
161
|
-
store_translations(:en, datagrid: {filters: {integer: {range_format: "from %{from_input} to %{to_input}"}}}) do
|
162
|
-
silence_warnings do
|
163
|
-
example.run
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
it { should equal_to_dom(
|
168
|
-
'from <input class="group_id integer_filter from" multiple type="text" name="report[group_id][]"> to <input class="group_id integer_filter to" multiple type="text" name="report[group_id][]">'
|
169
|
-
)}
|
170
|
-
end
|
171
|
-
context "when deprecated separator is specified" do
|
172
|
-
let(:_range) { nil }
|
173
|
-
around(:each) do |example|
|
174
|
-
store_translations(:en, datagrid: {filters: {integer: {range_separator: " | "}}}) do
|
175
|
-
silence_warnings do
|
176
|
-
example.run
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
it { should equal_to_dom(
|
181
|
-
'<input class="group_id integer_filter from" multiple type="text" name="report[group_id][]"> | <input class="group_id integer_filter to" multiple type="text" name="report[group_id][]">'
|
182
|
-
)}
|
183
|
-
end
|
184
154
|
end
|
155
|
+
|
185
156
|
context "with float filter type and range option" do
|
186
157
|
let(:_filter) { :rating }
|
187
158
|
let(:_grid) {
|
@@ -198,7 +169,6 @@ describe Datagrid::FormBuilder do
|
|
198
169
|
)}
|
199
170
|
end
|
200
171
|
|
201
|
-
|
202
172
|
context "with date filter type and range option" do
|
203
173
|
let(:_filter) { :created_at }
|
204
174
|
let(:_grid) {
|
@@ -1,16 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require "active_support/core_ext/hash"
|
3
3
|
require "active_support/core_ext/object"
|
4
|
+
require "action_controller"
|
4
5
|
|
5
6
|
require 'datagrid/renderer'
|
6
7
|
|
7
8
|
describe Datagrid::Helper do
|
8
9
|
subject do
|
9
|
-
|
10
|
-
allow(template).to receive(:protect_against_forgery?).and_return(false)
|
11
|
-
template.view_paths << File.expand_path("../../../app/views", __FILE__)
|
12
|
-
template.view_paths << File.expand_path("../../support/test_partials", __FILE__)
|
13
|
-
template
|
10
|
+
action_view_template
|
14
11
|
end
|
15
12
|
|
16
13
|
before(:each) do
|
@@ -44,7 +41,7 @@ describe Datagrid::Helper do
|
|
44
41
|
expect(datagrid_table).to match_css_pattern(
|
45
42
|
"table.datagrid tr td.noresults" => 1
|
46
43
|
)
|
47
|
-
expect(datagrid_table).to include("
|
44
|
+
expect(datagrid_table).to include(I18n.t("datagrid.no_results"))
|
48
45
|
end
|
49
46
|
end
|
50
47
|
|
@@ -248,6 +245,17 @@ describe Datagrid::Helper do
|
|
248
245
|
)
|
249
246
|
end
|
250
247
|
|
248
|
+
it "should render columns with &:symbol block" do
|
249
|
+
rp = test_report do
|
250
|
+
scope { Entry }
|
251
|
+
column(:name, &:name)
|
252
|
+
end
|
253
|
+
|
254
|
+
expect(subject.datagrid_rows(rp, [entry])).to match_css_pattern(
|
255
|
+
"tr td.name" => "Star"
|
256
|
+
)
|
257
|
+
end
|
258
|
+
|
251
259
|
it "should render html columns" do
|
252
260
|
rp = test_report do
|
253
261
|
scope { Entry }
|
@@ -260,6 +268,41 @@ describe Datagrid::Helper do
|
|
260
268
|
)
|
261
269
|
end
|
262
270
|
|
271
|
+
it "should render :html columns with &:symbol block" do
|
272
|
+
rp = test_report do
|
273
|
+
scope { Entry }
|
274
|
+
column(:name, :html => true, &:name)
|
275
|
+
end
|
276
|
+
|
277
|
+
expect(subject.datagrid_rows(rp, [entry])).to match_css_pattern(
|
278
|
+
"tr td.name" => "Star"
|
279
|
+
)
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should render format columns with &:symbol block" do
|
283
|
+
rp = test_report do
|
284
|
+
scope { Entry }
|
285
|
+
column(:name) do |record|
|
286
|
+
format(record, &:name)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
expect(subject.datagrid_rows(rp, [entry])).to match_css_pattern(
|
291
|
+
"tr td.name" => "Star"
|
292
|
+
)
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should render :html columns with &:symbol block with a data attribute" do
|
296
|
+
rp = test_report do
|
297
|
+
scope { Entry }
|
298
|
+
column(:name, :html => true, data: 'DATA', &:name)
|
299
|
+
end
|
300
|
+
|
301
|
+
expect(subject.datagrid_rows(rp, [entry])).to match_css_pattern(
|
302
|
+
"tr td.name" => "Star"
|
303
|
+
)
|
304
|
+
end
|
305
|
+
|
263
306
|
it "should render argument-based html columns" do
|
264
307
|
rp = test_report do
|
265
308
|
scope { Entry }
|
@@ -389,14 +432,14 @@ describe Datagrid::Helper do
|
|
389
432
|
end
|
390
433
|
|
391
434
|
it "should escape html" do
|
392
|
-
entry.
|
435
|
+
entry.update!(:name => "<div>hello</div>")
|
393
436
|
expect(subject.datagrid_rows(grid, [entry], :columns => [:name])).to equal_to_dom(<<-HTML)
|
394
437
|
<tr><td class="name"><div>hello</div></td></tr>
|
395
438
|
HTML
|
396
439
|
end
|
397
440
|
|
398
441
|
it "should not escape safe html" do
|
399
|
-
entry.
|
442
|
+
entry.update!(:name => "<div>hello</div>")
|
400
443
|
grid.column(:safe_name) do |model|
|
401
444
|
model.name.html_safe
|
402
445
|
end
|
@@ -599,6 +642,21 @@ describe Datagrid::Helper do
|
|
599
642
|
expect(subject.datagrid_value(report, :name, entry)).to eq("<a href=\"/profile\">Star</a>")
|
600
643
|
end
|
601
644
|
|
645
|
+
it "applies decorator" do
|
646
|
+
report = test_report do
|
647
|
+
scope {Entry}
|
648
|
+
decorate do |model|
|
649
|
+
Class.new(Struct.new(:model)) do
|
650
|
+
def name
|
651
|
+
model.name.upcase
|
652
|
+
end
|
653
|
+
end
|
654
|
+
end
|
655
|
+
column(:name, html: true)
|
656
|
+
end
|
657
|
+
entry = Entry.create!(name: 'hello')
|
658
|
+
expect(subject.datagrid_value(report, :name, entry)).to eq("HELLO")
|
659
|
+
end
|
602
660
|
end
|
603
661
|
|
604
662
|
describe ".datagrid_header" do
|
@@ -28,10 +28,16 @@ describe Datagrid::Scaffold do
|
|
28
28
|
it "works" do
|
29
29
|
expect(subject.index_action).to eq(<<-RUBY)
|
30
30
|
def index
|
31
|
-
@grid = UsersGrid.new(
|
31
|
+
@grid = UsersGrid.new(grid_params) do |scope|
|
32
32
|
scope.page(params[:page])
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def grid_params
|
39
|
+
params.fetch(:users_grid, {}).permit!
|
40
|
+
end
|
35
41
|
RUBY
|
36
42
|
end
|
37
43
|
|
data/spec/datagrid_spec.rb
CHANGED
@@ -60,8 +60,8 @@ describe Datagrid do
|
|
60
60
|
|
61
61
|
describe ".batch_size" do
|
62
62
|
context "when not defined on class level" do
|
63
|
-
it "returns
|
64
|
-
expect(subject.batch_size).to eq(
|
63
|
+
it "returns 1000" do
|
64
|
+
expect(subject.batch_size).to eq(1000)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -77,6 +77,17 @@ describe Datagrid do
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
context "when set to nil in the grid class" do
|
81
|
+
subject do
|
82
|
+
test_report do
|
83
|
+
self.batch_size = nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "returns nil" do
|
88
|
+
expect(subject.batch_size).to eq(nil)
|
89
|
+
end
|
90
|
+
end
|
80
91
|
end
|
81
92
|
|
82
93
|
|
data/spec/spec_helper.rb
CHANGED
@@ -17,7 +17,7 @@ require 'action_view'
|
|
17
17
|
require "rails"
|
18
18
|
require "mongoid"
|
19
19
|
begin
|
20
|
-
require 'mongo_mapper'
|
20
|
+
require 'mongo_mapper'
|
21
21
|
rescue LoadError
|
22
22
|
end
|
23
23
|
|
@@ -55,9 +55,11 @@ begin
|
|
55
55
|
"database" =>"datagrid_mongoid",
|
56
56
|
"autocreate_indexes" => true,
|
57
57
|
"logger" => nil,
|
58
|
-
|
59
|
-
|
60
|
-
wait_queue_timeout: 2
|
58
|
+
options: {
|
59
|
+
connect_timeout: 2,
|
60
|
+
wait_queue_timeout: 2,
|
61
|
+
server_selection_timeout: 2,
|
62
|
+
socket_timeout: 1
|
61
63
|
}
|
62
64
|
}
|
63
65
|
}
|
@@ -80,8 +82,6 @@ rescue Mongo::Error::NoServerAvailable
|
|
80
82
|
end
|
81
83
|
|
82
84
|
RSpec.configure do |config|
|
83
|
-
|
84
|
-
|
85
85
|
config.after(:each) do
|
86
86
|
#TODO better database truncation
|
87
87
|
Group.delete_all
|
@@ -103,12 +103,21 @@ RSpec.configure do |config|
|
|
103
103
|
#c.syntax = :expect
|
104
104
|
c.syntax = [:should, :expect]
|
105
105
|
end
|
106
|
+
end
|
106
107
|
|
108
|
+
def action_view_template
|
109
|
+
context = ActionView::LookupContext.new([
|
110
|
+
File.expand_path("../../app/views", __FILE__),
|
111
|
+
File.expand_path("../support/test_partials", __FILE__),
|
112
|
+
], {})
|
113
|
+
klass = ActionView::Base.respond_to?(:with_empty_template_cache) ? ActionView::Base.with_empty_template_cache : ActionView::Base
|
114
|
+
template = klass.new(context, {}, ::ActionController::Base.new)
|
115
|
+
allow(template).to receive(:protect_against_forgery?).and_return(false)
|
116
|
+
template
|
107
117
|
end
|
108
118
|
|
109
119
|
|
110
120
|
|
111
121
|
# Requires supporting files with custom matchers and macros, etc,
|
112
122
|
# in ./support/ and its subdirectories.
|
113
|
-
Dir["#{File.dirname(__FILE__)}/support/schema.rb"].each {|f| require f}
|
114
123
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
@@ -45,7 +45,7 @@ class SimpleReport
|
|
45
45
|
end
|
46
46
|
|
47
47
|
column(:actions, :html => true) do |model|
|
48
|
-
render :partial => "actions", :locals => {:model => model}
|
48
|
+
render :partial => "/actions", :locals => {:model => model}
|
49
49
|
end
|
50
50
|
|
51
51
|
column(:pet, :html => lambda {|data| content_tag :em, data}) do
|
@@ -2,10 +2,10 @@
|
|
2
2
|
<p>Namespaced order_for partial.</p>
|
3
3
|
<%= link_to(
|
4
4
|
I18n.t("datagrid.table.order.asc").html_safe,
|
5
|
-
url_for(grid.
|
5
|
+
url_for(grid.query_params(order: column.name, descending: false)),
|
6
6
|
:class => "asc") %>
|
7
7
|
<%= link_to(
|
8
8
|
I18n.t("datagrid.table.order.desc").html_safe,
|
9
|
-
url_for(grid.
|
9
|
+
url_for(grid.query_params(order: column.name, descending: true)),
|
10
10
|
:class => "desc") %>
|
11
11
|
</div>
|
@@ -13,7 +13,7 @@ Local variables:
|
|
13
13
|
<% if assets.empty? %>
|
14
14
|
<tr><td class="noresults" colspan="100%"><%= I18n.t('datagrid.no_results').html_safe %></td></tr>
|
15
15
|
<% else %>
|
16
|
-
<%= datagrid_rows(grid, assets, options) %>
|
16
|
+
<%= datagrid_rows(grid, assets, **options) %>
|
17
17
|
<% end %>
|
18
18
|
</tbody>
|
19
19
|
<% end %>
|
data/templates/base.rb.erb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datagrid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdan Gusiev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -98,16 +98,16 @@ dependencies:
|
|
98
98
|
name: sqlite3
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '1.4'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '1.4'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sequel
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,6 +171,7 @@ executables: []
|
|
171
171
|
extensions: []
|
172
172
|
extra_rdoc_files:
|
173
173
|
- LICENSE.txt
|
174
|
+
- Readme.markdown
|
174
175
|
files:
|
175
176
|
- ".document"
|
176
177
|
- ".rspec"
|
@@ -284,7 +285,7 @@ homepage: http://github.com/bogdan/datagrid
|
|
284
285
|
licenses:
|
285
286
|
- MIT
|
286
287
|
metadata: {}
|
287
|
-
post_install_message:
|
288
|
+
post_install_message:
|
288
289
|
rdoc_options: []
|
289
290
|
require_paths:
|
290
291
|
- lib
|
@@ -299,9 +300,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
299
300
|
- !ruby/object:Gem::Version
|
300
301
|
version: '0'
|
301
302
|
requirements: []
|
302
|
-
|
303
|
-
|
304
|
-
signing_key:
|
303
|
+
rubygems_version: 3.0.8
|
304
|
+
signing_key:
|
305
305
|
specification_version: 4
|
306
306
|
summary: Ruby gem to create datagrids
|
307
307
|
test_files: []
|