liquid-validations 1.0.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.
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ .DS_Store
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ .rbenv-version
20
+ *.db
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - 2.0
6
+ notifications:
7
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in liquid_validations.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ liquid-validations (1.0.1)
5
+ activerecord
6
+ liquid
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activemodel (3.2.12)
12
+ activesupport (= 3.2.12)
13
+ builder (~> 3.0.0)
14
+ activerecord (3.2.12)
15
+ activemodel (= 3.2.12)
16
+ activesupport (= 3.2.12)
17
+ arel (~> 3.0.2)
18
+ tzinfo (~> 0.3.29)
19
+ activesupport (3.2.12)
20
+ i18n (~> 0.6)
21
+ multi_json (~> 1.0)
22
+ arel (3.0.2)
23
+ builder (3.0.4)
24
+ i18n (0.6.4)
25
+ liquid (2.5.0)
26
+ minitest (4.6.2)
27
+ multi_json (1.6.1)
28
+ rake (10.0.3)
29
+ sqlite3 (1.3.7)
30
+ tzinfo (0.3.37)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ liquid-validations!
37
+ minitest
38
+ rake
39
+ sqlite3
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Big Cartel, LLC
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Liquid Validations [![Build Status](https://travis-ci.org/bigcartel/liquid-validations.png)](https://travis-ci.org/bigcartel/liquid-validations)
2
+
3
+ ActiveRecord style validations for Liquid content in your ActiveRecord models.
4
+
5
+ This gem makes 2 class methods available to your models:
6
+ * `validates_liquid_of` - Ensures that the liquid content is valid and has all opening/closing tags.
7
+ * `validates_presence_of_liquid_variable` - Useful to ensure your user content contains the specified Liquid variable(s).
8
+
9
+ ## Installation
10
+
11
+ `gem 'liquid-validations'` in your Gemfile.
12
+
13
+ Then `bundle install` and you should be all set.
14
+
15
+
16
+ ## Usage
17
+
18
+ In it's simplest form:
19
+
20
+ ``` ruby
21
+ class Article < ActiveRecord::Base
22
+ validates_liquid_of :content
23
+ validates_presence_of_liquid_variable :content, variable: 'very_important_variable'
24
+ end
25
+ ```
26
+
27
+ `validates_presence_of_liquid_variable` takes an optional `container` option like this:
28
+
29
+ ``` ruby
30
+ validates_presence_of_liquid_variable :content,
31
+ variable: 'head_content',
32
+ container: 'head' # <html><head>{{ head_content }}</head>...
33
+ ```
34
+
35
+ Which you may find useful for scoping. Or not.
36
+
37
+
38
+
39
+ Each of these methods make use of ActiveModel's underlying [`validates_each`](http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_each) method so any valid options passed in will be handed off.
40
+
41
+ A fully tricked out example would be:
42
+
43
+ ``` ruby
44
+ validates_liquid_of :content, :on => :create,
45
+ :message => 'is invalid liquid.',
46
+ :allow_nil => true,
47
+ :allow_blank => true,
48
+ :if => :needs_validation?,
49
+ :unless => Proc.new { |record| record.new_record? }
50
+ ```
51
+
52
+ Albeit, that's going a little overboard.
53
+
54
+
55
+ ## Compatibility
56
+
57
+ Liquid Validations has been tested (used) with the following:
58
+
59
+ #### Rails
60
+ * 2.3 and up
61
+ * 3
62
+
63
+ #### Ruby
64
+ * 1.8
65
+ * 1.9
66
+ * 2.0
67
+
68
+ That's not to say it won't work with Rails 1.2 or 4, but we haven't yet tested either of those.
69
+
70
+ ## What about Sinatra
71
+
72
+ This *should* work outside of Rails as long as your models are using ActiveRecord as the database mapper. However, this is just in theory, and hasn't been tested yet.
73
+
74
+
75
+ ## Contributing
76
+
77
+ If you do find that something is busted, or think improvements can be made
78
+
79
+ * Fork it
80
+ * Create a topic branch - `git checkout -b fix_rails_1-0`
81
+ * Push to your branch - `git push origin fix_rails_1-0`
82
+ * Create a Pull Request from your branch
83
+
84
+ That's it!
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+ task :default => :test
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.verbose = true
8
+ t.libs << "spec"
9
+ t.libs << "lib"
10
+ t.test_files = FileList['spec/**/*_spec.rb']
11
+ end
@@ -0,0 +1,56 @@
1
+ require 'liquid-validations/version'
2
+
3
+ module LiquidValidations
4
+ def validates_liquid_of(*attr_names)
5
+ configuration = { :message => I18n.translate('activerecord.errors.messages')[:invalid] }
6
+ configuration.update(attr_names.extract_options!)
7
+
8
+ validates_each attr_names, configuration do |record, attr_name, value|
9
+ errors = []
10
+
11
+ begin
12
+ template = Liquid::Template.parse(value.to_s)
13
+ errors += template.errors
14
+ rescue Exception => e
15
+ errors << e.message
16
+ end
17
+
18
+ for error in errors
19
+ record.errors.add(attr_name, friendly_liquid_error(error))
20
+ end
21
+ end
22
+ end
23
+
24
+ def validates_presence_of_liquid_variable(*attr_names)
25
+ configuration = { :message => I18n.translate('activerecord.errors.messages')[:invalid], :variable => nil, :container => nil }
26
+ configuration.update(attr_names.extract_options!)
27
+
28
+ raise(ArgumentError, "You must supply a variable to check for") if configuration[:variable].blank?
29
+
30
+ validates_each attr_names, configuration do |record, attr_name, value|
31
+ value = value.to_s
32
+ variable = configuration[:variable].to_s
33
+ variable_re = /\{\{\s*#{ variable }( .*)?\}\}/
34
+ container = configuration[:container].to_s
35
+ container_re = /<\s*#{ container }.*>.*#{ variable_re }.*<\/\s*#{ container }\s*>/im
36
+
37
+ if container.blank? && !(value =~ variable_re)
38
+ record.errors.add(attr_name, "You must include {{ #{ variable } }} in your #{ friendly_attr_name(attr_name) }")
39
+ elsif !container.blank? && !(value =~ container_re)
40
+ record.errors.add(attr_name, "You must include {{ #{ variable } }} inside the <#{ container }> tag of your #{ friendly_attr_name(attr_name) }")
41
+ end
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def friendly_attr_name(attr_name)
48
+ attr_name.to_s.humanize.downcase
49
+ end
50
+
51
+ def friendly_liquid_error(error)
52
+ error.gsub(/liquid/i, '').gsub(/terminated with regexp:.+/, 'closed')
53
+ end
54
+ end
55
+
56
+ ActiveRecord::Base.extend(LiquidValidations)
@@ -0,0 +1,3 @@
1
+ module LiquidValidations
2
+ VERSION = '1.0.1'
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'liquid-validations/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'liquid-validations'
8
+ gem.version = LiquidValidations::VERSION
9
+ gem.authors = ['Matt Wigham', 'Joshua Abbott']
10
+ gem.email = ['dev@bigcartel.com']
11
+ gem.description = %q{ ActiveRecord style validations for Liquid content in your ActiveRecord models. See the README to get the lowdown. }
12
+ gem.summary = %q{ ActiveRecord style validations for Liquid content in your ActiveRecord models. }
13
+ gem.homepage = 'https://github.com/bigcartel/liquid-validations'
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency 'liquid'
22
+ gem.add_dependency 'activerecord'
23
+ gem.add_development_dependency 'rake'
24
+ gem.add_development_dependency 'sqlite3'
25
+ gem.add_development_dependency 'minitest'
26
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ class Mixin < ActiveRecord::Base
4
+ end
5
+
6
+ describe LiquidValidations do
7
+ it 'should provide the validates_liquid_of method to ActiveRecord subclasses' do
8
+ Mixin.must_respond_to(:validates_liquid_of)
9
+ end
10
+
11
+ it 'should provide the validates_presence_of_liquid_variable method to ActiveRecord subclasses' do
12
+ Mixin.must_respond_to(:validates_presence_of_liquid_variable)
13
+ end
14
+
15
+ describe '.validates_liquid_of' do
16
+ before do
17
+ Mixin.instance_eval do
18
+ validates_liquid_of :content
19
+ end
20
+
21
+ @mixin = Mixin.new
22
+ end
23
+
24
+ [ ' {{ Bad liquid ',
25
+ ' {% Bad liquid ',
26
+ '{% for %}{% endfor' ].each do |bad_liquid|
27
+ it "the record should be invalid when there is a liquid parsing error for #{ bad_liquid }" do
28
+ @mixin.content = bad_liquid
29
+ @mixin.valid?.must_equal false
30
+ end
31
+ end
32
+
33
+ it 'should include the errors in the errors object' do
34
+ @mixin.content = '{{ unclosed variable '
35
+ @mixin.valid?
36
+ @mixin.errors.must_include(:content)
37
+ end
38
+ end
39
+
40
+ describe '.validates_presence_of_liquid_variable' do
41
+ before do
42
+ Mixin.instance_eval do
43
+ validates_presence_of_liquid_variable :content, :variable => 'josh_is_awesome'
44
+ end
45
+
46
+ @mixin = Mixin.new
47
+ end
48
+
49
+ it 'must be configured properly' do
50
+ proc { Mixin.instance_eval { validates_presence_of_liquid_variable :content } }.must_raise ArgumentError
51
+ end
52
+
53
+ it 'the record should be invalid when the specified variable is not present' do
54
+ @mixin.content = '{{ josh_is_not_awesome }}'
55
+ @mixin.valid?.must_equal false
56
+ end
57
+
58
+ it 'should include the errors in the errors object' do
59
+ @mixin.content = '{{ josh_is_not_awesome }}'
60
+ @mixin.valid?
61
+ @mixin.errors.must_include(:content)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,40 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'rubygems'
4
+ require 'active_record'
5
+ require 'liquid'
6
+ require 'liquid-validations'
7
+ require 'minitest/spec'
8
+ require 'minitest/autorun'
9
+ require 'minitest/pride'
10
+
11
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :dbfile => ':memory:', :database => 'liquid_validations_test.db')
12
+
13
+ ActiveRecord::Migration.verbose = false
14
+
15
+ def setup_db
16
+ ActiveRecord::Schema.define(:version => 1) do
17
+ create_table :mixins do |t|
18
+ t.column :content, :text
19
+ t.column :created_at, :datetime
20
+ t.column :updated_at, :datetime
21
+ end
22
+ end
23
+ end
24
+
25
+ def teardown_db
26
+ ActiveRecord::Base.connection.tables.each do |table|
27
+ ActiveRecord::Base.connection.drop_table(table)
28
+ end
29
+ end
30
+
31
+ class MiniTest::Spec
32
+ before do
33
+ setup_db
34
+ end
35
+
36
+ after do
37
+ teardown_db
38
+ end
39
+ end
40
+
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: liquid-validations
3
+ version: !ruby/object:Gem::Version
4
+ hash: 21
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 1
10
+ version: 1.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Matt Wigham
14
+ - Joshua Abbott
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2013-03-11 00:00:00 -06:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: liquid
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: activerecord
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rake
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ type: :development
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: sqlite3
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ type: :development
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: minitest
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ type: :development
91
+ version_requirements: *id005
92
+ description: " ActiveRecord style validations for Liquid content in your ActiveRecord models. See the README to get the lowdown. "
93
+ email:
94
+ - dev@bigcartel.com
95
+ executables: []
96
+
97
+ extensions: []
98
+
99
+ extra_rdoc_files: []
100
+
101
+ files:
102
+ - .gitignore
103
+ - .travis.yml
104
+ - Gemfile
105
+ - Gemfile.lock
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - lib/liquid-validations.rb
110
+ - lib/liquid-validations/version.rb
111
+ - liquid-validations.gemspec
112
+ - spec/liquid_validations_spec.rb
113
+ - spec/spec_helper.rb
114
+ has_rdoc: true
115
+ homepage: https://github.com/bigcartel/liquid-validations
116
+ licenses:
117
+ - MIT
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
140
+ version: "0"
141
+ requirements: []
142
+
143
+ rubyforge_project:
144
+ rubygems_version: 1.6.2
145
+ signing_key:
146
+ specification_version: 3
147
+ summary: ActiveRecord style validations for Liquid content in your ActiveRecord models.
148
+ test_files:
149
+ - spec/liquid_validations_spec.rb
150
+ - spec/spec_helper.rb