data_attributes 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 13d87816eec1c6d0c9d3f23f54b26d9029104de8
4
+ data.tar.gz: ba5bf26281792856d44f9abc2e259ee21fa9fd62
5
+ SHA512:
6
+ metadata.gz: 37de7c74094ec28ec7d84c56a2e6a4376d0dbf965e0d9df960e96df0c74698c378439b710028d28082dae48fd65cc1f8714b0d5239f37c6cf043dec1450a0c81
7
+ data.tar.gz: b12317c608492d08a89adc4fd7024ec7c17fad9c55f74eb688af66181bb5a8e76f49f37bebbdcb39bf84fd6309c4c478af30ba4e389b3d4d81152a54ad1cdde3
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.swp
2
+ .DS_Store
3
+ /.bundle/
4
+ /.byebug_history
5
+ /.ruby-version
6
+ /Gemfile.lock
7
+ /pkg/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --order random
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2017 Alexis Toulotte
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.mdown ADDED
@@ -0,0 +1,75 @@
1
+ # DataAttributes
2
+
3
+ Convenience helpers to provide [HTML data attributes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes)
4
+ from model to view.
5
+
6
+ ## Setup
7
+
8
+ Just add this into your `Gemfile`:
9
+
10
+ ```ruby
11
+ gem 'data_attributes'
12
+ ```
13
+
14
+ If you want to take benefits of `content_tag_for` and `div_for` methods, add
15
+ also [record_tag_helper](https://rubygems.org/gems/record_tag_helper) into
16
+ your `Gemfile`:
17
+
18
+ ```ruby
19
+ gem 'record_tag_helper'
20
+ ```
21
+
22
+ Then, just run a `bundle install`.
23
+
24
+ ## Usage
25
+
26
+ In your model just add `DataAttributes::Model` mixin:
27
+
28
+ ```ruby
29
+ class Article
30
+
31
+ include DataAttributes::Model
32
+
33
+ end
34
+ ```
35
+
36
+ Then, you can define you model's data attributes that are included into view:
37
+
38
+ ```ruby
39
+ class Article
40
+
41
+ include DataAttributes::Model
42
+
43
+ data_attribute :id, :title
44
+
45
+ end
46
+ ```
47
+
48
+ Then you must add `DataAttribute::View` into Rails `ApplicationHelper`:
49
+
50
+ ```ruby
51
+ module ApplicationHelper
52
+
53
+ include DataAttribute::View
54
+
55
+ end
56
+ ```
57
+
58
+ Then `content_tag_for` and `div_for` methods from [record_tag_helper](https://rubygems.org/gems/record_tag_helper)
59
+ gem will add model's data attributes into view:
60
+
61
+ ```erb
62
+ <%= div_for @article do %>
63
+ <!-- <div class="article" data-id="42" data-title="Hello!"> -->
64
+ ```
65
+
66
+ You can also pass data attributes directly to `content_tag` method:
67
+
68
+ ```erb
69
+ <%= content_tag :div, id: 'articles', data: { count: 28 } do %>
70
+ ```
71
+
72
+ ## Executing test suite
73
+
74
+ This project is fully tested with [Rspec 3](http://github.com/rspec/rspec).
75
+ Just run `bundle exec rake` (after a `bundle install`).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ desc 'Default: runs specs.'
7
+ task default: :spec
8
+
9
+ desc 'Run all specs in spec directory.'
10
+ RSpec::Core::RakeTask.new(:spec)
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,24 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'data_attributes'
3
+ s.version = File.read("#{File.dirname(__FILE__)}/VERSION").strip
4
+ s.platform = Gem::Platform::RUBY
5
+ s.author = 'Alexis Toulotte'
6
+ s.email = 'al@alweb.org'
7
+ s.homepage = 'https://github.com/alexistoulotte/data_attributes'
8
+ s.summary = 'Helpers for HTML data attributes'
9
+ s.description = 'Convenience helpers to provide HTML data attributes from model to view'
10
+ s.license = 'MIT'
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.require_paths = ['lib']
16
+
17
+ s.required_ruby_version = '>= 2.0.0'
18
+
19
+ s.add_dependency 'activesupport', '>= 4.1.0', '< 6.0.0'
20
+
21
+ s.add_development_dependency 'byebug', '>= 9.0.0', '< 10.0.0'
22
+ s.add_development_dependency 'rake', '>= 12.0.0', '< 13.0.0'
23
+ s.add_development_dependency 'rspec', '>= 3.5.0', '< 3.6.0'
24
+ end
@@ -0,0 +1,45 @@
1
+ module DataAttributes
2
+
3
+ module Model
4
+
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+
9
+ def data_attribute(*attributes)
10
+ attributes = (__data_attributes + attributes).flatten.map(&:to_sym).uniq
11
+ class_eval(%Q{
12
+ class << self
13
+ private
14
+
15
+ def __data_attributes
16
+ #{attributes.inspect}
17
+ end
18
+ end
19
+ })
20
+ end
21
+
22
+ def data_attributes
23
+ super_attributes = superclass && superclass.respond_to?(:__data_attributes, true) ? superclass.send(:__data_attributes) : []
24
+ (super_attributes + __data_attributes).uniq.sort
25
+ end
26
+
27
+ private
28
+
29
+ def __data_attributes
30
+ []
31
+ end
32
+
33
+ end
34
+
35
+ def data_attributes
36
+ {}.tap do |attributes|
37
+ self.class.data_attributes.each do |attribute|
38
+ attributes[attribute] = send(attribute) if respond_to?(attribute, true)
39
+ end
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,55 @@
1
+ module DataAttributes
2
+
3
+ module View
4
+
5
+ def content_tag_for_single_record(tag_name, record, prefix, options, &block)
6
+ options, prefix = prefix, nil if prefix.is_a?(Hash)
7
+ options ||= {}
8
+ options[:data] ||= {}
9
+ options[:data].reverse_merge!(record.data_attributes) if record.is_a?(DataAttributes::Model)
10
+ options.reverse_merge!(class: record.class.model_name.singular.dasherize)
11
+ if block.arity == 0
12
+ content_tag(tag_name, capture(&block), options)
13
+ else
14
+ content_tag(tag_name, capture(record, &block), options)
15
+ end
16
+ end
17
+
18
+ def data_attribute_value(value, options = {})
19
+ if value.is_a?(String) || value.is_a?(Symbol)
20
+ options[:prefix_strings] ? "string:#{value}" : value.to_s
21
+ elsif value.is_a?(Numeric)
22
+ value
23
+ elsif value.nil?
24
+ nil
25
+ elsif value.is_a?(Time)
26
+ value.to_i
27
+ elsif value.is_a?(Date)
28
+ value.strftime('%Y/%m/%d')
29
+ elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
30
+ options[:raw] ? value : value.to_s
31
+ elsif value.is_a?(Array)
32
+ value = value.map { |v| data_attribute_value(v, options.merge(raw: true)) }
33
+ options[:raw] ? value : value.to_json
34
+ elsif value.is_a?(Hash)
35
+ value = value.each_with_object({}) { |(k, v), hash| hash[k.to_s.gsub(/^_+/, '').gsub(/\?$/, '').camelize(:lower)] = data_attribute_value(v, options.merge(raw: true)) }
36
+ options[:raw] ? value : value.to_json
37
+ elsif value.is_a?(DataAttributes::Model)
38
+ data_attribute_value(value.data_attributes, options)
39
+ else
40
+ raise "Can't convert object of class #{value.class} in data attributes"
41
+ end
42
+ end
43
+
44
+ def tag_options(options, escape = true)
45
+ (options.delete(:data) || options.delete('data') || {}).each do |key, value|
46
+ value = data_attribute_value(value)
47
+ value = html_escape(value) if escape
48
+ options["data-#{key.to_s.gsub(/^_+/, '').gsub(/\?$/, '').dasherize}"] = value
49
+ end
50
+ super
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,8 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/inflector'
3
+ require 'active_support/json'
4
+
5
+ lib_path = "#{__dir__}/data_attributes"
6
+
7
+ require "#{lib_path}/model"
8
+ require "#{lib_path}/view"
@@ -0,0 +1,27 @@
1
+ require File.expand_path("#{__dir__}/../lib/data_attributes")
2
+ require 'byebug'
3
+
4
+ # Support
5
+ require "#{__dir__}/support/mocks/content"
6
+ require "#{__dir__}/support/mocks/category"
7
+ require "#{__dir__}/support/mocks/article"
8
+ require "#{__dir__}/support/mocks/view"
9
+
10
+ RSpec.configure do |config|
11
+ config.raise_errors_for_deprecations!
12
+
13
+ config.before(:each) do
14
+ [Article, Category, Content].each do |mock_class|
15
+ next unless mock_class.respond_to?(:__data_attributes, true)
16
+ mock_class.class_eval(%Q{
17
+ class << self
18
+ private
19
+
20
+ def __data_attributes
21
+ []
22
+ end
23
+ end
24
+ })
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataAttributes::Model do
4
+
5
+ describe '.data_attribute' do
6
+
7
+ it 'adds given attributes to data attributes' do
8
+ expect {
9
+ Article.data_attribute(:id)
10
+ }.to change { Article.data_attributes }.from([]).to([:id])
11
+ end
12
+
13
+ it 'removes doubloons' do
14
+ Article.data_attribute(:id)
15
+ expect {
16
+ Article.data_attribute(:id)
17
+ }.not_to change { Article.data_attributes }
18
+ expect(Article.send(:__data_attributes)).to eq([:id])
19
+ end
20
+
21
+ it 'removes doubloons (if given as string)' do
22
+ Article.data_attribute(:id)
23
+ expect {
24
+ Article.data_attribute('id')
25
+ }.not_to change { Article.data_attributes }
26
+ expect(Article.send(:__data_attributes)).to eq([:id])
27
+ end
28
+
29
+ it 'converts attributes to symbols' do
30
+ Article.data_attribute('id')
31
+ expect(Article.data_attributes).to eq([:id])
32
+ end
33
+
34
+ it 'accepts arrays' do
35
+ Article.data_attribute(['id', ['category']], :body)
36
+ expect(Article.data_attributes).to eq([:body, :category, :id])
37
+ end
38
+
39
+ end
40
+
41
+ describe '.__data_attributes' do
42
+
43
+ it 'is a private method' do
44
+ expect(Article.respond_to?(:__data_attributes)).to be(false)
45
+ expect(Article.respond_to?(:__data_attributes, true)).to be(true)
46
+ end
47
+
48
+ it 'is a private method even after a call to .data_attribute' do
49
+ Article.data_attribute(:id)
50
+ expect(Article.respond_to?(:__data_attributes)).to be(false)
51
+ expect(Article.respond_to?(:__data_attributes, true)).to be(true)
52
+ end
53
+
54
+ end
55
+
56
+ describe '.data_attributes' do
57
+
58
+ it 'is an empty array by default' do
59
+ expect(Article.data_attributes).to eq([])
60
+ end
61
+
62
+ it "can't be changed" do
63
+ Article.data_attribute(:id)
64
+ expect {
65
+ Article.data_attributes.clear
66
+ }.not_to change { Article.data_attribute }
67
+ end
68
+
69
+ it 'is correct with subclasses' do
70
+ Content.data_attribute(:body, :id)
71
+ expect(Content.data_attributes).to eq([:body, :id])
72
+ expect(Article.data_attributes).to eq([:body, :id])
73
+
74
+ Article.data_attribute(:title)
75
+ expect(Content.data_attributes).to eq([:body, :id])
76
+ expect(Article.data_attributes).to eq([:body, :id, :title])
77
+ end
78
+
79
+ it 'removes doubloons with subclasses' do
80
+ Content.data_attribute(:body, :id)
81
+ expect(Article.data_attributes).to eq([:body, :id])
82
+ Article.data_attribute(:title, :id, :body)
83
+ expect(Article.data_attributes).to eq([:body, :id, :title])
84
+ end
85
+
86
+ it 'is sorted' do
87
+ Article.data_attribute(:id, :body)
88
+ expect(Article.data_attributes).to eq([:body, :id])
89
+ end
90
+
91
+ it 'is sorted with subclasses' do
92
+ Content.data_attribute(:bar, :foo)
93
+ Article.data_attribute(:body)
94
+ expect(Article.data_attributes).to eq([:bar, :body, :foo])
95
+ end
96
+
97
+ end
98
+
99
+ describe '#data_attributes' do
100
+
101
+ it 'returns an hash of instance data attributes' do
102
+ Article.data_attribute(:id, :body)
103
+ article = Article.new
104
+ article.body = 'This is the body'
105
+ article.id = 42
106
+ expect(article.data_attributes).to eq({ body: 'This is the body', id: 42 })
107
+ end
108
+
109
+ it 'does not fail if method does not exist' do
110
+ Article.data_attribute(:id, :foo)
111
+ article = Article.new
112
+ article.id = 42
113
+ expect(article.data_attributes).to eq({ id: 42 })
114
+ end
115
+
116
+ it 'does not fail if method is private' do
117
+ Article.data_attribute(:published)
118
+ article = Article.new
119
+ article.published = true
120
+ expect(article.data_attributes).to eq({ published: true })
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,178 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataAttributes::View do
4
+
5
+ let(:view) { View.new }
6
+
7
+ describe '#data_attribute_value' do
8
+
9
+ it 'raise an error if given object is not supported' do
10
+ expect {
11
+ view.data_attribute_value(Object.new)
12
+ }.to raise_error("Can't convert object of class Object in data attributes")
13
+ end
14
+
15
+ context 'with string' do
16
+
17
+ it 'returns given value' do
18
+ expect(view.data_attribute_value('hello world')).to eq('hello world')
19
+ end
20
+
21
+ it 'accepts :prefix_strings option' do
22
+ expect(view.data_attribute_value('hello world', prefix_strings: true)).to eq('string:hello world')
23
+ expect(view.data_attribute_value('hello world', prefix_strings: false)).to eq('hello world')
24
+ end
25
+
26
+ end
27
+
28
+ context 'with symbol' do
29
+
30
+ it 'returns given value' do
31
+ expect(view.data_attribute_value(:hello)).to eq('hello')
32
+ end
33
+
34
+ it 'accepts :prefix_strings option' do
35
+ expect(view.data_attribute_value(:hello, prefix_strings: true)).to eq('string:hello')
36
+ expect(view.data_attribute_value(:hello, prefix_strings: false)).to eq('hello')
37
+ end
38
+
39
+ end
40
+
41
+ context 'with integer' do
42
+
43
+ it 'returns given value' do
44
+ expect(view.data_attribute_value(42)).to eq(42)
45
+ end
46
+
47
+ end
48
+
49
+ context 'with float' do
50
+
51
+ it 'returns given value' do
52
+ expect(view.data_attribute_value(42.28)).to eq(42.28)
53
+ end
54
+
55
+ end
56
+
57
+ context 'with nil' do
58
+
59
+ it 'returns nil' do
60
+ expect(view.data_attribute_value(nil)).to be(nil)
61
+ end
62
+
63
+ end
64
+
65
+ context 'with Time' do
66
+
67
+ it 'returns time as integer' do
68
+ expect(view.data_attribute_value(Time.new(2017, 2, 10, 4, 1, 2))).to eq(1486659662)
69
+ end
70
+
71
+ end
72
+
73
+ context 'with true' do
74
+
75
+ it 'returns "true"' do
76
+ expect(view.data_attribute_value(true)).to eq('true')
77
+ end
78
+
79
+ it 'accepts :raw option' do
80
+ expect(view.data_attribute_value(true, raw: true)).to eq(true)
81
+ end
82
+
83
+ end
84
+
85
+ context 'with false' do
86
+
87
+ it 'returns "false"' do
88
+ expect(view.data_attribute_value(false)).to eq('false')
89
+ end
90
+
91
+ it 'accepts :raw option' do
92
+ expect(view.data_attribute_value(false, raw: true)).to eq(false)
93
+ end
94
+
95
+ end
96
+
97
+ context 'with array' do
98
+
99
+ it 'returns array as JSON' do
100
+ expect(view.data_attribute_value([42, :bam, true, Time.new(2017, 2, 10, 4, 1, 2)])).to eq('[42,"bam",true,1486659662]')
101
+ end
102
+
103
+ it 'accepts :prefix_strings option' do
104
+ expect(view.data_attribute_value([42, :bam, true, Time.new(2017, 2, 10, 4, 1, 2)], prefix_strings: true)).to eq('[42,"string:bam",true,1486659662]')
105
+ end
106
+
107
+ it 'is correct with arrays of arrays' do
108
+ expect(view.data_attribute_value([42, [:bam, true]])).to eq('[42,["bam",true]]')
109
+ end
110
+
111
+ it 'is correct with arrays of hashes' do
112
+ expect(view.data_attribute_value([44, { '_category_id?' => 28 }])).to eq('[44,{"categoryId":28}]')
113
+ end
114
+
115
+ end
116
+
117
+ context 'with hash' do
118
+
119
+ it 'returns hash as JSON' do
120
+ expect(view.data_attribute_value({ id: 42, 'message' => :bam, date: Time.new(2017, 2, 10, 4, 1, 2), valid: true })).to eq('{"id":42,"message":"bam","date":1486659662,"valid":true}')
121
+ end
122
+
123
+ it 'accepts :prefix_strings option' do
124
+ expect(view.data_attribute_value({ id: 42, 'message' => :bam, date: Time.new(2017, 2, 10, 4, 1, 2), valid: true }, prefix_strings: true)).to eq('{"id":42,"message":"string:bam","date":1486659662,"valid":true}')
125
+ end
126
+
127
+ it 'converts keys correctly' do
128
+ expect(view.data_attribute_value({ '_category_id?' => 28 })).to eq('{"categoryId":28}')
129
+ end
130
+
131
+ end
132
+
133
+ context 'with a date' do
134
+
135
+ it 'returns date formatted' do
136
+ expect(view.data_attribute_value(Date.new(2017, 4, 27))).to eq('2017/04/27')
137
+ end
138
+
139
+ end
140
+
141
+ context 'with a data attributes model' do
142
+
143
+ it 'returns hash of attributes as JSON' do
144
+ Article.data_attribute(:id, :body)
145
+ article = Article.new
146
+ article.body = 'This is the body'
147
+ article.id = 28
148
+ expect(view.data_attribute_value(article)).to eq('{"body":"This is the body","id":28}')
149
+ end
150
+
151
+ it 'accepts :prefix_strings option' do
152
+ Article.data_attribute(:id, :body)
153
+ article = Article.new
154
+ article.body = 'This is the body'
155
+ article.id = 28
156
+ expect(view.data_attribute_value(article, prefix_strings: true)).to eq('{"body":"string:This is the body","id":28}')
157
+ end
158
+
159
+ it 'is correct with a nested data attributes object' do
160
+ Article.data_attribute(:id, :body, :category)
161
+ Category.data_attribute(:id, :title)
162
+
163
+ category = Category.new
164
+ category.id = 20
165
+ category.title = 'Books'
166
+
167
+ article = Article.new
168
+ article.body = 'This is the body'
169
+ article.category = category
170
+
171
+ expect(view.data_attribute_value(article)).to eq('{"body":"This is the body","category":{"id":20,"title":"Books"},"id":null}')
172
+ end
173
+
174
+ end
175
+
176
+ end
177
+
178
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path("#{__dir__}/../lib/data_attributes")
2
+ require 'byebug'
3
+
4
+ # Support
5
+ require "#{__dir__}/support/mocks/content"
6
+ require "#{__dir__}/support/mocks/article"
7
+ require "#{__dir__}/support/mocks/category"
8
+ require "#{__dir__}/support/mocks/view"
9
+
10
+ RSpec.configure do |config|
11
+ config.raise_errors_for_deprecations!
12
+
13
+ config.before(:each) do
14
+ [Article, Category, Content].each do |mock_class|
15
+ mock_class.class_eval(%Q{
16
+ class << self
17
+ private
18
+
19
+ def __data_attributes
20
+ []
21
+ end
22
+ end
23
+ })
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ class Article < Content
2
+
3
+ attr_accessor :category, :created_at, :published_on, :title
4
+
5
+ def published=(value)
6
+ @published = value
7
+ end
8
+
9
+ private
10
+
11
+ def published
12
+ @published
13
+ end
14
+
15
+ end
@@ -0,0 +1,7 @@
1
+ class Category
2
+
3
+ include DataAttributes::Model
4
+
5
+ attr_accessor :id, :title
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ class Content
2
+
3
+ include DataAttributes::Model
4
+
5
+ attr_accessor :body, :id
6
+
7
+ end
@@ -0,0 +1,5 @@
1
+ class View
2
+
3
+ include DataAttributes::View
4
+
5
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: data_attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexis Toulotte
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 6.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 4.1.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 6.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: byebug
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 9.0.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 10.0.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 9.0.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 10.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 12.0.0
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: 13.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 12.0.0
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: 13.0.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: rspec
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 3.5.0
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.6.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 3.5.0
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 3.6.0
93
+ description: Convenience helpers to provide HTML data attributes from model to view
94
+ email: al@alweb.org
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - ".gitignore"
100
+ - ".rspec"
101
+ - Gemfile
102
+ - MIT-LICENSE
103
+ - README.mdown
104
+ - Rakefile
105
+ - VERSION
106
+ - data_attributes.gemspec
107
+ - lib/data_attributes.rb
108
+ - lib/data_attributes/model.rb
109
+ - lib/data_attributes/view.rb
110
+ - lib/spec_helper.rb
111
+ - spec/data_attributes/model_spec.rb
112
+ - spec/data_attributes/view_spec.rb
113
+ - spec/spec_helper.rb
114
+ - spec/support/mocks/article.rb
115
+ - spec/support/mocks/category.rb
116
+ - spec/support/mocks/content.rb
117
+ - spec/support/mocks/view.rb
118
+ homepage: https://github.com/alexistoulotte/data_attributes
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 2.0.0
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.5.2
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Helpers for HTML data attributes
142
+ test_files:
143
+ - spec/data_attributes/model_spec.rb
144
+ - spec/data_attributes/view_spec.rb
145
+ - spec/spec_helper.rb
146
+ - spec/support/mocks/article.rb
147
+ - spec/support/mocks/category.rb
148
+ - spec/support/mocks/content.rb
149
+ - spec/support/mocks/view.rb