army-negative 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +4 -0
- data/LICENSE +18 -0
- data/README.rdoc +45 -0
- data/lib/army-negative.rb +23 -0
- data/lib/army-negative/column.rb +32 -0
- data/lib/army-negative/mysql_adapter.rb +26 -0
- data/lib/army-negative/quoting.rb +25 -0
- data/lib/army-negative/railtie.rb +13 -0
- data/lib/army-negative/version.rb +10 -0
- metadata +86 -0
data/CHANGELOG.rdoc
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (C) 2011 by Kendall Gifford
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
7
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
8
|
+
subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
15
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
16
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
= army-negative: negative one's for true!
|
2
|
+
|
3
|
+
This gem is a simple ActiveRecord MySQL (+ARMy+) connection adapter
|
4
|
+
monkey-patch. Put it in your +Gemfile+ and all your +true+ are belong to us! Or,
|
5
|
+
rather, they'll suddenly become very negative, negative one specifically.
|
6
|
+
|
7
|
+
== What This Does
|
8
|
+
|
9
|
+
This makes ActiveRecord store the value -1 into your +TINYINT+ +boolean+ columns
|
10
|
+
whenever they're set to +true+. It also makes ActiveRecord recognize -1 as true
|
11
|
+
when a +boolean+ field is queried.
|
12
|
+
|
13
|
+
*NOTE:* positive one and all other values that were interpreted as +true+ by the
|
14
|
+
MySQL connection adapter will still be recognized as +true+ too.
|
15
|
+
|
16
|
+
== Why
|
17
|
+
|
18
|
+
This was written for a rails application that needed to access a legacy MySQL
|
19
|
+
database. The new application needed to work concurrently with the existing
|
20
|
+
(old) application, following its conventions.
|
21
|
+
|
22
|
+
The old application is a Microsoft Access 2003 _program_ that uses the "linked
|
23
|
+
tables" feature to store the data in a MySQL database. Microsoft's Visual Basic
|
24
|
+
for Applications (VBA) stores +true+ values in memory with all bits turned on.
|
25
|
+
If interpreted as an integer using two's complement, this is negative one. So
|
26
|
+
the old application stores all our +true+ values as negative one. Because of
|
27
|
+
this, many of the hand-written legacy queries also write and expect to read true
|
28
|
+
values as negative one.
|
29
|
+
|
30
|
+
== The Name
|
31
|
+
|
32
|
+
Though no one besides myself is likely to see or use this gem, I still wanted to
|
33
|
+
push it out to the public for posterity. The +ar+ in ARmy is for ActiveRecord
|
34
|
+
while the +my+ in arMy is for MySQL. I'm sure you can guess what _negative_ is
|
35
|
+
supposed to reference.
|
36
|
+
|
37
|
+
== Authors and Credits
|
38
|
+
|
39
|
+
Authors:: Kendall Gifford
|
40
|
+
|
41
|
+
== License
|
42
|
+
|
43
|
+
Licensed using the standard {MIT License}[http://en.wikipedia.org/wiki/MIT_License].
|
44
|
+
See the file {LICENSE}[http://github.com/zettabyte/army-negative/blob/master/LICENSE]
|
45
|
+
in the root folder of the project.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'army-negative/railtie' if defined?(Rails)
|
2
|
+
|
3
|
+
module Army
|
4
|
+
module Negative
|
5
|
+
|
6
|
+
autoload :Column, 'army-negative/column'
|
7
|
+
autoload :Quoting, 'army-negative/quoting'
|
8
|
+
autoload :MysqlAdapter, 'army-negative/mysql_adapter'
|
9
|
+
|
10
|
+
def patch_active_record!
|
11
|
+
ActiveRecord::ConnectionAdapters::Column.send :include, Column
|
12
|
+
ActiveRecord::ConnectionAdapters::Quoting.send :include, Quoting
|
13
|
+
end
|
14
|
+
module_function :patch_active_record!
|
15
|
+
|
16
|
+
def patch_mysql_adapter!
|
17
|
+
require 'active_record/connection_adapters/mysql_adapter'
|
18
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter.send :include, MysqlAdapter
|
19
|
+
end
|
20
|
+
module_function :patch_mysql_adapter!
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Army
|
4
|
+
module Negative
|
5
|
+
module Column
|
6
|
+
TRUE_VALUES_WITH_NEGATIVE_ONES = [-1, '-1'].to_set
|
7
|
+
|
8
|
+
#
|
9
|
+
# Extend ActiveRecord::ConnectionAdapters::Column
|
10
|
+
#
|
11
|
+
def self.included(klass)
|
12
|
+
klass.send(:extend, ClassMethods)
|
13
|
+
klass.instance_eval do
|
14
|
+
class << self
|
15
|
+
alias_method_chain :value_to_boolean, :negative_ones
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
#
|
22
|
+
# Recognize integer -1 and string '-1' as "true" values.
|
23
|
+
#
|
24
|
+
def value_to_boolean_with_negative_ones(value)
|
25
|
+
return true if TRUE_VALUES_WITH_NEGATIVE_ONES.include?(value)
|
26
|
+
value_to_boolean_without_negative_ones(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Army
|
4
|
+
module Negative
|
5
|
+
module MysqlAdapter
|
6
|
+
|
7
|
+
QUOTED_TRUE_AS_NEGATIVE_ONE = "-1".freeze
|
8
|
+
|
9
|
+
def self.included(klass)
|
10
|
+
klass.instance_eval do
|
11
|
+
alias_method :quoted_true, :quoted_true_as_negative_one
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# This doesn't seem to actually be necessary in rails 3.0 (though it doesn't
|
17
|
+
# break anything either) but I'm doing this for completeness: make is so
|
18
|
+
# that MySQL adapter-specific calls to #quoted_true also get "-1".
|
19
|
+
#
|
20
|
+
def quoted_true_as_negative_one
|
21
|
+
QUOTED_TRUE_AS_NEGATIVE_ONE
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Army
|
2
|
+
module Negative
|
3
|
+
module Quoting
|
4
|
+
|
5
|
+
#
|
6
|
+
# Extend ActiveRecord::ConnectionAdapters::Quoting
|
7
|
+
#
|
8
|
+
def self.included(klass)
|
9
|
+
klass.instance_eval do
|
10
|
+
alias_method_chain :quote, :negative_one
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#
|
15
|
+
# Ensure "true" values get stored as -1 in the database where they'd
|
16
|
+
# normally have been stored as 1
|
17
|
+
#
|
18
|
+
def quote_with_negative_one(value, column = nil)
|
19
|
+
result = quote_without_negative_one(value, column)
|
20
|
+
(value.is_a?(TrueClass) and result == '1') ? '-1' : result
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: army-negative
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Kendall Gifford
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-11 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: |-
|
23
|
+
When this gem is loaded in your rails app (Gemfile) your MySQL connection
|
24
|
+
adapter for ActiveRecord will be monkey-patched. The patch simply tweaks it
|
25
|
+
to store all boolean "true" values as negative one instead of positive one
|
26
|
+
inside your TINYINT columns. It also patches it to recognize and interpret
|
27
|
+
negative one as "true". Positive one will still be recognized as true as
|
28
|
+
well.
|
29
|
+
Used for special cases, such as developing rails apps that must, for
|
30
|
+
example, work with existing databases that use such a convention.
|
31
|
+
email:
|
32
|
+
- zettabyte@gmail.com
|
33
|
+
executables: []
|
34
|
+
|
35
|
+
extensions: []
|
36
|
+
|
37
|
+
extra_rdoc_files: []
|
38
|
+
|
39
|
+
files:
|
40
|
+
- lib/army-negative/column.rb
|
41
|
+
- lib/army-negative/railtie.rb
|
42
|
+
- lib/army-negative/mysql_adapter.rb
|
43
|
+
- lib/army-negative/quoting.rb
|
44
|
+
- lib/army-negative/version.rb
|
45
|
+
- lib/army-negative.rb
|
46
|
+
- LICENSE
|
47
|
+
- README.rdoc
|
48
|
+
- CHANGELOG.rdoc
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://github.com/zettabyte/army-negative/wiki
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 23
|
73
|
+
segments:
|
74
|
+
- 1
|
75
|
+
- 3
|
76
|
+
- 6
|
77
|
+
version: 1.3.6
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project: army-negative
|
81
|
+
rubygems_version: 1.3.7
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Monkey-patches ActiveRecord's MySQL (ARMy) connection adapter to store boolean trues as negative ones
|
85
|
+
test_files: []
|
86
|
+
|