blank_attributes 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c42166108b71d31a8a33c019fa8e57bac1b590ee
4
+ data.tar.gz: 5f402a13b6dbf7659240fe40819283ac9a20af38
5
+ SHA512:
6
+ metadata.gz: c97e91eb93cbcd876cecaad5c9168540284134658e9cfa7036a01b8bdc3c0d901b27742ff9e3c8bd573e6fd86954e3e5b98ba6e0bcd3419b6b01149a3627cf42
7
+ data.tar.gz: 341f5384e0f714b3944300c36eae9fbad2812c2165e701e3b53e9a011c744409531dcbc23c9828ab9dc17ca82ceac5c0d0ce53f442342dc2bbeb4419665ed8cd
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .gemspec
11
+ .ruby-version
12
+ bin/
13
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in blank_attributes.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 TODO: Write your name
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,45 @@
1
+ # BlankAttributes
2
+
3
+ Blankable attributes for the ActiveRecord model.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'blank_attributes'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install blank_attributes
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ class User < ActiveRecord::Base
25
+ blank_attributes :name, :email
26
+ end
27
+ ```
28
+ And use it:
29
+
30
+ ```ruby
31
+ user = User.new(name: '', email: ' ', token: ' ')
32
+ user.valid?
33
+ user.name # => nil
34
+ user.email # => nil
35
+ user.token # => " "
36
+ ```
37
+
38
+ ## Contributing
39
+
40
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/blank_attributes.
41
+
42
+
43
+ ## License
44
+
45
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'blank_attributes/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'blank_attributes'
8
+ spec.version = BlankAttributes::VERSION
9
+ spec.authors = ['Alexander Shlinchak']
10
+ spec.email = ['ashlinchak@gmail.com']
11
+
12
+ spec.summary = %q{Blankable attribtes for ActiveRecord model'}
13
+ spec.description = %q{}
14
+ spec.homepage = "https://github.com/ashlinchak/blank_attributes"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.10"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.3.0"
25
+ spec.add_development_dependency "sqlite3", "~> 1.3.10"
26
+ spec.add_development_dependency "activerecord", "~> 4.2.3"
27
+ spec.add_development_dependency "pry-byebug", "~> 3.3.0"
28
+ end
@@ -0,0 +1,10 @@
1
+ require 'active_record'
2
+
3
+ module BlankAttributes
4
+ if defined?(ActiveRecord::Base)
5
+ require 'blank_attributes/version'
6
+ require 'blank_attributes/blankable'
7
+
8
+ ActiveRecord::Base.extend BlankAttributes::Blankable
9
+ end
10
+ end
@@ -0,0 +1,60 @@
1
+ require 'blank_attributes/type_handler'
2
+
3
+ module BlankAttributes
4
+ module Blankable
5
+ def blank_attribute(*args)
6
+ class_attribute :blankable_attributes
7
+ self.blankable_attributes = args.map(&:to_sym)
8
+
9
+ include BlankAttributes::Blankable::BlankableMethods
10
+ end
11
+ alias_method :blank_attributes, :blank_attribute
12
+
13
+ def has_blankable_attribute?
14
+ blankable_attributes.any?
15
+ end
16
+
17
+ module BlankableMethods
18
+ def self.included(klass)
19
+ klass.class_eval do
20
+ before_validation :normalize_blank_attributes
21
+ skip_callback :validate, :before, :normalize_blank_attributes, if: :skip_normalize_blank_atttributes?
22
+
23
+ klass.class_eval do
24
+ include BlankAttributes::Blankable::InstanceMethods
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ module InstanceMethods
31
+ def has_blankable_attribute?
32
+ blankable_attributes.any?
33
+ end
34
+
35
+ def normalize_blank_attributes
36
+ return if skip_normalize_blank_atttributes?
37
+ type_handler = BlankAttributes::TypeHandler.new(self)
38
+
39
+ blankable_attributes.each do |attribute|
40
+ next unless self.respond_to?(attribute.to_sym) && self.respond_to?("#{attribute}=")
41
+ value = type_handler.normalize(attribute)
42
+ self.send "#{attribute}=", value
43
+ end
44
+ end
45
+
46
+ def blank_attribute?(attribute_name)
47
+ return false if attribute_name.blank?
48
+ blankable_attributes.include? attribute_name.to_sym
49
+ end
50
+
51
+ def skip_normalize_blank_atttributes?
52
+ @skip_normalize || false
53
+ end
54
+
55
+ def skip_normalize_blank_atttributes=(skip)
56
+ @skip_normalize = skip
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,41 @@
1
+ require "blank_attributes/types/string"
2
+ require "blank_attributes/types/array"
3
+
4
+ module BlankAttributes
5
+ class TypeHandler
6
+ STRING_TYPES = [:string, :text]
7
+ ARRAY_TYPES = [:array]
8
+
9
+ def initialize(object)
10
+ @object = object
11
+ end
12
+
13
+ def normalize(attr_name)
14
+ income_value = value(attr_name)
15
+ attr_type = @object.class.columns_hash[attr_name.to_s]
16
+ if attr_type.respond_to?(:array) && attr_type.array == true
17
+ normalize_array(income_value)
18
+ elsif STRING_TYPES.include?(attr_type.type)
19
+ normalize_string(income_value)
20
+ else
21
+ income_value
22
+ end
23
+ rescue
24
+ income_value
25
+ end
26
+
27
+ private
28
+
29
+ def normalize_array(income_value)
30
+ BlankAttributes::Types::Array.normalize(income_value)
31
+ end
32
+
33
+ def normalize_string(income_value)
34
+ BlankAttributes::Types::String.normalize(income_value)
35
+ end
36
+
37
+ def value(attr_name)
38
+ @object.send(attr_name.to_sym)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module BlankAttributes
3
+ module Types
4
+ class Array
5
+ class << self
6
+ def normalize(value)
7
+ return [] if value.blank?
8
+ return [] unless value.is_a?(::Array)
9
+ value.reject(&:blank?)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module BlankAttributes
3
+ module Types
4
+ class String
5
+ class << self
6
+ def normalize(str)
7
+ return nil if str.blank?
8
+ return str unless str.is_a?(::String)
9
+ str
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module BlankAttributes
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blank_attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Shlinchak
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.3.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.3.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.10
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.10
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.2.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 4.2.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.3.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.3.0
97
+ description: ''
98
+ email:
99
+ - ashlinchak@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - blank_attributes.gemspec
112
+ - lib/blank_attributes.rb
113
+ - lib/blank_attributes/blankable.rb
114
+ - lib/blank_attributes/type_handler.rb
115
+ - lib/blank_attributes/types/array.rb
116
+ - lib/blank_attributes/types/string.rb
117
+ - lib/blank_attributes/version.rb
118
+ homepage: https://github.com/ashlinchak/blank_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: '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.4.8
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Blankable attribtes for ActiveRecord model'
142
+ test_files: []
143
+ has_rdoc: