valle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ branches:
6
+ only:
7
+ - master
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in valle.gemspec
4
+ gemspec
5
+
6
+ gem 'rails', '~> 3.2.0'
7
+
8
+ gem 'rake'
9
+ gem 'minitest'
10
+ gem 'guard-minitest'
11
+ gem 'turn'
12
+ gem 'cucumber', '~> 1.0.0'
13
+ gem 'aruba'
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'minitest', test_folders: "test" do
5
+ # with Minitest::Unit
6
+ watch(%r|^test/(.*)\/?test_(.*)\.rb|)
7
+ watch(%r|^test/(.*)\/?(.*)_test\.rb|)
8
+ watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
9
+ watch(%r|^test/test_helper\.rb|) { "test" }
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Anton Kalyaev
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,70 @@
1
+ # Valle [![Build Status](https://secure.travis-ci.org/kaize/valle.png "Build Status")](http://travis-ci.org/kaize/valle) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/kaize/valle)
2
+
3
+ Valle adds validators to all the fields of your ActiveRecord models,
4
+ so you should not think that string length or ID value exceeds the permissible limits.
5
+
6
+ For example, maximum length of the string in PostgreSQL is 255. We will
7
+ setup the following validator for you, so you don't need to write it by
8
+ hands.
9
+
10
+ validates :field_name, length: { maximum: 255 }
11
+
12
+ Note: If you do not do this (and usually you are) and try to enter 2147483648 into the field with type: `interger` (see [Numeric types](http://www.postgresql.org/docs/9.2/static/datatype-numeric.html) section of PostgreSQL docs), you will get 500 error.
13
+
14
+ Example:
15
+
16
+ PG::Error: ERROR: value "2147483648" is out of range for type integer
17
+ : SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1
18
+
19
+ There is a simular gem, called [validates_lengths_from_database](http://github.com/rubiety/validates_lengths_from_database). It solves only one part -
20
+ applicable to strings. This gem is designed to work with all possible field types.
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ gem 'valle'
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install valle
35
+
36
+ ## Usage
37
+
38
+ By default, this gem adds validators to all your ActiveRecord models.
39
+ This means that, basically, you don't need to tweak it.
40
+
41
+ However, you could tell him directly what models it should take into account by adding `config/initializers/valle.rb`:
42
+
43
+ Valle.configure do |config|
44
+ config.models = %w(User, Post)
45
+ end
46
+
47
+ Also, you should be able to turn it off temporary by setting `enabled` option to `false`.
48
+
49
+ Valle.configure do |config|
50
+ config.enabled = false
51
+ end
52
+
53
+ ## Contributing
54
+
55
+ 1. Fork it
56
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
57
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
58
+ 4. Run test suite (`rake test_suite`)
59
+ 5. Push to the branch (`git push origin my-new-feature`)
60
+ 6. Create new Pull Request
61
+
62
+ ## Core team
63
+
64
+ - [Anton Kalyaev](http://github.com/akalyaev)
65
+ - [Andrew Kulakov](http://github.com/Andrew8xx8)
66
+ - [Alexander Kirillov](http://github.com/saratovsource)
67
+
68
+ ## License
69
+
70
+ Valle is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+ require 'cucumber/rake/task'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/lib/*_test.rb']
9
+ t.verbose = true
10
+ end
11
+
12
+ Cucumber::Rake::Task.new(:cucumber) do |t|
13
+ t.fork = true
14
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
15
+ end
16
+
17
+ task test_suite: [:test, :cucumber]
18
+
19
+ task default: :test_suite
@@ -0,0 +1,48 @@
1
+ Feature: adds validators
2
+ Background:
3
+ When I successfully run `bundle exec rails new testapp`
4
+ And I cd to "testapp"
5
+ And I add "factory_girl_rails" as a dependency
6
+ And I add "valle" from this project as a dependency
7
+ When I successfully run `bundle install`
8
+ And I write to "db/migrate/1_create_users.rb" with:
9
+ """
10
+ class CreateUsers < ActiveRecord::Migration
11
+ def self.up
12
+ create_table :users do |t|
13
+ t.string :name
14
+ end
15
+ end
16
+ end
17
+ """
18
+ When I successfully run `bundle exec rake db:migrate --trace`
19
+ And I write to "app/models/user.rb" with:
20
+ """
21
+ class User < ActiveRecord::Base
22
+ end
23
+ """
24
+
25
+ @disable-bundler
26
+ Scenario: generate a rails 3 application and use factory definitions
27
+ When I write to "test/factories.rb" with:
28
+ """
29
+ FactoryGirl.define do
30
+ factory :user do
31
+ name "John"
32
+ end
33
+ end
34
+ """
35
+ When I write to "test/unit/user_test.rb" with:
36
+ """
37
+ require 'test_helper'
38
+
39
+ class UserTest < ActiveSupport::TestCase
40
+ test "should not save user when name is too long" do
41
+ user = FactoryGirl.create(:user)
42
+ user.name = 'a' * 256
43
+ assert !user.save
44
+ end
45
+ end
46
+ """
47
+ When I successfully run `bundle exec rake test --trace`
48
+ Then the output should contain "1 tests, 1 assertions, 0 failures, 0 errors"
@@ -0,0 +1,7 @@
1
+ When /^I add "([^"]+)" from this project as a dependency$/ do |gem_name|
2
+ append_to_file('Gemfile', %{gem "#{gem_name}", :path => "#{PROJECT_ROOT}"\n})
3
+ end
4
+
5
+ When /^I add "([^"]+)" as a dependency$/ do |gem_name|
6
+ append_to_file('Gemfile', %{gem "#{gem_name}"\n})
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'aruba/cucumber'
2
+
3
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze
4
+
5
+ Before do
6
+ @aruba_timeout_seconds = 3600
7
+ end
@@ -0,0 +1,36 @@
1
+ module Valle
2
+
3
+ Bound = Struct.new :minimum, :maximum
4
+
5
+ class BoundMapper
6
+
7
+ ##
8
+ # Returns a new bound for the column
9
+ #
10
+ # @param [Column] column the column
11
+ #
12
+ def bound(column)
13
+ Bound.new minimum(column), maximum(column)
14
+ end
15
+
16
+ private
17
+
18
+ ##
19
+ # Get the lower limit for a given column
20
+ #
21
+ # @param [Column] column the column
22
+ #
23
+ def minimum(column)
24
+
25
+ end
26
+
27
+ ##
28
+ # Get the upper limit for a given column
29
+ #
30
+ # @param [Column] column the column
31
+ #
32
+ def maximum(column)
33
+ column.limit
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module Valle
2
+ class BoundsManager
3
+
4
+ class << self
5
+
6
+ ##
7
+ # Add validators for all columns of a given class
8
+ #
9
+ # 2 steps:
10
+ # 1) get bound for the column
11
+ # 2) set validation
12
+ #
13
+ # @param [ActiveRecord::Base] klass the AR model class
14
+ #
15
+ def add_validators(klass)
16
+ mapper = BoundMapper.new
17
+
18
+ columns = klass.columns
19
+ columns.each do |column|
20
+ bound = mapper.bound(column)
21
+ ValidationSetter.add_validator(bound, column, klass)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # TODO [AK 09/12/12] maybe we should use ActiveSupport::Configurable ?
2
+ require 'active_support/core_ext/module/attribute_accessors'
3
+
4
+ module Valle
5
+ module Configuration
6
+
7
+ mattr_accessor :options
8
+
9
+ self.options = {
10
+ enabled: true, # gem is enabled by default
11
+ models: nil # nil means to select all the AR models
12
+ }
13
+
14
+ def configure
15
+ yield self
16
+ end
17
+
18
+ def enabled=(value)
19
+ self.options[:enabled] = value
20
+ end
21
+
22
+ def models=(collection)
23
+ self.options[:models] = collection
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ module Valle#:nodoc:
2
+ class Engine < ::Rails::Engine #:nodoc:
3
+ end
4
+ end
@@ -0,0 +1,19 @@
1
+ module Valle
2
+ class Hooks
3
+
4
+ class << self
5
+
6
+ def init
7
+ ActiveSupport.on_load(:active_record) do
8
+ ActiveRecord::Base.class_eval do
9
+ # TODO [AK 09/12/12] possible we should run it after the class was inherited
10
+ # @see http://stackoverflow.com/q/7093992/820520
11
+ def self.inherited(subclass)
12
+ Valle::BoundsManager.add_validators(subclass)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module Valle
2
+ class Railtie < ::Rails::Railtie #:nodoc:
3
+ initializer 'valle.init' do
4
+ Valle::Hooks.init
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module Valle
2
+ class ValidationSetter
3
+ class << self
4
+
5
+ ##
6
+ # Adds validator to the klass column depending on its type
7
+ #
8
+ # @param [Bound] bound the bound
9
+ # @param [Column] column the column
10
+ # @param [ActiveRecord::Base] klass the AR model class
11
+ #
12
+ def add_validator(bound, column, klass)
13
+ case column.type
14
+ when :string
15
+ klass.validates column.name, length: { maximum: bound.maximum }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module Valle
2
+ VERSION = "0.0.1"
3
+ end
data/lib/valle.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'valle/configuration'
2
+
3
+ module Valle
4
+ extend Configuration
5
+
6
+ # core
7
+ autoload :BoundMapper, 'valle/bound_mapper'
8
+ autoload :BoundsManager, 'valle/bounds_manager'
9
+ autoload :ValidationSetter, 'valle/validation_setter'
10
+
11
+ # hooks
12
+ autoload :Hooks, 'valle/hooks'
13
+ end
14
+
15
+ # load Rails/Railtie
16
+ begin
17
+ require 'rails'
18
+ rescue LoadError
19
+ #do nothing
20
+ end
21
+
22
+ # if not using Railtie, call `Valle::Hooks.init` directly
23
+ # TODO [AK 09/12/12] move this block to initializers
24
+ if defined? Rails
25
+ require 'valle/railtie'
26
+ require 'valle/engine'
27
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+ require "active_record"
3
+
4
+ class BoundMapperTest < TestCase
5
+
6
+ def setup
7
+ @bound_mapper = Valle::BoundMapper.new
8
+ end
9
+
10
+ def test_should_return_bound
11
+ column = ::ActiveRecord::ConnectionAdapters::Column.new("test_column", "")
12
+ assert @bound_mapper.bound(column), "Bound for column '#{column.name}' not found"
13
+ end
14
+
15
+ def test_should_return_maximum_for_column_with_type_string
16
+ column = ::ActiveRecord::ConnectionAdapters::Column.new("test_column", "", "string(255)")
17
+ bound = @bound_mapper.bound(column)
18
+
19
+ assert_equal 255, bound.maximum
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require 'bundler/setup'
2
+ Bundler.require
3
+
4
+ MiniTest::Unit.autorun
5
+
6
+ class TestCase < MiniTest::Unit::TestCase
7
+ end
data/valle.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/valle/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Anton Kalyaev"]
6
+ gem.email = ["anton.kalyaev@gmail.com"]
7
+ gem.description = %q{Valle adds validators to all the fields of your ActiveRecord models, so you should not think that string length or ID value exceeds the permissible limits}
8
+ gem.summary = %q{Set automatically the minimum and maximum values for your ActiveRecord model fields}
9
+ gem.homepage = "http://github.com/kaize/valle"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "valle"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Valle::VERSION
17
+
18
+ gem.add_runtime_dependency 'activerecord'
19
+ gem.add_runtime_dependency 'activesupport'
20
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: valle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Anton Kalyaev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Valle adds validators to all the fields of your ActiveRecord models,
47
+ so you should not think that string length or ID value exceeds the permissible limits
48
+ email:
49
+ - anton.kalyaev@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .travis.yml
56
+ - Gemfile
57
+ - Guardfile
58
+ - LICENSE
59
+ - README.md
60
+ - Rakefile
61
+ - features/adds_validators.feature
62
+ - features/step_definitions/rails_steps.rb
63
+ - features/support/env.rb
64
+ - lib/valle.rb
65
+ - lib/valle/bound_mapper.rb
66
+ - lib/valle/bounds_manager.rb
67
+ - lib/valle/configuration.rb
68
+ - lib/valle/engine.rb
69
+ - lib/valle/hooks.rb
70
+ - lib/valle/railtie.rb
71
+ - lib/valle/validation_setter.rb
72
+ - lib/valle/version.rb
73
+ - test/lib/bound_mapper_test.rb
74
+ - test/test_helper.rb
75
+ - valle.gemspec
76
+ homepage: http://github.com/kaize/valle
77
+ licenses: []
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ segments:
89
+ - 0
90
+ hash: -1528972839465003213
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ segments:
98
+ - 0
99
+ hash: -1528972839465003213
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 1.8.24
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Set automatically the minimum and maximum values for your ActiveRecord model
106
+ fields
107
+ test_files:
108
+ - features/adds_validators.feature
109
+ - features/step_definitions/rails_steps.rb
110
+ - features/support/env.rb
111
+ - test/lib/bound_mapper_test.rb
112
+ - test/test_helper.rb