datagrid 1.4.3 → 1.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a4a2eb29ee46c28e9a999c0344f1b7552259e1b
4
- data.tar.gz: 758b66ea4521616cbb3dc76ac959a228446c33c6
3
+ metadata.gz: 652aabb87668eb9c636d3a0b03249f79f8df4c1b
4
+ data.tar.gz: 71de05a4267561305a3e2badc2aa33e1eb88cf35
5
5
  SHA512:
6
- metadata.gz: 6232d055d5c2b037a18007ac3e77ec1423863da9a8e0085420a49d4275459c3d3e68f0451c285941d14cae0741ceadc6a62d866d279cd39d5db6bcc52a02969e
7
- data.tar.gz: 8b06d12a459dd0a8cd2115d1c8721f5676859d747fc08cd890c748fb2949f8b4177050379ac040caf5b16883960f6e39f2729be22074f9b5e2670ba594aa972d
6
+ metadata.gz: 5db3557c03071721e24d355ac939ab76f29167c252c9cfda160a618e4f1b7737dfc241c808de1ccd1a75a8c7b2a9c16490a1d96500065c196413f6548e47b9ed
7
+ data.tar.gz: c34e6068303b5aa6d351869fe7d734cc4034305de5e649ea9480e74ec3dddb39b2d34ff16277f1f4a792c670d36b09cf8b826a0888a8d23906c1682facd68ac9
@@ -40,19 +40,19 @@ class UsersGrid
40
40
  User.includes(:group)
41
41
  end
42
42
 
43
- filter(:category, :enum, :select => ["first", "second"])
43
+ filter(:category, :enum, select: ["first", "second"])
44
44
  filter(:disabled, :xboolean)
45
- filter(:group_id, :integer, :multiple => true)
46
- filter(:logins_count, :integer, :range => true)
47
- filter(:group_name, :string, :header => "Group") do |value|
45
+ filter(:group_id, :integer, multiple: true)
46
+ filter(:logins_count, :integer, range: true)
47
+ filter(:group_name, :string, header: "Group") do |value|
48
48
  self.joins(:group).where(:groups => {:name => value})
49
49
  end
50
50
 
51
51
  column(:name)
52
- column(:group, :order => "groups.name") do |user|
52
+ column(:group, order: -> { joins(:group).order(groups: :name) }) do |user|
53
53
  user.name
54
54
  end
55
- column(:active, :header => "Activated") do |user|
55
+ column(:active, header: "Activated") do |user|
56
56
  !user.disabled
57
57
  end
58
58
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.3
1
+ 1.4.4
@@ -1,4 +1,4 @@
1
- <tr class="<%= options[:cycle] && cycle(*options[:cycle]) %>">
1
+ <tr>
2
2
  <% grid.html_columns(*options[:columns]).each do |column| %>
3
3
  <td class="<%= datagrid_column_classes(grid, column) %>"><%= datagrid_value(grid, column, asset) %></td>
4
4
  <% end %>
@@ -2,21 +2,20 @@
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.4.3 ruby lib
5
+ # stub: datagrid 1.4.4 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "datagrid"
9
- s.version = "1.4.3"
9
+ s.version = "1.4.4"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Bogdan Gusiev"]
14
- s.date = "2016-03-31"
14
+ s.date = "2016-07-22"
15
15
  s.description = "This allows you to easily build datagrid aka data tables with sortable columns and filters"
16
16
  s.email = "agresso@gmail.com"
17
17
  s.extra_rdoc_files = [
18
- "LICENSE.txt",
19
- "Readme.markdown"
18
+ "LICENSE.txt"
20
19
  ]
21
20
  s.files = [
22
21
  ".document",
@@ -129,7 +128,7 @@ Gem::Specification.new do |s|
129
128
  ]
130
129
  s.homepage = "http://github.com/bogdan/datagrid"
131
130
  s.licenses = ["MIT"]
132
- s.rubygems_version = "2.4.7"
131
+ s.rubygems_version = "2.5.1"
133
132
  s.summary = "Ruby gem to create datagrids"
134
133
 
135
134
  if s.respond_to? :specification_version then
@@ -21,10 +21,13 @@ module Datagrid
21
21
  self.columns_array = []
22
22
 
23
23
  class_attribute :dynamic_block, :instance_writer => false
24
-
24
+
25
25
  class_attribute :cached
26
26
  self.cached = false
27
27
 
28
+
29
+ class_attribute :decorator, instance_writer: false
30
+
28
31
  end
29
32
  base.send :include, InstanceMethods
30
33
  end # self.included
@@ -184,7 +187,7 @@ module Datagrid
184
187
  # # ]
185
188
  def dynamic(&block)
186
189
  previous_block = dynamic_block
187
- self.dynamic_block =
190
+ self.dynamic_block =
188
191
  if previous_block
189
192
  proc {
190
193
  instance_eval(&previous_block)
@@ -195,6 +198,23 @@ module Datagrid
195
198
  end
196
199
  end
197
200
 
201
+ # Defines a model decorator that will be used to define a column value.
202
+ # All column blocks will be given a decorated version of the model.
203
+ #
204
+ # decorate { |user| UserPresenter.new(user) }
205
+ #
206
+ # decorate { UserPresenter } # a shortcut
207
+ def decorate(model = nil, &block)
208
+ if !model && !block
209
+ raise ArgumentError, "decorate needs either a block to define decoration or a model to decorate"
210
+ end
211
+ return self.decorator = block unless model
212
+ return model unless decorator
213
+ presenter = ::Datagrid::Utils.apply_args(model, &decorator)
214
+ presenter = presenter.is_a?(Class) ? presenter.new(model) : presenter
215
+ block_given? ? yield(presenter) : presenter
216
+ end
217
+
198
218
  def inherited(child_class) #:nodoc:
199
219
  super(child_class)
200
220
  child_class.columns_array = self.columns_array.clone
@@ -342,7 +362,7 @@ module Datagrid
342
362
  # grid.columns # => id and name columns
343
363
  # grid.columns(:id, :category) # => id and category column
344
364
  def columns(*args)
345
- self.class.filter_columns(columns_array, *args).select {|column| column.enabled?(self)}
365
+ self.class.filter_columns(columns_array, *args).select {|column| column.enabled?(self)}
346
366
  end
347
367
 
348
368
  # Returns all columns that can be represented in plain data(non-html) way
@@ -425,19 +445,21 @@ module Datagrid
425
445
  end
426
446
 
427
447
  # Returns all columns available for current grid configuration.
428
- #
448
+ #
429
449
  # class MyGrid
430
- # filter(:search)
450
+ # filter(:search) {|scope, value| scope.full_text_search(value)}
431
451
  # column(:id)
432
452
  # column(:name, :mandatory => true)
433
- # column(:search_match, :if => proc {|grid| grid.search.present? }
453
+ # column(:search_match, :if => proc {|grid| grid.search.present? }) do |model, grid|
454
+ # search_match_line(model.searchable_content, grid.search)
455
+ # end
434
456
  # end
435
457
  #
436
458
  # grid = MyGrid.new
437
- # grid.columns # => [ <#Column:name> ]
438
- # grid.available_columns # => [ <#Column:id>, <#Column:name> ]
459
+ # grid.columns # => [ #<Column:name> ]
460
+ # grid.available_columns # => [ #<Column:id>, #<Column:name> ]
439
461
  # grid.search = "keyword"
440
- # grid.available_columns # => [ <#Column:id>, <#Column:name>, <#Column:search_match> ]
462
+ # grid.available_columns # => [ #<Column:id>, #<Column:name>, #<Column:search_match> ]
441
463
  #
442
464
  def available_columns
443
465
  columns_array.select do |column|
@@ -468,17 +490,22 @@ module Datagrid
468
490
  end
469
491
  end
470
492
 
493
+ # Returns a decorated version of given model if decorator is specified or the model otherwise.
494
+ def decorate(model)
495
+ self.class.decorate(model)
496
+ end
471
497
 
472
498
  def generic_value(column, model) #:nodoc:
473
499
  cache(column, model, :generic_value) do
500
+ presenter = decorate(model)
474
501
  unless column.enabled?(self)
475
502
  raise Datagrid::ColumnUnavailableError, "Column #{column.name} disabled for #{inspect}"
476
503
  end
477
504
 
478
505
  if column.data_block.arity >= 1
479
- Datagrid::Utils.apply_args(model, self, data_row(model), &column.data_block)
506
+ Datagrid::Utils.apply_args(presenter, self, data_row(model), &column.data_block)
480
507
  else
481
- model.instance_eval(&column.data_block)
508
+ presenter.instance_eval(&column.data_block)
482
509
  end
483
510
  end
484
511
 
@@ -20,6 +20,10 @@ class Datagrid::Columns::Column
20
20
  data_block.call
21
21
  end
22
22
 
23
+ def to_s
24
+ call_data.to_s
25
+ end
26
+
23
27
  def call_html(context)
24
28
  context.instance_eval(&html_block)
25
29
  end
@@ -54,7 +58,7 @@ class Datagrid::Columns::Column
54
58
  end
55
59
 
56
60
  def header
57
- if header = options[:header]
61
+ if header = options[:header]
58
62
  callable(header)
59
63
  else
60
64
  Datagrid::Utils.translate_from_namespace(:columns, grid_class, name)
@@ -137,7 +141,7 @@ class Datagrid::Columns::Column
137
141
  when Proc
138
142
  option.call(grid)
139
143
  when Symbol, String
140
- grid.send(option.to_sym)
144
+ grid.send(option.to_sym)
141
145
  else
142
146
  raise Datagrid::ConfigurationError, "Incorrect column availability option: #{option.insepct}"
143
147
  end
@@ -115,11 +115,6 @@ module Datagrid
115
115
  attributes
116
116
  end
117
117
 
118
- def paginate(*args, &block) # :nodoc:
119
- ::Datagrid::Utils.warn_once("#paginate is deprecated. Call it like object.assets.paginate(...).")
120
- self.assets.paginate(*args, &block)
121
- end
122
-
123
118
  # Redefines scope at instance level
124
119
  #
125
120
  # class MyGrid
@@ -22,19 +22,19 @@ module Datagrid
22
22
  end
23
23
 
24
24
  # Renders html table with columns defined in grid class.
25
- # In the most common used you need to pass paginated collection
25
+ # In the most common used you need to pass paginated collection
26
26
  # to datagrid table because datagrid do not have pagination compatibilities:
27
- #
27
+ #
28
28
  # assets = grid.assets.page(params[:page])
29
29
  # datagrid_table(grid, assets, options)
30
30
  #
31
31
  # Supported options:
32
32
  #
33
33
  # * <tt>:html</tt> - hash of attributes for <table> tag
34
- # * <tt>:order</tt> - If false do not generate ordering controlls.
34
+ # * <tt>:order</tt> - If false do not generate ordering controlls.
35
35
  # Default: true.
36
- # * <tt>:columns</tt> - Array of column names to display.
37
- # Used in case when same grid class is used in different places
36
+ # * <tt>:columns</tt> - Array of column names to display.
37
+ # Used in case when same grid class is used in different places
38
38
  # and needs different columns. Default: all defined columns.
39
39
  # * <tt>:partials</tt> - Path for partials lookup.
40
40
  # Default: 'datagrid'.
@@ -59,8 +59,8 @@ module Datagrid
59
59
  #
60
60
  # Supported options:
61
61
  #
62
- # * <tt>:columns</tt> - Array of column names to display.
63
- # Used in case when same grid class is used in different places
62
+ # * <tt>:columns</tt> - Array of column names to display.
63
+ # Used in case when same grid class is used in different places
64
64
  # and needs different columns. Default: all defined columns.
65
65
  # * <tt>:partials</tt> - Path for partials lookup.
66
66
  # Default: 'datagrid'.
@@ -108,12 +108,21 @@ module Datagrid
108
108
  end
109
109
  end
110
110
 
111
- class HtmlRow #:nodoc:
112
- def initialize(context, grid, asset)
111
+ # Represents a datagrid row that provides access to column values for the given asset
112
+ #
113
+ # row = datagrid_row(grid, user)
114
+ # row.first_name # => "<strong>Bogdan</strong>"
115
+ # row.grid # => Grid object
116
+ # row.asset # => User object
117
+ class HtmlRow
118
+
119
+ attr_reader :grid, :asset
120
+
121
+ def initialize(context, grid, asset) # :nodoc:
113
122
  @context = context
114
123
  @grid = grid
115
124
  @asset = asset
116
- end
125
+ end
117
126
 
118
127
  def method_missing(method, *args, &blk)
119
128
  if column = @grid.column_by_name(method)
@@ -38,15 +38,7 @@ module Datagrid
38
38
  options = args.extract_options!
39
39
  options[:html] ||= {}
40
40
  options[:html][:class] ||= "datagrid #{@template.dom_class(grid)}"
41
- if options[:cycle]
42
- ::Datagrid::Utils.warn_once("datagrid_table cycle option is deprecated. Use css to style odd/even rows instead.")
43
- end
44
41
  assets = args.any? ? args.shift : grid.assets
45
- paginate = options[:paginate]
46
- if paginate
47
- ::Datagrid::Utils.warn_once(":paginate option is deprecated. Look to https://github.com/bogdan/datagrid/wiki/Frontend.")
48
- assets = assets.paginate(paginate)
49
- end
50
42
 
51
43
  _render_partial('table', options[:partials],
52
44
  {
@@ -10,12 +10,12 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
10
10
  def create_scaffold
11
11
  template "grid.rb.erb", "app/grids/#{grid_class_name.underscore}.rb"
12
12
  if File.exists?(grid_controller_file)
13
- inject_into_file grid_controller_file, index_action, :after => %r{class .*#{grid_controller_name}.*\n}
13
+ inject_into_file grid_controller_file, index_action, :after => %r{class .*#{grid_controller_class_name}.*\n}
14
14
  else
15
15
  template "controller.rb.erb", grid_controller_file
16
16
  end
17
- template "index.html.erb", "app/views/#{grid_controller_short_name}/index.html.erb"
18
- route("resources :#{grid_controller_short_name}")
17
+ template "index.html.erb", view_file
18
+ route(generate_routing_namespace("resources :#{grid_controller_short_name}"))
19
19
  unless defined?(::Kaminari) || defined?(::WillPaginate)
20
20
  gem 'kaminari'
21
21
  end
@@ -33,20 +33,24 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
33
33
  end
34
34
  end
35
35
 
36
+ def view_file
37
+ Rails.root.join("app/views").join(controller_file_path).join("index.html.erb")
38
+ end
39
+
36
40
  def grid_class_name
37
41
  file_name.camelize.pluralize + "Grid"
38
42
  end
39
43
 
40
- def grid_controller_name
41
- grid_controller_short_name.camelize + "Controller"
44
+ def grid_controller_class_name
45
+ controller_class_name.camelize + "Controller"
42
46
  end
43
47
 
44
48
  def grid_controller_file
45
- Rails.root.join("app/controllers/#{grid_controller_name.underscore}.rb")
49
+ Rails.root.join("app/controllers").join("#{grid_controller_class_name.underscore}.rb")
46
50
  end
47
51
 
48
52
  def grid_controller_short_name
49
- file_name.underscore.pluralize
53
+ controller_file_name
50
54
  end
51
55
 
52
56
  def grid_model_name
@@ -68,7 +72,7 @@ class Datagrid::Scaffold < Rails::Generators::NamedBase
68
72
  end
69
73
 
70
74
  def grid_route_name
71
- grid_controller_short_name + "_path"
75
+ controller_class_name.underscore.gsub("/", "_") + "_path"
72
76
  end
73
77
 
74
78
  def index_action
@@ -81,4 +85,28 @@ end
81
85
  RUBY
82
86
  end
83
87
 
88
+ protected
89
+ def generate_routing_namespace(code)
90
+ depth = regular_class_path.length
91
+ # Create 'namespace' ladder
92
+ # namespace :foo do
93
+ # namespace :bar do
94
+ namespace_ladder = regular_class_path.each_with_index.map do |ns, i|
95
+ indent("namespace :#{ns} do\n", i * 2)
96
+ end.join
97
+
98
+ # Create route
99
+ # get 'baz/index'
100
+ route = indent(code, depth * 2)
101
+
102
+ # Create `end` ladder
103
+ # end
104
+ # end
105
+ end_ladder = (1..depth).reverse_each.map do |i|
106
+ indent("end\n", i * 2)
107
+ end.join
108
+
109
+ # Combine the 3 parts to generate complete route entry
110
+ namespace_ladder + route + "\n" + end_ladder
111
+ end
84
112
  end
@@ -521,4 +521,45 @@ describe Datagrid::Columns do
521
521
  expect(row.random2).to_not eq(row.random1)
522
522
  end
523
523
  end
524
+
525
+ describe "decoration" do
526
+ class EntryDecorator
527
+ attr_reader :model
528
+ def initialize(model)
529
+ @model = model
530
+ end
531
+ def capitalized_name
532
+ model.name.capitalize
533
+ end
534
+ end
535
+
536
+ let!(:entry) do
537
+ Entry.create!(name: 'hello', category: 'first')
538
+ end
539
+
540
+ it "delegates column values to decorator" do
541
+ grid = test_report do
542
+ scope { Entry }
543
+ decorate { |model| EntryDecorator.new(model) }
544
+ column(:capitalized_name)
545
+ column(:category) do |presenter|
546
+ presenter.model.category
547
+ end
548
+ column(:capitalized_name_dup) do |_, _, row|
549
+ row.capitalized_name
550
+ end
551
+ end
552
+
553
+ expect(grid.rows).to eq([['Hello', 'first', 'Hello']])
554
+ end
555
+
556
+ it "allows class decorator" do
557
+ grid = test_report do
558
+ scope { Entry }
559
+ decorate { EntryDecorator }
560
+ column(:capitalized_name)
561
+ end
562
+ expect(grid.rows).to eq([['Hello']])
563
+ end
564
+ end
524
565
  end
@@ -90,14 +90,6 @@ describe Datagrid::Helper do
90
90
  })
91
91
  end
92
92
 
93
- it "should support cycle option" do
94
- expect(subject.datagrid_rows(grid, [entry], :cycle => ["odd", "even"])).to match_css_pattern({
95
- "tr.odd td.group" => "Pop",
96
- "tr.odd td.name" => "Star"
97
- })
98
-
99
- end
100
-
101
93
  it "should support no order given" do
102
94
  expect(subject.datagrid_table(grid, [entry], :order => false)).to match_css_pattern("table.datagrid th .order" => 0)
103
95
  end
@@ -383,7 +375,7 @@ describe Datagrid::Helper do
383
375
  it "should escape html" do
384
376
  entry.update_attributes!(:name => "<div>hello</div>")
385
377
  expect(subject.datagrid_rows(grid, [entry], :columns => [:name])).to equal_to_dom(<<-HTML)
386
- <tr class=""><td class="name">&lt;div&gt;hello&lt;/div&gt;</td></tr>
378
+ <tr><td class="name">&lt;div&gt;hello&lt;/div&gt;</td></tr>
387
379
  HTML
388
380
  end
389
381
 
@@ -393,7 +385,7 @@ describe Datagrid::Helper do
393
385
  model.name.html_safe
394
386
  end
395
387
  expect(subject.datagrid_rows(grid, [entry], :columns => [:safe_name])).to equal_to_dom(<<-HTML)
396
- <tr class=""><td class="safe_name"><div>hello</div></td></tr>
388
+ <tr><td class="safe_name"><div>hello</div></td></tr>
397
389
  HTML
398
390
 
399
391
  end
@@ -513,6 +505,7 @@ describe Datagrid::Helper do
513
505
  expect(r.name).to eq("Hello")
514
506
  expect(r.category).to eq("greetings")
515
507
  end
508
+
516
509
  it "should yield block" do
517
510
  subject.datagrid_row(grid, entry) do |row|
518
511
  expect(row.name).to eq("Hello")
@@ -528,30 +521,11 @@ describe Datagrid::Helper do
528
521
  end
529
522
  expect(name).to eq("Hello,greetings")
530
523
  end
531
- end
532
-
533
- describe ".datagrid_value" do
534
- it "should format value by column name" do
535
- report = test_report do
536
- scope {Entry}
537
- column(:name) do |e|
538
- "<b>#{e.name}</b>"
539
- end
540
- end
541
524
 
542
- expect(subject.datagrid_value(report, :name, entry)).to eq("<b>Star</b>")
543
- end
544
- it "should support format in column" do
545
- report = test_report do
546
- scope {Entry}
547
- column(:name) do |e|
548
- format(e.name) do |value|
549
- link_to value, "/profile"
550
- end
551
- end
552
- end
553
- expect(subject.datagrid_value(report, :name, entry)).to be_html_safe
554
- expect(subject.datagrid_value(report, :name, entry)).to eq("<a href=\"/profile\">Star</a>")
525
+ it "should give access to grid and asset" do
526
+ r = subject.datagrid_row(grid, entry)
527
+ expect(r.grid).to eq(grid)
528
+ expect(r.asset).to eq(entry)
555
529
  end
556
530
 
557
531
  it "should use cache" do
@@ -576,11 +550,37 @@ describe Datagrid::Helper do
576
550
  expect(data_row.random2).to_not eq(html_row.random2)
577
551
  expect(data_row.random2).to_not eq(html_row.random1)
578
552
  end
579
-
553
+
554
+ end
555
+
556
+ describe ".datagrid_value" do
557
+ it "should format value by column name" do
558
+ report = test_report do
559
+ scope {Entry}
560
+ column(:name) do |e|
561
+ "<b>#{e.name}</b>"
562
+ end
563
+ end
564
+
565
+ expect(subject.datagrid_value(report, :name, entry)).to eq("<b>Star</b>")
566
+ end
567
+ it "should support format in column" do
568
+ report = test_report do
569
+ scope {Entry}
570
+ column(:name) do |e|
571
+ format(e.name) do |value|
572
+ link_to value, "/profile"
573
+ end
574
+ end
575
+ end
576
+ expect(subject.datagrid_value(report, :name, entry)).to be_html_safe
577
+ expect(subject.datagrid_value(report, :name, entry)).to eq("<a href=\"/profile\">Star</a>")
578
+ end
579
+
580
580
  end
581
581
 
582
582
  describe ".datagrid_header" do
583
-
583
+
584
584
  it "should support order_by_value colums" do
585
585
  grid = test_report(:order => "category") do
586
586
  scope { Entry }
@@ -1,4 +1,4 @@
1
- <tr class="<%= options[:cycle] && cycle(*options[:cycle]) %>">
1
+ <tr>
2
2
  <p>Namespaced row partial.</p>
3
3
  <% grid.html_columns(*options[:columns]).each do |column| %>
4
4
  <td class="<%= datagrid_column_classes(grid, column) %>"><%= datagrid_value(grid, column, asset) %></td>
@@ -1,4 +1,4 @@
1
- class <%= grid_controller_name %> < ApplicationController
1
+ class <%= grid_controller_class_name %> < ApplicationController
2
2
 
3
3
  <%= index_action -%>
4
4
 
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.3
4
+ version: 1.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Gusiev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-31 00:00:00.000000000 Z
11
+ date: 2016-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -199,7 +199,6 @@ executables: []
199
199
  extensions: []
200
200
  extra_rdoc_files:
201
201
  - LICENSE.txt
202
- - Readme.markdown
203
202
  files:
204
203
  - ".document"
205
204
  - ".rspec"
@@ -328,7 +327,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
328
327
  version: '0'
329
328
  requirements: []
330
329
  rubyforge_project:
331
- rubygems_version: 2.4.7
330
+ rubygems_version: 2.5.1
332
331
  signing_key:
333
332
  specification_version: 4
334
333
  summary: Ruby gem to create datagrids