army-negative 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/CHANGELOG.rdoc +9 -0
- data/Gemfile +3 -0
- data/README.rdoc +37 -6
- data/Rakefile +33 -0
- data/army-negative.gemspec +45 -0
- data/dummy/Rakefile +8 -0
- data/dummy/app/models/user.rb +3 -0
- data/dummy/config/boot.rb +112 -0
- data/dummy/config/database.yml +48 -0
- data/dummy/config/environment.rb +10 -0
- data/dummy/config/environments/test.rb +1 -0
- data/dummy/config/initializers/army-negative.rb +3 -0
- data/dummy/config/initializers/session_store.rb +5 -0
- data/dummy/config/routes.rb +1 -0
- data/dummy/db/migrate/20110909225432_create_users.rb +15 -0
- data/dummy/db/schema.rb +21 -0
- data/dummy/test/fixtures/users.yml +3 -0
- data/features/support/env.rb +32 -0
- data/features/support/step_definitions.rb +25 -0
- data/features/true_is_negative_one.feature +16 -0
- data/lib/army-negative.rb +13 -10
- data/lib/army-negative/column.rb +15 -14
- data/lib/army-negative/mysql_adapter.rb +10 -5
- data/lib/army-negative/quoting.rb +6 -3
- data/lib/army-negative/version.rb +2 -2
- metadata +128 -32
- data/lib/army-negative/railtie.rb +0 -13
data/.gitignore
ADDED
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
= 2.0.0, release 2011-09-12
|
2
|
+
|
3
|
+
* Reverted code so that the <tt>2.x</tt> series supports rails <tt>2.3.x</tt> apps.
|
4
|
+
* Added a cucumber-based test suite.
|
5
|
+
|
6
|
+
The intent is that newer versions, specifically the <tt>3.x</tt> versions, will
|
7
|
+
support the <tt>3.x</tt> versions of rails while any rails <tt>2.3.x</tt> users
|
8
|
+
can always use the latest <tt>2.x</tt> version of this gem.
|
9
|
+
|
1
10
|
= 1.0.0, release 2011-03-11
|
2
11
|
|
3
12
|
* Initial Release
|
data/Gemfile
ADDED
data/README.rdoc
CHANGED
@@ -1,17 +1,48 @@
|
|
1
|
-
=
|
1
|
+
= Army::Negative -- Negative ones for true!
|
2
2
|
|
3
3
|
This gem is a simple ActiveRecord MySQL (+ARMy+) connection adapter
|
4
4
|
monkey-patch. Put it in your +Gemfile+ and all your +true+ are belong to us! Or,
|
5
5
|
rather, they'll suddenly become very negative, negative one specifically.
|
6
6
|
|
7
|
+
See the *Usage* section below for information on how to use this gem with rails
|
8
|
+
<tt>2.3.x</tt>.
|
9
|
+
|
10
|
+
== Versioning
|
11
|
+
|
12
|
+
As of version <tt>2.0</tt>, a new versioning system has been employed. All
|
13
|
+
<tt>2.x</tt> versions of this gem support rails versions <tt>2.3.x</tt>.
|
14
|
+
|
15
|
+
Versions <tt>3.x</tt> of the gem will support rails versions <tt>3.x</tt>.
|
16
|
+
|
17
|
+
== Usage
|
18
|
+
|
19
|
+
In order to use this gem in your rails <tt>2.3.x</tt> app, first modify your
|
20
|
+
<tt>config/environment.rb</tt> and add the following within the configuration
|
21
|
+
block:
|
22
|
+
|
23
|
+
Rails::Initializer.run do |config|
|
24
|
+
# ...
|
25
|
+
config.gem "army-negative", :version => "~> 2.0"
|
26
|
+
# ...
|
27
|
+
end
|
28
|
+
|
29
|
+
You can then run <tt>rake gems:install</tt> in order to install the gem.
|
30
|
+
|
31
|
+
Finally, create a new _initializer_ file in <tt>config/initializers</tt> such as
|
32
|
+
the following:
|
33
|
+
|
34
|
+
# config/initializers/army-negative.rb
|
35
|
+
require 'army-negative'
|
36
|
+
Army::Negative.activate!
|
37
|
+
|
7
38
|
== What This Does
|
8
39
|
|
9
|
-
This makes ActiveRecord store the value
|
10
|
-
whenever they're set to +true+. It also makes ActiveRecord
|
11
|
-
when a +boolean+ field is queried.
|
40
|
+
This makes ActiveRecord store the value <tt>-1</tt> into your +TINYINT+
|
41
|
+
+boolean+ columns whenever they're set to +true+. It also makes ActiveRecord
|
42
|
+
recognize <tt>-1</tt> as +true+ when a +boolean+ field is queried.
|
12
43
|
|
13
|
-
|
14
|
-
MySQL connection adapter will still be recognized as +true+ too.
|
44
|
+
<b>NOTE:</b> positive one and all other values that were interpreted as +true+
|
45
|
+
by the MySQL connection adapter will still be recognized as +true+ too.
|
15
46
|
|
16
47
|
== Why
|
17
48
|
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'bundler/setup'
|
6
|
+
rescue LoadError
|
7
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
8
|
+
end
|
9
|
+
require 'bundler/gem_tasks'
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rdoc/task'
|
13
|
+
rescue LoadError
|
14
|
+
require 'rdoc/rdoc'
|
15
|
+
require 'rake/rdoctask'
|
16
|
+
RDoc::Task = Rake::RDocTask
|
17
|
+
end
|
18
|
+
|
19
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = "rdoc"
|
21
|
+
rdoc.title = "Army::Negative"
|
22
|
+
rdoc.options << "--line-numbers"
|
23
|
+
rdoc.rdoc_files.include("README.rdoc", "LICENSE", "CHANGELOG.rdoc", "lib/**/*.rb")
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'cucumber'
|
27
|
+
require 'cucumber/rake/task'
|
28
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
29
|
+
t.cucumber_opts = "features --format pretty"
|
30
|
+
end
|
31
|
+
|
32
|
+
task :default => :features
|
33
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
3
|
+
require 'army-negative/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "army-negative"
|
7
|
+
s.version = Army::Negative::Version::STRING
|
8
|
+
s.authors = ["Kendall Gifford"]
|
9
|
+
s.email = ["zettabyte@gmail.com"]
|
10
|
+
s.license = "MIT"
|
11
|
+
s.homepage = "http://github.com/zettabyte/army-negative"
|
12
|
+
s.summary = "Monkey-patches ActiveRecord's MySQL (ARMy) connection adapter to store boolean trues as negative ones"
|
13
|
+
s.description = <<-DESCRIPTION.strip.gsub(/^\s+/, "")
|
14
|
+
When this gem is loaded and activated inside your rails app, your MySQL
|
15
|
+
connection adapter for ActiveRecord will be monkey-patched. The patch simply
|
16
|
+
tweaks it to store all boolean "true" values as negative one instead of
|
17
|
+
positive one inside your TINYINT columns. It also patches it to recognize
|
18
|
+
and interpret negative one as "true". Positive one will still be recognized
|
19
|
+
as true as well.
|
20
|
+
|
21
|
+
Used for special cases, such as developing rails apps that must, for
|
22
|
+
example, work with existing databases that use such a convention.
|
23
|
+
|
24
|
+
Use versions ~> 2.0 for rails 2.x apps. and versions > 2 for rails 3 apps.
|
25
|
+
DESCRIPTION
|
26
|
+
|
27
|
+
s.files = `git ls-files`.split("\n")
|
28
|
+
s.test_files = `git ls-files -- {features,dummy}/*`.split("\n")
|
29
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
30
|
+
s.require_paths = ["lib"]
|
31
|
+
|
32
|
+
s.add_dependency "rails", "~> 2.3.0"
|
33
|
+
s.add_dependency "mysql", "~> 2.8.1"
|
34
|
+
|
35
|
+
if s.respond_to?(:add_development_dependency)
|
36
|
+
s.add_development_dependency "bundler", "~> 1.0.18"
|
37
|
+
s.add_development_dependency "cucumber", "~> 1.0.3"
|
38
|
+
s.add_development_dependency "rspec", "~> 2.6.0"
|
39
|
+
end
|
40
|
+
|
41
|
+
if s.respond_to?(:extra_rdoc_files)
|
42
|
+
s.extra_rdoc_files = ["README.rdoc", "LICENSE", "CHANGELOG.rdoc"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/dummy/Rakefile
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
|
3
|
+
|
4
|
+
module Rails
|
5
|
+
class << self
|
6
|
+
def boot!
|
7
|
+
unless booted?
|
8
|
+
preinitialize
|
9
|
+
pick_boot.run
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def booted?
|
14
|
+
defined? Rails::Initializer
|
15
|
+
end
|
16
|
+
|
17
|
+
def pick_boot
|
18
|
+
(vendor_rails? ? VendorBoot : GemBoot).new
|
19
|
+
end
|
20
|
+
|
21
|
+
def vendor_rails?
|
22
|
+
File.exist?("#{RAILS_ROOT}/vendor/rails")
|
23
|
+
end
|
24
|
+
|
25
|
+
def preinitialize
|
26
|
+
load(preinitializer_path) if File.exist?(preinitializer_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def preinitializer_path
|
30
|
+
"#{RAILS_ROOT}/config/preinitializer.rb"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Boot
|
35
|
+
def run
|
36
|
+
load_initializer
|
37
|
+
Rails::Initializer.run(:set_load_path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class VendorBoot < Boot
|
42
|
+
def load_initializer
|
43
|
+
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
|
44
|
+
Rails::Initializer.run(:install_gem_spec_stubs)
|
45
|
+
Rails::GemDependency.add_frozen_gem_path
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class GemBoot < Boot
|
50
|
+
def load_initializer
|
51
|
+
self.class.load_rubygems
|
52
|
+
load_rails_gem
|
53
|
+
require 'initializer'
|
54
|
+
end
|
55
|
+
|
56
|
+
def load_rails_gem
|
57
|
+
if version = self.class.gem_version
|
58
|
+
gem 'rails', version
|
59
|
+
else
|
60
|
+
gem 'rails'
|
61
|
+
end
|
62
|
+
rescue Gem::LoadError => load_error
|
63
|
+
if load_error.message =~ /Could not find RubyGem rails/
|
64
|
+
STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
|
65
|
+
exit 1
|
66
|
+
else
|
67
|
+
raise
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class << self
|
72
|
+
def rubygems_version
|
73
|
+
Gem::RubyGemsVersion rescue nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def gem_version
|
77
|
+
if defined? RAILS_GEM_VERSION
|
78
|
+
RAILS_GEM_VERSION
|
79
|
+
elsif ENV.include?('RAILS_GEM_VERSION')
|
80
|
+
ENV['RAILS_GEM_VERSION']
|
81
|
+
else
|
82
|
+
parse_gem_version(read_environment_rb)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def load_rubygems
|
87
|
+
min_version = '1.3.2'
|
88
|
+
require 'rubygems'
|
89
|
+
unless rubygems_version >= min_version
|
90
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
|
91
|
+
exit 1
|
92
|
+
end
|
93
|
+
|
94
|
+
rescue LoadError
|
95
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
|
99
|
+
def parse_gem_version(text)
|
100
|
+
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
def read_environment_rb
|
105
|
+
File.read("#{RAILS_ROOT}/config/environment.rb")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# All that for this:
|
112
|
+
Rails.boot!
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# MySQL. Versions 4.1 and 5.0 are recommended.
|
2
|
+
#
|
3
|
+
# Install the MySQL driver:
|
4
|
+
# gem install mysql
|
5
|
+
# On Mac OS X:
|
6
|
+
# sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql
|
7
|
+
# On Mac OS X Leopard:
|
8
|
+
# sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
|
9
|
+
# This sets the ARCHFLAGS environment variable to your native architecture
|
10
|
+
# On Windows:
|
11
|
+
# gem install mysql
|
12
|
+
# Choose the win32 build.
|
13
|
+
# Install MySQL and put its /bin directory on your path.
|
14
|
+
#
|
15
|
+
# And be sure to use new-style password hashing:
|
16
|
+
# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
|
17
|
+
development:
|
18
|
+
adapter: mysql
|
19
|
+
encoding: utf8
|
20
|
+
reconnect: false
|
21
|
+
database: dummy_development
|
22
|
+
pool: 5
|
23
|
+
username: root
|
24
|
+
password:
|
25
|
+
socket: /var/run/mysqld/mysqld.sock
|
26
|
+
|
27
|
+
# Warning: The database defined as "test" will be erased and
|
28
|
+
# re-generated from your development database when you run "rake".
|
29
|
+
# Do not set this db to the same as development or production.
|
30
|
+
test:
|
31
|
+
adapter: mysql
|
32
|
+
encoding: utf8
|
33
|
+
reconnect: false
|
34
|
+
database: dummy_test
|
35
|
+
pool: 5
|
36
|
+
username: root
|
37
|
+
password:
|
38
|
+
socket: /var/run/mysqld/mysqld.sock
|
39
|
+
|
40
|
+
production:
|
41
|
+
adapter: mysql
|
42
|
+
encoding: utf8
|
43
|
+
reconnect: false
|
44
|
+
database: dummy_production
|
45
|
+
pool: 5
|
46
|
+
username: root
|
47
|
+
password:
|
48
|
+
socket: /var/run/mysqld/mysqld.sock
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Specifies gem version of Rails to use when vendor/rails is not present
|
4
|
+
RAILS_GEM_VERSION = '2.3.14' unless defined? RAILS_GEM_VERSION
|
5
|
+
|
6
|
+
# Bootstrap the Rails environment, frameworks, and default configuration
|
7
|
+
require File.join(File.dirname(__FILE__), 'boot')
|
8
|
+
|
9
|
+
Rails::Initializer.run do |config|
|
10
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# encoding: utf-8
|
@@ -0,0 +1 @@
|
|
1
|
+
# encoding: utf-8
|
data/dummy/db/schema.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead of editing this file,
|
2
|
+
# please use the migrations feature of Active Record to incrementally modify your database, and
|
3
|
+
# then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
|
6
|
+
# to create the application database on another system, you should be using db:schema:load, not running
|
7
|
+
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
8
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
9
|
+
#
|
10
|
+
# It's strongly recommended to check this file into your version control system.
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define(:version => 20110909225432) do
|
13
|
+
|
14
|
+
create_table "users", :force => true do |t|
|
15
|
+
t.string "username"
|
16
|
+
t.boolean "enabled"
|
17
|
+
t.datetime "created_at"
|
18
|
+
t.datetime "updated_at"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
# Make RSpec expectations available inside our step definitions
|
5
|
+
require 'rspec/expectations'
|
6
|
+
World(RSpec::Matchers)
|
7
|
+
|
8
|
+
# Load the rails environment of our test application
|
9
|
+
ENV["RAILS_ENV"] = "test"
|
10
|
+
RAILS_ROOT = File.expand_path("../../../dummy", __FILE__)
|
11
|
+
require File.join(RAILS_ROOT, "config", "environment")
|
12
|
+
|
13
|
+
# Runs the named rake tasks for the test rails application using the "test"
|
14
|
+
# rails environment.
|
15
|
+
def run_rails_rake_tasks(*names)
|
16
|
+
ARGV.clear
|
17
|
+
ARGV.concat(names)
|
18
|
+
ARGV << "RAILS_ENV=test"
|
19
|
+
Dir.chdir(RAILS_ROOT) do
|
20
|
+
old = Rake.application
|
21
|
+
Rake.application = Rake::Application.new
|
22
|
+
begin
|
23
|
+
Rake.application.run
|
24
|
+
ensure
|
25
|
+
Rake.application = old
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Reset the test rails application's test environment database
|
31
|
+
run_rails_rake_tasks("db:reset", "db:fixtures:load")
|
32
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
Given /^an ActiveRecord 'User' model with an 'enabled' boolean field and a 'username' field$/ do
|
4
|
+
# Done: see the dummy rails app
|
5
|
+
end
|
6
|
+
|
7
|
+
When /^I create a user named '([^']+)' with '([^']+)' set to true$/ do |username, column|
|
8
|
+
User.create :username => username, column.intern => true
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^the '([^']+)' column for '([^']+)' should be '([^']+)'$/ do |column, username, value|
|
12
|
+
user = User.find_by_username(username)
|
13
|
+
user.send("#{column}_before_type_cast").should == value
|
14
|
+
end
|
15
|
+
|
16
|
+
When /^I load a user named '([^']+)' who's '([^']+)' column is '(-?\d+)'$/ do |username, column, value|
|
17
|
+
@user = User.send("find_by_username_and_#{column}", username, value.to_i)
|
18
|
+
@user || raise("Unable to find user '#{username}' (who's '#{column}' column is '#{value}')")
|
19
|
+
end
|
20
|
+
|
21
|
+
Then /^the user model's '([^']+)' field for '([^']+)' should be true$/ do |column, username|
|
22
|
+
@user.username.should == username
|
23
|
+
@user.send("#{column}?").should be_true
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Feature: True is stored as a negative one
|
2
|
+
|
3
|
+
In order to allow my rails application to work with my legacy database
|
4
|
+
As a web application developer
|
5
|
+
I want rails to store 'true' as negative one in my MySQL TINYINT(1) columns
|
6
|
+
|
7
|
+
Scenario: Save a record with a 'true' value
|
8
|
+
Given an ActiveRecord 'User' model with an 'enabled' boolean field and a 'username' field
|
9
|
+
When I create a user named 'howard' with 'enabled' set to true
|
10
|
+
Then the 'enabled' column for 'howard' should be '-1'
|
11
|
+
|
12
|
+
Scenario: Interpret a record with -1 as true
|
13
|
+
Given an ActiveRecord 'User' model with an 'enabled' boolean field and a 'username' field
|
14
|
+
When I load a user named 'eunice' who's 'enabled' column is '-1'
|
15
|
+
Then the user model's 'enabled' field for 'eunice' should be true
|
16
|
+
|
data/lib/army-negative.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'army-negative/
|
1
|
+
require 'army-negative/version'
|
2
2
|
|
3
3
|
module Army
|
4
4
|
module Negative
|
@@ -7,17 +7,20 @@ module Army
|
|
7
7
|
autoload :Quoting, 'army-negative/quoting'
|
8
8
|
autoload :MysqlAdapter, 'army-negative/mysql_adapter'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
#
|
11
|
+
# Call this in an initializer in order to active army-negative and ensure
|
12
|
+
# all true values get stored as -1 and -1's are recognized as true.
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
# require 'army-negative'
|
16
|
+
# Army::Negative.activate!
|
17
|
+
#
|
18
|
+
def activate!
|
19
|
+
ActiveRecord::ConnectionAdapters::Column.send :extend, Column
|
20
|
+
ActiveRecord::ConnectionAdapters::Quoting.send :include, Quoting
|
18
21
|
ActiveRecord::ConnectionAdapters::MysqlAdapter.send :include, MysqlAdapter
|
19
22
|
end
|
20
|
-
module_function :
|
23
|
+
module_function :activate!
|
21
24
|
|
22
25
|
end
|
23
26
|
end
|
data/lib/army-negative/column.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
1
|
module Army
|
4
2
|
module Negative
|
5
3
|
module Column
|
6
|
-
|
4
|
+
|
5
|
+
# Augments ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
|
6
|
+
TRUE_VALUES_WITH_NEGATIVE_ONES = [-1, '-1']
|
7
7
|
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# Called when you extend ActiveRecord::ConnectionAdapters::Column with
|
10
|
+
# this module. Uses #alias_method_chain so that
|
11
|
+
# #value_to_boolean_with_negative_ones is called instead of
|
12
|
+
# #value_to_boolean
|
10
13
|
#
|
11
|
-
def self.
|
12
|
-
klass.send(:extend, ClassMethods)
|
14
|
+
def self.extended(klass)
|
13
15
|
klass.instance_eval do
|
14
16
|
class << self
|
15
17
|
alias_method_chain :value_to_boolean, :negative_ones
|
@@ -17,14 +19,13 @@ module Army
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
22
|
+
#
|
23
|
+
# Replaces #value_to_boolean in order to recognize integer -1 and string
|
24
|
+
# '-1' as "true" values.
|
25
|
+
#
|
26
|
+
def value_to_boolean_with_negative_ones(value)
|
27
|
+
return true if TRUE_VALUES_WITH_NEGATIVE_ONES.include?(value)
|
28
|
+
value_to_boolean_without_negative_ones(value)
|
28
29
|
end
|
29
30
|
|
30
31
|
end
|
@@ -1,11 +1,16 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
1
|
module Army
|
4
2
|
module Negative
|
5
3
|
module MysqlAdapter
|
6
4
|
|
5
|
+
# Effectively replaces ActiveRecord::ConnectionAdapters::MysqlAdapter::QUOTED_TRUE
|
7
6
|
QUOTED_TRUE_AS_NEGATIVE_ONE = "-1".freeze
|
8
7
|
|
8
|
+
#
|
9
|
+
# Called when this module is included in
|
10
|
+
# ActiveRecord::ConnectionAdapters::MysqlAdapter. Uses #alias_method to
|
11
|
+
# replace the original #quoted_true implementation with this module's
|
12
|
+
# implementation named #quoted_true_as_negative_one
|
13
|
+
#
|
9
14
|
def self.included(klass)
|
10
15
|
klass.instance_eval do
|
11
16
|
alias_method :quoted_true, :quoted_true_as_negative_one
|
@@ -13,9 +18,9 @@ module Army
|
|
13
18
|
end
|
14
19
|
|
15
20
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
21
|
+
# Replaces the original #quoted_true implementation. When asked for a
|
22
|
+
# "quoted_true" value, return our variation (QUOTED_TRUE_AS_NEGATIVE_ONE)
|
23
|
+
# instead of the default QUOTED_TRUE value.
|
19
24
|
#
|
20
25
|
def quoted_true_as_negative_one
|
21
26
|
QUOTED_TRUE_AS_NEGATIVE_ONE
|
@@ -3,7 +3,10 @@ module Army
|
|
3
3
|
module Quoting
|
4
4
|
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# Called when this module is included in
|
7
|
+
# ActiveRecord::ConnectionAdapters::Quoting. Uses #alias_method_chain to
|
8
|
+
# replace the original #quote method with our #quote_with_negative_one
|
9
|
+
# variation.
|
7
10
|
#
|
8
11
|
def self.included(klass)
|
9
12
|
klass.instance_eval do
|
@@ -12,8 +15,8 @@ module Army
|
|
12
15
|
end
|
13
16
|
|
14
17
|
#
|
15
|
-
#
|
16
|
-
# normally have been stored as 1
|
18
|
+
# Wraps the original #quote method, ensuring that "true" values get stored
|
19
|
+
# as -1 in the database where they'd normally have been stored as 1.
|
17
20
|
#
|
18
21
|
def quote_with_negative_one(value, column = nil)
|
19
22
|
result = quote_without_negative_one(value, column)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: army-negative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 15
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
version:
|
10
|
+
version: 2.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kendall Gifford
|
@@ -15,41 +15,139 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
date: 2011-09-12 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
|
+
type: :runtime
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 2
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
version: 2.3.0
|
34
|
+
version_requirements: *id001
|
35
|
+
name: rails
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
prerelease: false
|
38
|
+
type: :runtime
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 45
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 8
|
48
|
+
- 1
|
49
|
+
version: 2.8.1
|
50
|
+
version_requirements: *id002
|
51
|
+
name: mysql
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
prerelease: false
|
54
|
+
type: :development
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 51
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 0
|
64
|
+
- 18
|
65
|
+
version: 1.0.18
|
66
|
+
version_requirements: *id003
|
67
|
+
name: bundler
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
prerelease: false
|
70
|
+
type: :development
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 17
|
77
|
+
segments:
|
78
|
+
- 1
|
79
|
+
- 0
|
80
|
+
- 3
|
81
|
+
version: 1.0.3
|
82
|
+
version_requirements: *id004
|
83
|
+
name: cucumber
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
prerelease: false
|
86
|
+
type: :development
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ~>
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 23
|
93
|
+
segments:
|
94
|
+
- 2
|
95
|
+
- 6
|
96
|
+
- 0
|
97
|
+
version: 2.6.0
|
98
|
+
version_requirements: *id005
|
99
|
+
name: rspec
|
22
100
|
description: |-
|
23
|
-
When this gem is loaded
|
24
|
-
adapter for ActiveRecord will be monkey-patched. The patch simply
|
25
|
-
to store all boolean "true" values as negative one instead of
|
26
|
-
inside your TINYINT columns. It also patches it to recognize
|
27
|
-
negative one as "true". Positive one will still be recognized
|
28
|
-
well.
|
101
|
+
When this gem is loaded and activated inside your rails app, your MySQL
|
102
|
+
connection adapter for ActiveRecord will be monkey-patched. The patch simply
|
103
|
+
tweaks it to store all boolean "true" values as negative one instead of
|
104
|
+
positive one inside your TINYINT columns. It also patches it to recognize
|
105
|
+
and interpret negative one as "true". Positive one will still be recognized
|
106
|
+
as true as well.
|
29
107
|
Used for special cases, such as developing rails apps that must, for
|
30
108
|
example, work with existing databases that use such a convention.
|
109
|
+
Use versions ~> 2.0 for rails 2.x apps. and versions > 2 for rails 3 apps.
|
31
110
|
email:
|
32
111
|
- zettabyte@gmail.com
|
33
112
|
executables: []
|
34
113
|
|
35
114
|
extensions: []
|
36
115
|
|
37
|
-
extra_rdoc_files:
|
38
|
-
|
116
|
+
extra_rdoc_files:
|
117
|
+
- README.rdoc
|
118
|
+
- LICENSE
|
119
|
+
- CHANGELOG.rdoc
|
39
120
|
files:
|
121
|
+
- .gitignore
|
122
|
+
- CHANGELOG.rdoc
|
123
|
+
- Gemfile
|
124
|
+
- LICENSE
|
125
|
+
- README.rdoc
|
126
|
+
- Rakefile
|
127
|
+
- army-negative.gemspec
|
128
|
+
- dummy/Rakefile
|
129
|
+
- dummy/app/models/user.rb
|
130
|
+
- dummy/config/boot.rb
|
131
|
+
- dummy/config/database.yml
|
132
|
+
- dummy/config/environment.rb
|
133
|
+
- dummy/config/environments/test.rb
|
134
|
+
- dummy/config/initializers/army-negative.rb
|
135
|
+
- dummy/config/initializers/session_store.rb
|
136
|
+
- dummy/config/routes.rb
|
137
|
+
- dummy/db/migrate/20110909225432_create_users.rb
|
138
|
+
- dummy/db/schema.rb
|
139
|
+
- dummy/test/fixtures/users.yml
|
140
|
+
- features/support/env.rb
|
141
|
+
- features/support/step_definitions.rb
|
142
|
+
- features/true_is_negative_one.feature
|
143
|
+
- lib/army-negative.rb
|
40
144
|
- lib/army-negative/column.rb
|
41
|
-
- lib/army-negative/railtie.rb
|
42
145
|
- lib/army-negative/mysql_adapter.rb
|
43
146
|
- lib/army-negative/quoting.rb
|
44
147
|
- lib/army-negative/version.rb
|
45
|
-
|
46
|
-
|
47
|
-
-
|
48
|
-
- CHANGELOG.rdoc
|
49
|
-
has_rdoc: true
|
50
|
-
homepage: http://github.com/zettabyte/army-negative/wiki
|
51
|
-
licenses: []
|
52
|
-
|
148
|
+
homepage: http://github.com/zettabyte/army-negative
|
149
|
+
licenses:
|
150
|
+
- MIT
|
53
151
|
post_install_message:
|
54
152
|
rdoc_options: []
|
55
153
|
|
@@ -69,16 +167,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
167
|
requirements:
|
70
168
|
- - ">="
|
71
169
|
- !ruby/object:Gem::Version
|
72
|
-
hash:
|
170
|
+
hash: 3
|
73
171
|
segments:
|
74
|
-
-
|
75
|
-
|
76
|
-
- 6
|
77
|
-
version: 1.3.6
|
172
|
+
- 0
|
173
|
+
version: "0"
|
78
174
|
requirements: []
|
79
175
|
|
80
|
-
rubyforge_project:
|
81
|
-
rubygems_version: 1.
|
176
|
+
rubyforge_project:
|
177
|
+
rubygems_version: 1.8.6
|
82
178
|
signing_key:
|
83
179
|
specification_version: 3
|
84
180
|
summary: Monkey-patches ActiveRecord's MySQL (ARMy) connection adapter to store boolean trues as negative ones
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'army-negative'
|
2
|
-
require 'rails'
|
3
|
-
|
4
|
-
module Army
|
5
|
-
module Negative
|
6
|
-
class Railtie < Rails::Railtie
|
7
|
-
initializer "army-negative.patch_active_record", :after => "active_record.initialize_database" do
|
8
|
-
Army::Negative.patch_active_record!
|
9
|
-
Army::Negative.patch_mysql_adapter!
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|