html_tables 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -7
- data/html_tables.gemspec +5 -5
- data/lib/html_tables/data_table.rb +0 -1
- data/lib/html_tables/data_table_helper.rb +4 -114
- data/lib/html_tables/renderer.rb +178 -0
- data/lib/html_tables/version.rb +1 -1
- data/lib/html_tables/yielded_object.rb +1 -1
- data/lib/html_tables.rb +1 -0
- metadata +15 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b67f1b4e5bf53dd37f9abd90e0263ba0fa4360c
|
4
|
+
data.tar.gz: c9466435747a950ed58afacc6555b83c94d64cb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f4a0899ab44d8f12dfb971d60e221997bb0e247f819e56afa9912b54915c808222f799a4149396d1c229f6aa68a808778617dbbf2f2732476b299030298cdc7
|
7
|
+
data.tar.gz: db2503a835c7d40c4bd1e10290734b227df2782e7873cc23511e7d7435195ec9e831f349d039fd80b458727d2bf1baa608334e4dc3e38077bcff71077d38fdfd
|
data/README.md
CHANGED
@@ -18,21 +18,24 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Slim example:
|
22
22
|
|
23
23
|
= data_table_for(@products, name: :products_table, html: { class: 'custom_table' }) do |t|
|
24
24
|
- t.group_by(:category) do |cat|
|
25
|
-
|
25
|
+
em= cat.name
|
26
26
|
- t.column(:code, align: :center, width: '9em')
|
27
27
|
- t.column(:description) { |p| p.descriptions.first }
|
28
|
-
- t.column(:pricing)
|
28
|
+
- t.column(:pricing, footer: :sum) do |item, total_in_footer|
|
29
|
+
- if item
|
30
|
+
= number_to_currency(item.pricing)
|
31
|
+
- else
|
32
|
+
blink = number_to_currency(total_in_footer)
|
29
33
|
- t.column(:quantity, width: '9em') do |p|
|
30
34
|
- if p.quantity == 0
|
31
|
-
|
32
|
-
%i.icon-flag.icon-white
|
35
|
+
span title='Out of stock' *
|
33
36
|
- else
|
34
|
-
|
35
|
-
- t.column(:
|
37
|
+
= number_with_delimiter p.quantity
|
38
|
+
- t.column(:status, align: :center, width: '3em', header: { text: 'St.', class: 'status-header' })
|
36
39
|
- t.nodata 'No product found.'
|
37
40
|
|
38
41
|
## Contributing
|
data/html_tables.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
require File.expand_path('../lib/html_tables/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
5
|
+
gem.authors = ['Fábio David Batista']
|
6
|
+
gem.email = ['fabio@elementarsistemas.com.br']
|
7
7
|
gem.description = %q{Simple DSL for HTML data tables}
|
8
8
|
gem.summary = %q{This gem was extracted from some projects on my company. Everyone is welcome to use and improve upon.}
|
9
|
-
gem.homepage =
|
9
|
+
gem.homepage = 'http://elementarsistemas.com.br/'
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
13
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
14
|
+
gem.name = 'html_tables'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = HtmlTables::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency 'i18n'
|
@@ -49,7 +49,6 @@ module HtmlTables
|
|
49
49
|
|
50
50
|
def header_for(column_id)
|
51
51
|
return nil if column_id.nil?
|
52
|
-
return columns[column_id][:header] if columns[column_id][:header]
|
53
52
|
return @builder.content_tag(:i, nil, class: 'icon-check') if columns[column_id][:checkbox]
|
54
53
|
v ||= I18n.t(column_id, scope: [:tables, options[:name] || :default], raise: true) rescue nil
|
55
54
|
v ||= I18n.t(column_id, scope: [:tables, :default], raise: true) rescue nil
|
@@ -5,124 +5,14 @@ module HtmlTables
|
|
5
5
|
def data_table_for(collection, options = {})
|
6
6
|
config = HtmlTables::Configuration.instance
|
7
7
|
|
8
|
-
|
8
|
+
table = DataTable.new(self, collection, options)
|
9
9
|
if block_given?
|
10
|
-
yield
|
10
|
+
yield table.object_to_yield
|
11
11
|
else
|
12
|
-
|
12
|
+
table.auto_generate_columns!
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
cls << 'table-condensed' if options[:condensed]
|
17
|
-
cls << options[:class] if options[:class]
|
18
|
-
table_html_options = { class: cls }
|
19
|
-
table_html_options.merge!(options[:html]) { |_, v1, v2| [v1, v2].flatten } if options[:html]
|
20
|
-
content_tag(:table, table_html_options) do
|
21
|
-
content_tag(:caption, options[:caption] || controller_name, class: ('hidden' unless options[:caption])) +
|
22
|
-
content_tag(:colgroup) do
|
23
|
-
b = ''.html_safe
|
24
|
-
t.columns.each do |_, opts|
|
25
|
-
col_opts = { }
|
26
|
-
col_opts[:style] = "width: #{opts[:width]}" if opts[:width]
|
27
|
-
b << content_tag(:col, col_opts) { }
|
28
|
-
end
|
29
|
-
b
|
30
|
-
end +
|
31
|
-
content_tag(:thead) do
|
32
|
-
content_tag(:tr) do
|
33
|
-
t.columns.map do |name, opts|
|
34
|
-
header_opts = {}
|
35
|
-
header_opts[:class] = 'check' if opts[:checkbox]
|
36
|
-
header_opts[:header_title] = opts[:header_title] if opts[:header_title]
|
37
|
-
content_tag(:th, t.header_for(name), header_opts)
|
38
|
-
end.join.html_safe
|
39
|
-
end
|
40
|
-
end +
|
41
|
-
content_tag(:tbody) do
|
42
|
-
b = ''.html_safe
|
43
|
-
rows = if options[:group]
|
44
|
-
collection.group_by {|i| options[:group][:proc].call(i) }.each do |g, l|
|
45
|
-
b << content_tag(:tr, class: 'group') do
|
46
|
-
content_tag(:th, capture(g, &options[:group][:block]), colspan: t.columns.size)
|
47
|
-
end
|
48
|
-
render_data_rows(b, l, t)
|
49
|
-
end
|
50
|
-
collection
|
51
|
-
else
|
52
|
-
render_data_rows(b, collection, t)
|
53
|
-
end
|
54
|
-
if rows.size == 0 then
|
55
|
-
b << content_tag(:tr, class: 'nodata') do
|
56
|
-
content_tag(:td, colspan: t.columns.size) { t.nodata_message }
|
57
|
-
end unless t.nodata_message.nil?
|
58
|
-
end
|
59
|
-
b
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def render_data_rows(b, collection, t)
|
65
|
-
collection.each do |item|
|
66
|
-
b << content_tag(:tr, t.row_options_for(item)) do
|
67
|
-
t.columns.map do |name, opts|
|
68
|
-
render_td(item, name, opts)
|
69
|
-
end.join.html_safe
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def render_td(item, column, opts)
|
75
|
-
td_options = {}
|
76
|
-
|
77
|
-
if opts[:align] == :center
|
78
|
-
td_options[:class] = 'c'
|
79
|
-
end
|
80
|
-
|
81
|
-
if opts[:title]
|
82
|
-
td_options[:title] = if opts[:title].respond_to?(:call)
|
83
|
-
opts[:title].call(item)
|
84
|
-
else
|
85
|
-
opts[:title].to_s
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
v = if opts[:checkbox]
|
90
|
-
checked = opts[:checked]
|
91
|
-
checked = opts[:block].call(item) if opts[:block]
|
92
|
-
check_box_tag "#{column}[]", item.public_send(opts.fetch(:value_method, :id)), checked, extract_check_box_tag_options(opts)
|
93
|
-
elsif opts[:radio]
|
94
|
-
radio_button_tag "#{column}[]", item.public_send(opts.fetch(:value_method, :id))
|
95
|
-
elsif opts[:block]
|
96
|
-
capture(item, &opts[:block])
|
97
|
-
else
|
98
|
-
tmp = item.public_send(column)
|
99
|
-
tmp = item.public_send("#{column}_text") rescue tmp if tmp.is_a?(Symbol)
|
100
|
-
tmp
|
101
|
-
end
|
102
|
-
|
103
|
-
if config.use_entity_shortcuts && v.is_a?(ActiveRecord::Base)
|
104
|
-
btn = content_tag(:div, class: 'entity-shortcut') do
|
105
|
-
link_to(config.url_generator_proc.(v), class: 'btn btn-small') do
|
106
|
-
content_tag(:i, nil, class: 'icon-share')
|
107
|
-
end
|
108
|
-
end rescue nil
|
109
|
-
end
|
110
|
-
|
111
|
-
v = if v.is_a?(Enumerable)
|
112
|
-
v.inject(''.html_safe) { |b, i| b << ', ' unless b.blank?; b << i.format_for_output }
|
113
|
-
else
|
114
|
-
v.format_for_output
|
115
|
-
end
|
116
|
-
v = v.to_s unless v.nil? || v.is_a?(String)
|
117
|
-
|
118
|
-
v = ''.html_safe << btn << v if btn
|
119
|
-
|
120
|
-
content_tag(:td, v, td_options)
|
121
|
-
end
|
122
|
-
|
123
|
-
def extract_check_box_tag_options(opts)
|
124
|
-
valid_options = [:disabled]
|
125
|
-
opts.select { |k, _| valid_options.include?(k) }
|
15
|
+
Renderer.new(self, table, collection, options).to_html
|
126
16
|
end
|
127
17
|
end
|
128
18
|
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
module HtmlTables
|
2
|
+
class Renderer
|
3
|
+
def initialize(helper, table, collection, options = {})
|
4
|
+
@helper = helper
|
5
|
+
@t = table
|
6
|
+
@collection = collection
|
7
|
+
@options = options
|
8
|
+
@config = HtmlTables::Configuration.instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_html
|
12
|
+
cls = config.default_table_classes.dup
|
13
|
+
cls << 'table-condensed' if options[:condensed]
|
14
|
+
cls << options[:class] if options[:class]
|
15
|
+
table_html_options = { class: cls }
|
16
|
+
table_html_options.merge!(options[:html]) { |_, v1, v2| [v1, v2].flatten } if options[:html]
|
17
|
+
|
18
|
+
content_tag(:table, table_html_options) do
|
19
|
+
content = ''.html_safe
|
20
|
+
content << caption << colgroup << thead << tfoot << tbody
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :t, :collection, :options, :config
|
27
|
+
delegate :content_tag, :check_box_tag, :capture, to: :@helper
|
28
|
+
|
29
|
+
def caption
|
30
|
+
return ''.html_safe unless options.has_key?(:caption)
|
31
|
+
content_tag(:caption, options[:caption])
|
32
|
+
end
|
33
|
+
|
34
|
+
def colgroup
|
35
|
+
content_tag(:colgroup) do
|
36
|
+
b = ''.html_safe
|
37
|
+
t.columns.each do |_, opts|
|
38
|
+
col_opts = { }
|
39
|
+
col_opts[:style] = "width: #{opts[:width]}" if opts[:width]
|
40
|
+
b << content_tag(:col, col_opts) { }
|
41
|
+
end
|
42
|
+
b
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def thead
|
47
|
+
content_tag(:thead) do
|
48
|
+
content_tag(:tr) do
|
49
|
+
t.columns.map do |name, opts|
|
50
|
+
header_opts = opts.fetch(:header, {})
|
51
|
+
header_opts = { text: header_opts } unless header_opts.is_a?(Hash)
|
52
|
+
header_opts[:text] ||= opts[:header_title] if opts[:header_title]
|
53
|
+
(header_opts[:class] ||= '') << ' check' if opts[:checkbox]
|
54
|
+
|
55
|
+
header_text = header_opts.delete(:text) { t.header_for(name) }
|
56
|
+
content_tag(:th, header_text, header_opts)
|
57
|
+
end.join.html_safe
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def tfoot
|
63
|
+
return ''.html_safe unless t.columns.any? { |_, c| c.has_key?(:footer) }
|
64
|
+
|
65
|
+
content_tag(:tfoot) do
|
66
|
+
content_tag(:tr) do
|
67
|
+
t.columns.map do |id, opts|
|
68
|
+
if opts.has_key?(:footer)
|
69
|
+
value =
|
70
|
+
case opts[:footer]
|
71
|
+
when Symbol
|
72
|
+
collection.map(&id.to_proc).public_send(opts[:footer])
|
73
|
+
when Proc
|
74
|
+
opts[:footer].call(collection)
|
75
|
+
end
|
76
|
+
content = opts[:block] ? capture(nil, value, &opts[:block]) : value.to_s
|
77
|
+
content_tag(:th, content, extract_td_options(opts, nil))
|
78
|
+
else
|
79
|
+
content_tag(:th)
|
80
|
+
end
|
81
|
+
end.join.html_safe
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def tbody
|
87
|
+
content_tag(:tbody) do
|
88
|
+
b = ''.html_safe
|
89
|
+
rows = if options[:group]
|
90
|
+
collection.group_by {|i| options[:group][:proc].call(i) }.each do |g, l|
|
91
|
+
b << content_tag(:tr, class: 'group') do
|
92
|
+
content_tag(:th, capture(g, &options[:group][:block]), colspan: t.columns.size)
|
93
|
+
end
|
94
|
+
render_data_rows(b, l, t)
|
95
|
+
end
|
96
|
+
collection
|
97
|
+
else
|
98
|
+
render_data_rows(b, collection, t)
|
99
|
+
end
|
100
|
+
b << no_data if rows.size.zero?
|
101
|
+
b
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def no_data
|
106
|
+
return '' if t.nodata_message.nil?
|
107
|
+
content_tag(:tr, class: 'nodata') do
|
108
|
+
content_tag(:td, colspan: t.columns.size) { t.nodata_message }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def render_data_rows(b, collection, t)
|
113
|
+
collection.each do |item|
|
114
|
+
b << content_tag(:tr, t.row_options_for(item)) do
|
115
|
+
t.columns.map do |name, opts|
|
116
|
+
render_td(item, name, opts)
|
117
|
+
end.join.html_safe
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def render_td(item, column, opts)
|
123
|
+
v = if opts[:checkbox]
|
124
|
+
checked = opts[:checked]
|
125
|
+
checked = opts[:block].call(item) if opts[:block]
|
126
|
+
check_box_tag "#{column}[]", item.public_send(opts.fetch(:value_method, :id)), checked, extract_check_box_tag_options(opts)
|
127
|
+
elsif opts[:radio]
|
128
|
+
radio_button_tag "#{column}[]", item.public_send(opts.fetch(:value_method, :id))
|
129
|
+
elsif opts[:block]
|
130
|
+
args = [item, nil].first(opts[:block].arity)
|
131
|
+
capture(*args, &opts[:block])
|
132
|
+
else
|
133
|
+
tmp = item.public_send(column)
|
134
|
+
tmp = item.public_send("#{column}_text") rescue tmp if tmp.is_a?(Symbol)
|
135
|
+
tmp
|
136
|
+
end
|
137
|
+
|
138
|
+
if config.use_entity_shortcuts && v.is_a?(ActiveRecord::Base)
|
139
|
+
btn = content_tag(:div, class: 'entity-shortcut') do
|
140
|
+
link_to(config.url_generator_proc.(v), class: 'btn btn-small') do
|
141
|
+
content_tag(:i, nil, class: 'icon-share')
|
142
|
+
end
|
143
|
+
end rescue nil
|
144
|
+
end
|
145
|
+
|
146
|
+
v = if v.is_a?(Enumerable)
|
147
|
+
v.inject(''.html_safe) { |b, i| b << ', ' unless b.blank?; b << i.format_for_output }
|
148
|
+
else
|
149
|
+
v.format_for_output
|
150
|
+
end
|
151
|
+
v = v.to_s unless v.nil? || v.is_a?(String)
|
152
|
+
|
153
|
+
v = ''.html_safe << btn << v if btn
|
154
|
+
|
155
|
+
content_tag(:td, v, extract_td_options(opts, item))
|
156
|
+
end
|
157
|
+
|
158
|
+
def extract_check_box_tag_options(opts)
|
159
|
+
valid_options = [:disabled]
|
160
|
+
opts.select { |k, _| valid_options.include?(k) }
|
161
|
+
end
|
162
|
+
|
163
|
+
def extract_td_options(opts, item)
|
164
|
+
retval = {}
|
165
|
+
retval[:class] = 'c' if opts[:align] == :center
|
166
|
+
|
167
|
+
if opts[:title]
|
168
|
+
retval[:title] = if opts[:title].respond_to?(:call)
|
169
|
+
opts[:title].call(item).format_for_output
|
170
|
+
else
|
171
|
+
opts[:title].format_for_output
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
retval
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
data/lib/html_tables/version.rb
CHANGED
data/lib/html_tables.rb
CHANGED
@@ -7,5 +7,6 @@ require 'html_tables/to_label'
|
|
7
7
|
require 'html_tables/format_for_output'
|
8
8
|
require 'html_tables/yielded_object'
|
9
9
|
require 'html_tables/data_table'
|
10
|
+
require 'html_tables/renderer'
|
10
11
|
require 'html_tables/data_table_helper'
|
11
12
|
require 'html_tables/railtie' if defined?(Rails::Railtie)
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html_tables
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fábio David Batista
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: actionpack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: railties
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: Simple DSL for HTML data tables
|
@@ -73,7 +73,7 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
76
|
+
- ".gitignore"
|
77
77
|
- CHANGELOG
|
78
78
|
- Gemfile
|
79
79
|
- LICENSE
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- lib/html_tables/data_table_helper.rb
|
87
87
|
- lib/html_tables/format_for_output.rb
|
88
88
|
- lib/html_tables/railtie.rb
|
89
|
+
- lib/html_tables/renderer.rb
|
89
90
|
- lib/html_tables/to_label.rb
|
90
91
|
- lib/html_tables/version.rb
|
91
92
|
- lib/html_tables/yielded_object.rb
|
@@ -98,17 +99,17 @@ require_paths:
|
|
98
99
|
- lib
|
99
100
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
101
|
requirements:
|
101
|
-
- -
|
102
|
+
- - ">="
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '0'
|
104
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
106
|
requirements:
|
106
|
-
- -
|
107
|
+
- - ">="
|
107
108
|
- !ruby/object:Gem::Version
|
108
109
|
version: '0'
|
109
110
|
requirements: []
|
110
111
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.2.1
|
112
113
|
signing_key:
|
113
114
|
specification_version: 4
|
114
115
|
summary: This gem was extracted from some projects on my company. Everyone is welcome
|