grapple 0.1.8 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fba23ec15fa15e3af330adb21135aa01d7fc086b
4
- data.tar.gz: a1400867677c6d2aaf42f960be45cc3a43290882
3
+ metadata.gz: 1d49408d1a5288a086cb3cb5016d2c6e68b09691
4
+ data.tar.gz: 6cbd12c3529aa3bb347771430e6bffab4926924b
5
5
  SHA512:
6
- metadata.gz: c34626569e41eb3064454c449b39c6bf789addcf65e67891b2adade034e62666dbadc8ef5aec741cbd86466a2f30a0ce148b87e3f2aebc2ccb75756b0e23683b
7
- data.tar.gz: c7209519dd827357fa63d1d582ab050cfbd1b83345dbc24ea994c591f969b8d16fd0d39735b8328acbf4dd809e10cf1d661ada5d44bf34672d26125501e2851e
6
+ metadata.gz: e4fb86706c0372306b4381daa0224257b16589318d2726e9451294696e2bc5707359c29b6a2fcb907266bdca4493f7d385975b0c7e0d501cb6ec0f5cd017bb5c
7
+ data.tar.gz: 13e5c2b134d2930a836db20d3c8ea619cafccd0f69e43201171f178f1b1e3d9244468973878b8b85b4f3cd5c2d8da8cbc667df5ce9d9603ff695f612733f61f2
data/README.md CHANGED
@@ -189,7 +189,7 @@ Render the table using `table_for` in `app/views/posts/_table.html.erb`
189
189
 
190
190
  ## History w/AJAX (back button)
191
191
 
192
- Requires: https://github.com/browserstate/history.js/
192
+ Uses the native `window.history` API by default. If History.js is present it will use that instead for compatibility with older browsers (https://github.com/browserstate/history.js/).
193
193
 
194
194
  ``` javascript
195
195
  // app/assets/javascripts/application.js
@@ -4,25 +4,62 @@
4
4
  var urlQuery = Grapple.Util.urlQuery,
5
5
  parseUrlQuery = Grapple.Util.parseUrlQuery;
6
6
 
7
- var GrappleHistory = function(namespace) {
8
- this.namespace = namespace;
9
- if(History.init) {
10
- // https://github.com/browserstate/history.js/
11
- this.api = History;
7
+ // History.js for backwards compatibility with older browsers
8
+ // https://github.com/browserstate/history.js/
9
+ var LegacyHistory = function() {
10
+ var api = History;
12
11
 
13
- // Initialization of history.js can be delayed
14
- // if it was do it now
15
- if(this.api.options && this.api.options.delayInit) {
16
- this.api.options.delayInit = false;
17
- this.api.init();
18
- }
12
+ // Initialization of history.js can be delayed
13
+ // if it was do it now
14
+ if(api.options && api.options.delayInit) {
15
+ api.options.delayInit = false;
16
+ api.init();
19
17
  }
20
- else {
21
- // TODO: support native history api
22
- this.api = window.history;
18
+ this.api = api;
19
+ };
20
+
21
+ LegacyHistory.prototype = {
22
+ push: function(params) {
23
+ return this.api.pushState(null, document.title, '?' + params);
24
+ },
25
+ get: function() {
26
+ return urlQuery(this.api.getState().url);
27
+ },
28
+ bind: function(callback) {
29
+ $(window).bind('statechange', callback);
30
+ },
31
+ unbind: function(callback) {
32
+ $(window).unbind('statechange', callback);
23
33
  }
24
- this.api = History;
25
- this.changeCallback = null;
34
+ };
35
+
36
+ // Native Browser History API
37
+ var ModernHistory = function() {
38
+
39
+ };
40
+
41
+ ModernHistory.prototype = {
42
+ push: function(params) {
43
+ if(window.history && window.history.pushState) {
44
+ return window.history.pushState(params, document.title, '?' + params);
45
+ }
46
+ },
47
+ get: function() {
48
+ if(window.history) {
49
+ return window.history.state || urlQuery(document.location.toString());
50
+ }
51
+ },
52
+ bind: function(callback) {
53
+ $(window).bind('popstate', callback);
54
+ },
55
+ unbind: function(callback) {
56
+ $(window).unbind('popstate', callback);
57
+ }
58
+ };
59
+
60
+ var GrappleHistory = function(grappleTable) {
61
+ this.grappleTable = grappleTable;
62
+ this._historyChangeCallback = null;
26
63
  };
27
64
 
28
65
  // Don't clutter the url with rails form parameters
@@ -30,10 +67,20 @@ GrappleHistory.IGNORE_PARAMS = { 'utf8': true, 'authenticity_token': true };
30
67
 
31
68
  GrappleHistory.prototype = {
32
69
 
33
- add: function(params) {
34
- var namespace = this.namespace;
35
- var state = this.api.getState();
36
- var historyParams = parseUrlQuery(urlQuery(state.url));
70
+ init: function() {
71
+ // Use the History.js wrapper if History.js has been loaded
72
+ this.api = typeof History !== 'undefined' && History.init ? new LegacyHistory() : new ModernHistory();
73
+ this._subscribeToTableChange();
74
+ this._subscribeToHistoryChange();
75
+ },
76
+
77
+ /**
78
+ * Add an entry to the history
79
+ * @param {String} params
80
+ */
81
+ _addHistoryEntry: function(params) {
82
+ var namespace = this.grappleTable.namespace;
83
+ var historyParams = parseUrlQuery(this.api.get());
37
84
  var newParams = parseUrlQuery(params);
38
85
 
39
86
  // Remove any parameters from the current state
@@ -57,14 +104,45 @@ GrappleHistory.prototype = {
57
104
  historyParams[x] = newParams[x];
58
105
  }
59
106
 
60
- this.api.pushState(null, document.title, '?' + $.param(historyParams));
107
+ this.api.push($.param(historyParams));
61
108
  },
62
109
 
63
- subscribe: function(callback) {
64
- var api = this.api, namespace = this.namespace;
65
- this.changeCallback = function(event) {
66
- var state = api.getState();
67
- var params = parseUrlQuery(urlQuery(state.url));
110
+ /**
111
+ * Listen for changes to the table to add them to the history
112
+ */
113
+ _subscribeToTableChange: function() {
114
+ var self = this;
115
+ this._beforeLoadCallback = function(e, params) {
116
+ self._unsubscribeFromTableChange();
117
+ self._unsubscribeFromHistoryChange();
118
+ // Don't add params to history if this was triggered by history change
119
+ if(self._ignoreNextLoad) {
120
+ self._ignoreNextLoad = false;
121
+ }
122
+ else {
123
+ self._addHistoryEntry(params);
124
+ }
125
+ };
126
+ this.grappleTable.element.on('grapple:before_load', this._beforeLoadCallback);
127
+ },
128
+
129
+ /**
130
+ * Stop listening for changes to the table
131
+ */
132
+ _unsubscribeFromTableChange: function() {
133
+ if(this._beforeLoadCallback) {
134
+ this.grappleTable.element.unbind('grapple:before_load', this._beforeLoadCallback);
135
+ this._beforeLoadCallback = null;
136
+ }
137
+ },
138
+
139
+ /**
140
+ * Listen for changes to the history (back button clicks)
141
+ */
142
+ _subscribeToHistoryChange: function() {
143
+ var api = this.api, namespace = this.grappleTable.namespace, self = this;
144
+ this._historyChangeCallback = function(event) {
145
+ var params = parseUrlQuery(api.get());
68
146
  // Only include the parameters for this namespace
69
147
  if(namespace) {
70
148
  var r = new RegExp('^' + namespace + '\\[([^\\]]+)\\]$')
@@ -74,15 +152,19 @@ GrappleHistory.prototype = {
74
152
  }
75
153
  }
76
154
  }
77
- callback(params);
155
+ self._ignoreNextLoad = true;
156
+ self.grappleTable.loadTable($.param(params));
78
157
  };
79
- $(window).bind('statechange', this.changeCallback);
158
+ this.api.bind(this._historyChangeCallback);
80
159
  },
81
160
 
82
- unsubscribe: function() {
83
- if(this.changeCallback) {
84
- $(window).unbind('statechange', this.changeCallback);
85
- this.changeCallback = null;
161
+ /**
162
+ * Stop listening for history changes
163
+ */
164
+ _unsubscribeFromHistoryChange: function() {
165
+ if(this._historyChangeCallback) {
166
+ this.api.unbind(this._historyChangeCallback);
167
+ this._historyChangeCallback = null;
86
168
  }
87
169
  }
88
170
 
@@ -1,8 +1,5 @@
1
1
  (function(Grapple, $) {
2
2
  'use strict';
3
-
4
- var urlQuery = Grapple.Util.urlQuery,
5
- parseUrlQuery = Grapple.Util.parseUrlQuery;
6
3
 
7
4
  var overrideLink = function(clickable, anchor, callback) {
8
5
  var href = $(anchor).attr('href');
@@ -15,8 +12,8 @@ var overrideLink = function(clickable, anchor, callback) {
15
12
  /**
16
13
  * Creates a new instance of the Grapple AJAX widget.
17
14
  *
18
- * @param {String} Selector for the table container element.
19
- * @param {Object} Hash of options for the table (url, namespace, history)
15
+ * @param {String} element - Selector for the table container element.
16
+ * @param {Object} options - Hash of options for the table (url, namespace, history)
20
17
  */
21
18
  var GrappleTable = function(element, options) {
22
19
  options = options || {};
@@ -24,14 +21,12 @@ var GrappleTable = function(element, options) {
24
21
  this.url = options.url || this.element.data('grapple-ajax-url');
25
22
  this.namespace = options.namespace || this.element.data('grapple-ajax-namespace') || null;
26
23
  this.currentParams = options.params || '';
24
+ this.plugins = {};
27
25
  if(typeof options.history !== 'undefined' && options.history !== true) {
28
- this.history = options.history;
26
+ this.plugins.history = options.history;
29
27
  }
30
28
  else if(this.element.data('grapple-ajax-history') == 1 || options.history === true) {
31
- this.history = new Grapple.History(this.namespace);
32
- }
33
- else {
34
- this.history = null;
29
+ this.plugins.history = new Grapple.History(this);
35
30
  }
36
31
  this.init();
37
32
  };
@@ -44,7 +39,7 @@ GrappleTable.NON_TABLE_RESPONSE = '<!DOCTYPE html>';
44
39
  GrappleTable.prototype = {
45
40
 
46
41
  /**
47
- *
42
+ * Initialize the grapple table
48
43
  */
49
44
  init: function() {
50
45
  var self = this;
@@ -56,39 +51,29 @@ GrappleTable.prototype = {
56
51
  self.initSorting();
57
52
  self.initSearchForm();
58
53
  self.initPagination();
59
- self.initHistory();
54
+ self.initPlugins();
60
55
 
61
56
  self.element.removeClass(GrappleTable.CSS_AJAX_LOADING);
62
57
  },
63
58
 
64
- initHistory: function() {
65
- if(this.history) {
66
- var self = this;
67
- this.history.unsubscribe();
68
- this.history = new Grapple.History(this.namespace);
69
- this.history.subscribe(function(params) {
70
- self.onHistoryChange(params);
71
- });
59
+ /**
60
+ * Initialize plugins
61
+ */
62
+ initPlugins: function() {
63
+ for(var name in this.plugins) {
64
+ this.plugins[name].init();
72
65
  }
73
66
  },
74
67
 
75
- onHistoryChange: function(params) {
76
- this._showLoading();
77
- this._updateTable($.param(params));
78
- },
79
-
80
68
  /**
81
- *
69
+ * Load the table contents
70
+ * @param {String} params - Query string of parameters to load the table with
71
+ * @fires Grapple#grapple:before_load
72
+ * @fires Grapple#grapple:after_load
82
73
  */
83
74
  loadTable: function(params) {
84
- this.element.trigger('grapple:before_load');
75
+ this.element.trigger('grapple:before_load', params);
85
76
  this._showLoading();
86
-
87
- if(this.history) {
88
- this.history.unsubscribe();
89
- this.history.add(params);
90
- }
91
-
92
77
  this._updateTable(params);
93
78
  },
94
79
 
@@ -117,7 +102,7 @@ GrappleTable.prototype = {
117
102
  }
118
103
  $.ajax(url, {
119
104
  success: function(data) {
120
- // HACK
105
+ // HACK: handle full page responses
121
106
  var nonTableKeyIndex = data.indexOf(GrappleTable.NON_TABLE_RESPONSE);
122
107
  if(nonTableKeyIndex > -1 && nonTableKeyIndex < 100) {
123
108
  data = "Failed to load table";
@@ -1,9 +1,6 @@
1
1
  (function(globals) {
2
2
  'use strict';
3
3
 
4
- // Namespace
5
- var Grapple = {};
6
-
7
4
  var decodeParam = function(str) {
8
5
  return decodeURIComponent(str.replace(/\+/g, " "));
9
6
  };
@@ -1,2 +1,5 @@
1
1
  en:
2
- no_search_results: "We're sorry. No results were found."
2
+ displaying_x_y_of_z_results: "Displaying %{x} - %{y} of %{z} results"
3
+ no_search_results: "We're sorry. No results were found."
4
+ search: "Search"
5
+ zero_results: "0 results"
@@ -2,6 +2,12 @@ module Grapple
2
2
  class BaseTableBuilder
3
3
 
4
4
  # Create a helper
5
+ # @param name [Symbol]
6
+ # The name of the helper
7
+ # @param klass [Grapple::Components::BaseComponent]
8
+ # The component class
9
+ # @param settings [Hash]
10
+ # Settings for the component
5
11
  def self.helper(name, klass, settings = {})
6
12
  class_eval <<-RUBY_EVAL
7
13
  def #{name}(*arguments, &block)
@@ -13,6 +19,10 @@ module Grapple
13
19
  end
14
20
 
15
21
  # Update settings for a helper
22
+ # @param helper_name [Symbol]
23
+ # The name of the helper
24
+ # @param options [Hash]
25
+ # Settings to update for the component
16
26
  def self.configure(helper_name, *options)
17
27
  settings = options[0] || {}
18
28
  method = :"settings_for_#{helper_name}"
@@ -24,7 +34,22 @@ module Grapple
24
34
  define_singleton_method(method) { settings }
25
35
  end
26
36
 
27
- attr_reader :columns, :records, :template, :params, :namespace
37
+ # An Array of columns
38
+ # @return [Array<Hash>]
39
+ attr_reader :columns
40
+
41
+ # An Array, ActiveRecord::Collection or Enumerable of records to be displayed in the table
42
+ # @return [Enumerable]
43
+ attr_reader :records
44
+
45
+ # @return [ActionView::Base]
46
+ attr_reader :template
47
+
48
+ # Request parameters
49
+ attr_reader :params
50
+
51
+ # @return [String] namespace for the grapple table
52
+ attr_reader :namespace
28
53
 
29
54
  def initialize(template, columns, records, params = {}, *options)
30
55
  @template = template
@@ -37,14 +62,18 @@ module Grapple
37
62
  @helper_instances = {}
38
63
  end
39
64
 
65
+ # Default options for the component
66
+ # @return [Hash]
40
67
  def default_options
41
68
  { }
42
69
  end
43
70
 
71
+ # HTML to insert before the <table> tag
44
72
  def before_table
45
73
  ''
46
74
  end
47
75
 
76
+ # HTML to insert after the </table> tag
48
77
  def after_table
49
78
  ''
50
79
  end
@@ -19,6 +19,8 @@ module Grapple
19
19
  autoload :SearchSubmit
20
20
  autoload :WillPaginatePagination
21
21
  autoload :WillPaginateInfobar
22
+ autoload :KaminariPagination
23
+ autoload :KaminariInfobar
22
24
 
23
25
  end
24
26
  end
@@ -1,5 +1,22 @@
1
1
  module Grapple
2
2
  module Components
3
+
4
+ # Render links that apply to the table
5
+ # @example
6
+ # <%
7
+ # actions = [
8
+ # { label: :new_user, url: new_user_path },
9
+ # { label: :export_users, url: export_users_path }
10
+ # ]
11
+ # %>
12
+ # <%= table_for(columns, @users) do |t| %>
13
+ # <%= t.header do %>
14
+ # <%= t.toolbar do %>
15
+ # <%= t.actions actions %>
16
+ # <% end %>
17
+ # <%= t.column_headings %>
18
+ # <% end %>
19
+ # <% end %>
3
20
  class Actions < HtmlComponent
4
21
 
5
22
  setting :link_to_helper, :link_to
@@ -1,5 +1,7 @@
1
1
  module Grapple
2
2
  module Components
3
+
4
+ # Base class for components
3
5
  class BaseComponent
4
6
 
5
7
  cattr_accessor :default_settings
@@ -11,8 +13,12 @@ module Grapple
11
13
  @@default_settings[self.name][name] = default
12
14
  end
13
15
 
14
- attr_reader :columns, :records, :template, :params, :builder
15
-
16
+ attr_reader :columns
17
+ attr_reader :records
18
+ attr_reader :template
19
+ attr_reader :params
20
+ attr_reader :builder
21
+
16
22
  def initialize(columns, records, template, params, builder, settings = {})
17
23
  @template = template
18
24
  @columns = columns
@@ -23,7 +29,7 @@ module Grapple
23
29
  self.send(:"#{name}=", value)
24
30
  end
25
31
  end
26
-
32
+
27
33
  def render(*options, &block)
28
34
  raise StandardError.new("Component must override render method")
29
35
  end
@@ -71,6 +77,7 @@ module Grapple
71
77
  template.with_output_buffer(&block).html_safe
72
78
  end
73
79
 
80
+ # Renders a block if present, otherwise renders the components with options
74
81
  def block_or_components(components, options, &block)
75
82
  block.nil? ? render_components(components, options, &block).join : capture_block(&block)
76
83
  end
@@ -34,6 +34,10 @@ module Grapple
34
34
  content = label
35
35
  end
36
36
 
37
+ if column[:class]
38
+ column[:class].split(" ").each{|c| cell_classes << c}
39
+ end
40
+
37
41
  cell_classes = ' class="' + cell_classes.join(' ') + '"'
38
42
  title = column[:title] ? " title=\"#{h(column[:title])}\"" : ''
39
43
  liner_classes = liner_classes.length ? " class=\"#{liner_classes.join(" ")}\"" : ''
@@ -1,6 +1,7 @@
1
1
  module Grapple
2
2
  module Components
3
3
 
4
+ # thead element for tables
4
5
  class HtmlHeader < HtmlComponent
5
6
 
6
7
  setting :components, []
@@ -1,9 +1,9 @@
1
1
  module Grapple
2
2
  module Components
3
- # Generates paging links using will_paginate.
3
+ # Generates paging links using Kaminari.
4
4
  #
5
5
  # @example
6
- # <%= table_for(columns, Post.paginate(page: 2)) do |t| %>
6
+ # <%= table_for(columns, Post.page(2)) do |t| %>
7
7
  # <%= t.footer do %>
8
8
  # <%= t.pagination %>
9
9
  # <% end %>
@@ -9,7 +9,7 @@ module Grapple
9
9
  template.text_field_tag(
10
10
  search_query_param.to_s,
11
11
  params[search_query_param.to_sym],
12
- { :class => search_query_field_class, placeholder: "Search" }
12
+ { class: search_query_field_class, placeholder: I18n.translate(:search) }
13
13
  )
14
14
  end
15
15
 
@@ -2,9 +2,6 @@ module Grapple
2
2
  module Components
3
3
  class WillPaginateInfobar < HtmlComponent
4
4
 
5
- setting :message, "Displaying %s - %s of %s results"
6
- setting :no_results_message, "0 results"
7
-
8
5
  def render
9
6
  if records.total_entries > 0
10
7
  start_range = records.offset + 1
@@ -14,12 +11,12 @@ module Grapple
14
11
  end_range = ActiveSupport::NumberHelper.number_to_delimited(end_range)
15
12
  total = ActiveSupport::NumberHelper.number_to_delimited(records.total_entries)
16
13
 
17
- html = sprintf(message, start_range, end_range, total)
14
+ html = I18n.translate(:displaying_x_y_of_z_results, x: start_range, y: end_range, z: total)
18
15
  else
19
- html = no_results_message
16
+ html = I18n.translate(:zero_results)
20
17
  end
21
18
 
22
- builder.row "<th colspan=\"#{num_columns}\">#{html}</th>", :class => 'infobar'
19
+ builder.row "<th colspan=\"#{num_columns}\">#{html}</th>", class: 'infobar'
23
20
  end
24
21
 
25
22
  end
@@ -16,9 +16,10 @@ module Grapple
16
16
 
17
17
  def render(paginate_parameters = {})
18
18
  td_class = ""
19
+
19
20
  if records.instance_of?(Array)
20
21
  html = '&nbsp;'
21
- elsif !params[:query].blank? and records.empty?
22
+ elsif params.has_key?(:query) && records.empty?
22
23
  html = h(t(no_results_message))
23
24
  td_class = "class='text-left'"
24
25
  else
@@ -5,6 +5,16 @@ module Grapple
5
5
  @@builder = Grapple::DataGridBuilder
6
6
  mattr_accessor :builder
7
7
 
8
+ # Render a grapple table
9
+ # @param columns [Enumerable]
10
+ # @param records [Enumerable]
11
+ # @option args :container [Boolean]
12
+ # If true the table will be rendered with a container div around it
13
+ # @option args :html [Hash]
14
+ # HTML attributes for the `<table>` element
15
+ # @option args :builder [Grapple::BaseTableBuilder]
16
+ # The table builder to use to render the table
17
+ # @option args :params
8
18
  def table_for(columns, records, *args, &block)
9
19
  options = args[0] || {}
10
20
  # Don't render the container for AJAX requests by default
@@ -9,11 +9,11 @@ describe 'Ajax Data Grid Builder' do
9
9
  end
10
10
 
11
11
  it "container_attributes should be correct" do
12
- attr = Grapple::AjaxDataGridBuilder.container_attributes(self, { :id => 'my_table' })
12
+ builder = Grapple::AjaxDataGridBuilder.new(self, [], [], {}, id: 'my_table')
13
+ attr = builder.container_attributes()
13
14
  expect(attr[:id]).to eq "my_table"
14
15
  expect(attr[:class]).to include("grapple")
15
16
  expect(attr[:data]['grapple-ajax-url']).to eq '/mock/path'
16
- puts attr
17
17
  end
18
18
 
19
19
  end
@@ -9,16 +9,15 @@ describe 'Base Table Builder' do
9
9
  end
10
10
 
11
11
  it "container_attributes should be correct" do
12
- attr = Grapple::HtmlTableBuilder.container_attributes(self, { :id => 'my_table' })
12
+ builder = Grapple::HtmlTableBuilder.new(self, users_columns, users_records, {}, id: 'my_table')
13
+ attr = builder.container_attributes()
13
14
  expect(attr[:class]).to include("grapple")
14
15
  end
15
16
 
16
17
  it "table should be correct" do
17
18
  builder = Grapple::HtmlTableBuilder.new(self, users_columns, users_records, {})
18
19
 
19
- html = builder.table("<tr><td>TEST</td></tr>")
20
-
21
- #puts html
20
+ html = builder.table("<tr><td>TEST</td></tr>".html_safe)
22
21
 
23
22
  expect(html).to have_tag('table') do
24
23
  with_tag("tr", count: 1) do
@@ -29,4 +28,4 @@ describe 'Base Table Builder' do
29
28
  end
30
29
  end
31
30
 
32
- end
31
+ end
@@ -20,14 +20,9 @@ describe 'will_paginate' do
20
20
  it "should be valid" do
21
21
  records = User.all.paginate({ page: 1, per_page: 3 })
22
22
  builder = Grapple::DataGridBuilder.new(self, columns, records, {})
23
- puts builder.infobar()
24
- puts builder.pagination()
25
23
 
26
24
  records = User.where('id < 0').paginate({ page: 1, per_page: 3 })
27
- builder = Grapple::DataGridBuilder.new(self, columns, records, {:query => 'test'})
28
- puts builder.infobar()
29
- puts builder.pagination()
30
-
25
+ builder = Grapple::DataGridBuilder.new(self, columns, records, {:query => 'test'})
31
26
  end
32
27
 
33
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grapple
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Potocko
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-02-23 00:00:00.000000000 Z
13
+ date: 2020-12-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: actionpack
@@ -18,28 +18,28 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 3.2.13
21
+ version: 4.2.11.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 3.2.13
28
+ version: 4.2.11.1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: activesupport
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 3.2.13
35
+ version: 4.2.11.1
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 3.2.13
42
+ version: 4.2.11.1
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: rspec-rails
45
45
  requirement: !ruby/object:Gem::Requirement
@@ -88,28 +88,28 @@ dependencies:
88
88
  requirements:
89
89
  - - ">="
90
90
  - !ruby/object:Gem::Version
91
- version: 3.2.13
91
+ version: 4.2.11.1
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
- version: 3.2.13
98
+ version: 4.2.11.1
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: activerecord
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: 3.2.13
105
+ version: 4.2.11.1
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 3.2.13
112
+ version: 4.2.11.1
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: will_paginate
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -207,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
207
  version: '0'
208
208
  requirements: []
209
209
  rubyforge_project:
210
- rubygems_version: 2.5.1
210
+ rubygems_version: 2.6.14.1
211
211
  signing_key:
212
212
  specification_version: 4
213
213
  summary: Customizable data grid for Rails