mack-data_mapper 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/gems/addressable-2.0.0/lib/addressable/idna.rb +4867 -0
- data/lib/gems/addressable-2.0.0/lib/addressable/uri.rb +2469 -0
- data/lib/gems/addressable-2.0.0/lib/addressable/version.rb +35 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/adapters/data_objects_adapter.rb +85 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/aggregate_functions.rb +201 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/collection.rb +11 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/model.rb +11 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/repository.rb +7 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/support/symbol.rb +21 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/version.rb +7 -0
- data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates.rb +15 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/abstract_adapter.rb +209 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/data_objects_adapter.rb +709 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/mysql_adapter.rb +136 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/postgres_adapter.rb +188 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/sqlite3_adapter.rb +105 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters.rb +22 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_many.rb +147 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_one.rb +107 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_many.rb +318 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_one.rb +61 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship.rb +223 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship_chain.rb +81 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/associations.rb +200 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/auto_migrations.rb +105 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/collection.rb +642 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/dependency_queue.rb +32 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/hook.rb +11 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/identity_map.rb +42 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/is.rb +16 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/logger.rb +232 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/migrations/destructive_migrations.rb +17 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/migrator.rb +29 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/model.rb +488 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/naming_conventions.rb +84 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/property.rb +663 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/property_set.rb +169 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/query.rb +628 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/repository.rb +159 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/resource.rb +637 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/scope.rb +58 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support/array.rb +13 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support/assertions.rb +8 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support/errors.rb +23 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support/kernel.rb +11 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support/symbol.rb +41 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/support.rb +7 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/transaction.rb +267 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/type.rb +160 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/type_map.rb +80 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/boolean.rb +7 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/discriminator.rb +34 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/object.rb +24 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_boolean.rb +34 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_datetime.rb +33 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/serial.rb +9 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types/text.rb +10 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/types.rb +19 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core/version.rb +3 -0
- data/lib/gems/dm-core-0.9.7/lib/dm-core.rb +217 -0
- data/lib/gems/dm-core-0.9.7/script/all +5 -0
- data/lib/gems/dm-core-0.9.7/script/performance.rb +284 -0
- data/lib/gems/dm-core-0.9.7/script/profile.rb +87 -0
- data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations/version.rb +5 -0
- data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations.rb +1 -0
- data/lib/gems/dm-migrations-0.9.7/lib/migration.rb +215 -0
- data/lib/gems/dm-migrations-0.9.7/lib/migration_runner.rb +88 -0
- data/lib/gems/dm-migrations-0.9.7/lib/spec/example/migration_example_group.rb +73 -0
- data/lib/gems/dm-migrations-0.9.7/lib/spec/matchers/migration_matchers.rb +107 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/column.rb +9 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/mysql.rb +52 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/postgresql.rb +78 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/sqlite3.rb +43 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/table.rb +19 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/table_creator.rb +81 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql/table_modifier.rb +53 -0
- data/lib/gems/dm-migrations-0.9.7/lib/sql.rb +10 -0
- data/lib/gems/dm-observer-0.9.7/lib/dm-observer/version.rb +5 -0
- data/lib/gems/dm-observer-0.9.7/lib/dm-observer.rb +91 -0
- data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer/version.rb +5 -0
- data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer.rb +183 -0
- data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps/version.rb +5 -0
- data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps.rb +57 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/bcrypt_hash.rb +31 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/csv.rb +28 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/enum.rb +70 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/epoch_time.rb +27 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/file_path.rb +27 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/flag.rb +61 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/ip_address.rb +30 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/json.rb +40 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/regexp.rb +20 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/serial.rb +8 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/slug.rb +37 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/uri.rb +29 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/uuid.rb +64 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/version.rb +5 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types/yaml.rb +36 -0
- data/lib/gems/dm-types-0.9.7/lib/dm-types.rb +28 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/absent_field_validator.rb +60 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/acceptance_validator.rb +76 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/auto_validate.rb +153 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/block_validator.rb +60 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/confirmation_validator.rb +80 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/contextual_validators.rb +56 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/custom_validator.rb +72 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/format_validator.rb +97 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/email.rb +40 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/url.rb +20 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/generic_validator.rb +100 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/length_validator.rb +113 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/method_validator.rb +68 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/numeric_validator.rb +83 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/primitive_validator.rb +60 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/required_field_validator.rb +88 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/support/object.rb +5 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/uniqueness_validator.rb +64 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/validation_errors.rb +63 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/version.rb +5 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations/within_validator.rb +53 -0
- data/lib/gems/dm-validations-0.9.7/lib/dm-validations.rb +234 -0
- data/lib/gems/json_pure-1.1.3/GPL +340 -0
- data/lib/gems/json_pure-1.1.3/VERSION +1 -0
- data/lib/gems/json_pure-1.1.3/bin/edit_json.rb +10 -0
- data/lib/gems/json_pure-1.1.3/bin/prettify_json.rb +76 -0
- data/lib/gems/json_pure-1.1.3/lib/json/Array.xpm +21 -0
- data/lib/gems/json_pure-1.1.3/lib/json/FalseClass.xpm +21 -0
- data/lib/gems/json_pure-1.1.3/lib/json/Hash.xpm +21 -0
- data/lib/gems/json_pure-1.1.3/lib/json/Key.xpm +73 -0
- data/lib/gems/json_pure-1.1.3/lib/json/NilClass.xpm +21 -0
- data/lib/gems/json_pure-1.1.3/lib/json/Numeric.xpm +28 -0
- data/lib/gems/json_pure-1.1.3/lib/json/String.xpm +96 -0
- data/lib/gems/json_pure-1.1.3/lib/json/TrueClass.xpm +21 -0
- data/lib/gems/json_pure-1.1.3/lib/json/add/core.rb +135 -0
- data/lib/gems/json_pure-1.1.3/lib/json/add/rails.rb +58 -0
- data/lib/gems/json_pure-1.1.3/lib/json/common.rb +354 -0
- data/lib/gems/json_pure-1.1.3/lib/json/editor.rb +1362 -0
- data/lib/gems/json_pure-1.1.3/lib/json/ext.rb +13 -0
- data/lib/gems/json_pure-1.1.3/lib/json/json.xpm +1499 -0
- data/lib/gems/json_pure-1.1.3/lib/json/pure/generator.rb +394 -0
- data/lib/gems/json_pure-1.1.3/lib/json/pure/parser.rb +259 -0
- data/lib/gems/json_pure-1.1.3/lib/json/pure.rb +75 -0
- data/lib/gems/json_pure-1.1.3/lib/json/version.rb +9 -0
- data/lib/gems/json_pure-1.1.3/lib/json.rb +235 -0
- data/lib/gems/launchy-0.3.2/bin/launchy +12 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/application.rb +163 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/browser.rb +85 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/command_line.rb +48 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/gemspec.rb +53 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/specification.rb +133 -0
- data/lib/gems/launchy-0.3.2/lib/launchy/version.rb +18 -0
- data/lib/gems/launchy-0.3.2/lib/launchy.rb +58 -0
- data/lib/gems/uuidtools-1.0.3/lib/uuidtools/version.rb +32 -0
- data/lib/gems/uuidtools-1.0.3/lib/uuidtools.rb +648 -0
- data/lib/gems.rb +13 -0
- data/lib/mack-data_mapper/migration_generator/migration_generator.rb +5 -0
- data/lib/mack-data_mapper/migration_generator/templates/db/migrations/%=@migration_name%.rb.template +1 -1
- data/lib/mack-data_mapper/model_generator/manifest.yml +3 -3
- data/lib/mack-data_mapper/model_generator/model_generator.rb +8 -1
- data/lib/mack-data_mapper/model_generator/templates/model.rb.template +1 -1
- data/lib/mack-data_mapper/model_generator/templates/rspec.rb.template +1 -1
- data/lib/mack-data_mapper/model_generator/templates/test_case.rb.template +1 -1
- data/lib/mack-data_mapper.rb +3 -2
- data/lib/mack-data_mapper_tasks.rb +7 -0
- metadata +235 -86
@@ -0,0 +1,61 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Types
|
3
|
+
class Flag < DataMapper::Type(Integer)
|
4
|
+
def self.inherited(target)
|
5
|
+
target.instance_variable_set("@primitive", self.primitive)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.flag_map
|
9
|
+
@flag_map
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.flag_map=(value)
|
13
|
+
@flag_map = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.new(*flags)
|
17
|
+
type = Class.new(Flag)
|
18
|
+
type.flag_map = {}
|
19
|
+
|
20
|
+
flags.each_with_index do |flag, i|
|
21
|
+
type.flag_map[2 ** i] = flag
|
22
|
+
end
|
23
|
+
|
24
|
+
type
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.[](*flags)
|
28
|
+
new(*flags)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.load(value, property)
|
32
|
+
begin
|
33
|
+
matches = []
|
34
|
+
|
35
|
+
0.upto((Math.log(value) / Math.log(2)).ceil) do |i|
|
36
|
+
pow = 2 ** i
|
37
|
+
matches << flag_map[pow] if value & pow == pow
|
38
|
+
end
|
39
|
+
|
40
|
+
matches.compact
|
41
|
+
rescue TypeError, Errno::EDOM
|
42
|
+
[]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.dump(value, property)
|
47
|
+
return if value.nil?
|
48
|
+
flags = value.is_a?(Array) ? value : [value]
|
49
|
+
flags.map!{ |f| f.to_sym }
|
50
|
+
flag_map.invert.values_at(*flags.flatten).compact.inject(0) { |sum, i| sum + i }
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.typecast(value, property)
|
54
|
+
case value
|
55
|
+
when Array then value.map {|v| v.to_sym}
|
56
|
+
else value.to_sym
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end # class Flag
|
60
|
+
end # module Types
|
61
|
+
end # module DataMapper
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'ipaddr'
|
2
|
+
|
3
|
+
module DataMapper
|
4
|
+
module Types
|
5
|
+
class IPAddress < DataMapper::Type
|
6
|
+
primitive String
|
7
|
+
|
8
|
+
def self.load(value, property)
|
9
|
+
if value.nil?
|
10
|
+
nil
|
11
|
+
elsif value.is_a?(String) && !value.empty?
|
12
|
+
IPAddr.new(value)
|
13
|
+
elsif value.is_a?(String) && value.empty?
|
14
|
+
IPAddr.new("0.0.0.0")
|
15
|
+
else
|
16
|
+
raise ArgumentError.new("+value+ must be nil or a String")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.dump(value, property)
|
21
|
+
return nil if value.nil?
|
22
|
+
value.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.typecast(value, property)
|
26
|
+
value.kind_of?(IPAddr) ? value : load(value, property)
|
27
|
+
end
|
28
|
+
end # class IPAddress
|
29
|
+
end # module Types
|
30
|
+
end # module DataMapper
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module DataMapper
|
4
|
+
module Types
|
5
|
+
class Json < DataMapper::Type
|
6
|
+
primitive String
|
7
|
+
size 65535
|
8
|
+
lazy true
|
9
|
+
|
10
|
+
def self.load(value, property)
|
11
|
+
if value.nil?
|
12
|
+
nil
|
13
|
+
elsif value.is_a?(String)
|
14
|
+
::JSON.load(value)
|
15
|
+
else
|
16
|
+
raise ArgumentError.new("+value+ must be nil or a String")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.dump(value, property)
|
21
|
+
if value.nil?
|
22
|
+
nil
|
23
|
+
elsif value.is_a?(String)
|
24
|
+
value
|
25
|
+
else
|
26
|
+
::JSON.dump(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.typecast(value, property)
|
31
|
+
# Arrays and hashes are left alone, while strings are parsed as JSON.
|
32
|
+
if value.kind_of?(Array) || value.kind_of?(Hash)
|
33
|
+
value
|
34
|
+
else
|
35
|
+
::JSON.load(value.to_s)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end # class Json
|
39
|
+
end # module Types
|
40
|
+
end # module DataMapper
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Types
|
3
|
+
class Regexp < DataMapper::Type
|
4
|
+
primitive String
|
5
|
+
|
6
|
+
def self.load(value, property)
|
7
|
+
::Regexp.new(value) unless value.nil?
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.dump(value, property)
|
11
|
+
return nil if value.nil?
|
12
|
+
value.source
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.typecast(value, property)
|
16
|
+
value.kind_of?(::Regexp) ? value : load(value, property)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'iconv'
|
2
|
+
|
3
|
+
module DataMapper
|
4
|
+
module Types
|
5
|
+
class Slug < DataMapper::Type
|
6
|
+
primitive String
|
7
|
+
size 65535
|
8
|
+
|
9
|
+
def self.load(value, property)
|
10
|
+
value
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.dump(value, property)
|
14
|
+
if value.nil?
|
15
|
+
nil
|
16
|
+
elsif value.is_a?(String)
|
17
|
+
#Iconv.new('UTF-8//TRANSLIT//IGNORE', 'UTF-8').iconv(value.gsub(/[^\w\s\-\—]/,'').gsub(/[^\w]|[\_]/,' ').split.join('-').downcase).to_s
|
18
|
+
escape(value)
|
19
|
+
else
|
20
|
+
raise ArgumentError.new("+value+ must be nil or a String")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Hugs and kisses to Rick Olsons permalink_fu for the escape method
|
25
|
+
def self.escape(string)
|
26
|
+
result = Iconv.iconv('ascii//translit//IGNORE', 'utf-8', string).to_s
|
27
|
+
result.gsub!(/[^\x00-\x7F]+/, '') # Remove anything non-ASCII entirely (e.g. diacritics).
|
28
|
+
result.gsub!(/[^\w_ \-]+/i, '') # Remove unwanted chars.
|
29
|
+
result.gsub!(/[ \-]+/i, '-') # No more than one of the separator in a row.
|
30
|
+
result.gsub!(/^\-|\-$/i, '') # Remove leading/trailing separator.
|
31
|
+
result.downcase!
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
end # class Slug
|
36
|
+
end # module Types
|
37
|
+
end # module DataMapper
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'addressable/uri'
|
3
|
+
|
4
|
+
module DataMapper
|
5
|
+
module Types
|
6
|
+
class URI < DataMapper::Type
|
7
|
+
primitive String
|
8
|
+
|
9
|
+
def self.load(value, property)
|
10
|
+
Addressable::URI.parse(value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.dump(value, property)
|
14
|
+
return nil if value.nil?
|
15
|
+
value.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.typecast(value, property)
|
19
|
+
if value.kind_of?(Addressable::URI)
|
20
|
+
value
|
21
|
+
elsif value.nil?
|
22
|
+
load(nil, property)
|
23
|
+
else
|
24
|
+
load(value.to_s, property)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end # class URI
|
28
|
+
end # module Types
|
29
|
+
end # module DataMapper
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'uuidtools'
|
2
|
+
|
3
|
+
module DataMapper
|
4
|
+
module Types
|
5
|
+
# UUID Type
|
6
|
+
# First run at this, because I need it. A few caveats:
|
7
|
+
# * Only works on postgres, using the built-in native uuid type.
|
8
|
+
# To make it work in mysql, you'll have to add a typemap entry to
|
9
|
+
# the mysql_adapter. I think. I don't have mysql handy, so I'm
|
10
|
+
# not going to try. For SQLite, this will have to inherit from the
|
11
|
+
# String primitive
|
12
|
+
# * Won't accept a random default, because of the namespace clash
|
13
|
+
# between this and the UUIDtools gem. Also can't set the default
|
14
|
+
# type to UUID() (postgres-contrib's native generator) and
|
15
|
+
# automigrate, because auto_migrate! tries to make it a string "UUID()"
|
16
|
+
# Feel free to enchance this, and delete these caveats when they're fixed.
|
17
|
+
#
|
18
|
+
# -- Rando Sept 25, 08
|
19
|
+
#
|
20
|
+
# Actually, setting the primitive to "UUID" is not neccessary and causes
|
21
|
+
# a segfault when trying to query uuid's from the database. The primitive
|
22
|
+
# should be a class which has been added to the do driver you are using.
|
23
|
+
# Also, it's only neccessary to add a class to the do drivers to use as a
|
24
|
+
# primitive when a value cannot be represented as a string. A uuid can be
|
25
|
+
# represented as a string, so setting the primitive to String ensures that
|
26
|
+
# the value argument is a String containing the uuid in string form.
|
27
|
+
#
|
28
|
+
# <strike>It is still neccessary to add the UUID entry to the type map for
|
29
|
+
# each different adapter with their respective database primitive.</strike>
|
30
|
+
#
|
31
|
+
# The method that generates the SQL schema from the typemap currently
|
32
|
+
# ignores the size attribute from the type map if the primitive type
|
33
|
+
# is String. The causes the generated SQL statement to contain a size for
|
34
|
+
# a UUID column (e.g. id UUID(50)), which causes a syntax error in postgres.
|
35
|
+
# Until this is resolved, you will have to manually change the column type
|
36
|
+
# to UUID in a migration, if you want to use postgres' built in UUID type.
|
37
|
+
#
|
38
|
+
# -- benburkert Nov 15, 08
|
39
|
+
#
|
40
|
+
class UUID < DataMapper::Type
|
41
|
+
primitive String
|
42
|
+
size 36
|
43
|
+
|
44
|
+
def self.load(value, property)
|
45
|
+
return nil if value.nil?
|
46
|
+
::UUID.parse(value)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.dump(value, property)
|
50
|
+
return nil if value.nil?
|
51
|
+
value.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.typecast(value, property)
|
55
|
+
value.kind_of?(::UUID) ? value : load(value, property)
|
56
|
+
end
|
57
|
+
|
58
|
+
#::DataMapper::Property::TYPES << self
|
59
|
+
#if defined? DataMapper::Adapters::PostgresAdapter
|
60
|
+
# DataMapper::Adapters::PostgresAdapter.type_map.map(self).to('UUID').with(:size => nil)
|
61
|
+
#end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module DataMapper
|
4
|
+
module Types
|
5
|
+
class Yaml < DataMapper::Type
|
6
|
+
primitive String
|
7
|
+
size 65535
|
8
|
+
lazy true
|
9
|
+
|
10
|
+
def self.load(value, property)
|
11
|
+
if value.nil?
|
12
|
+
nil
|
13
|
+
elsif value.is_a?(String)
|
14
|
+
::YAML.load(value)
|
15
|
+
else
|
16
|
+
raise ArgumentError.new("+value+ must be nil or a String")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.dump(value, property)
|
21
|
+
if value.nil?
|
22
|
+
nil
|
23
|
+
elsif value.is_a?(String) && value =~ /^---/
|
24
|
+
value
|
25
|
+
else
|
26
|
+
::YAML.dump(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.typecast(value, property)
|
31
|
+
# No typecasting; leave values exactly as they're provided.
|
32
|
+
value
|
33
|
+
end
|
34
|
+
end # class Yaml
|
35
|
+
end # module Types
|
36
|
+
end # module DataMapper
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
gem 'dm-core', '~>0.9.7'
|
5
|
+
require 'dm-core'
|
6
|
+
|
7
|
+
dir = Pathname(__FILE__).dirname.expand_path / 'dm-types'
|
8
|
+
|
9
|
+
require dir / 'csv'
|
10
|
+
require dir / 'enum'
|
11
|
+
require dir / 'epoch_time'
|
12
|
+
require dir / 'file_path'
|
13
|
+
require dir / 'flag'
|
14
|
+
require dir / 'ip_address'
|
15
|
+
require dir / "json"""
|
16
|
+
require dir / 'uri'
|
17
|
+
require dir / 'uuid'
|
18
|
+
require dir / 'yaml'
|
19
|
+
require dir / 'serial'
|
20
|
+
require dir / 'regexp'
|
21
|
+
require dir / 'slug'
|
22
|
+
|
23
|
+
# this looks a little ugly, but everyone who uses dm-types shouldn't have to have ruby-bcrypt installed
|
24
|
+
module DataMapper
|
25
|
+
module Types
|
26
|
+
autoload(:BCryptHash, File.join(Pathname(__FILE__).dirname.expand_path, 'dm-types', 'bcrypt_hash'))
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Validate
|
3
|
+
|
4
|
+
##
|
5
|
+
#
|
6
|
+
# @author Guy van den Berg
|
7
|
+
# @since 0.9
|
8
|
+
class AbsentFieldValidator < GenericValidator
|
9
|
+
|
10
|
+
def initialize(field_name, options={})
|
11
|
+
super
|
12
|
+
@field_name, @options = field_name, options
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(target)
|
16
|
+
field_value = target.send(field_name).blank?
|
17
|
+
return true if field_value
|
18
|
+
|
19
|
+
error_message = @options[:message] || "%s must be absent".t(Extlib::Inflection.humanize(@field_name))
|
20
|
+
add_error(target, error_message , @field_name)
|
21
|
+
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
end # class AbsentFieldValidator
|
25
|
+
|
26
|
+
module ValidatesAbsent
|
27
|
+
|
28
|
+
##
|
29
|
+
# Validates that the specified attribute is "blank" via the attribute's
|
30
|
+
# #blank? method.
|
31
|
+
#
|
32
|
+
# @note
|
33
|
+
# dm-core's support lib adds the #blank? method to many classes,
|
34
|
+
# @see lib/dm-core/support/blank.rb (dm-core) for more information.
|
35
|
+
#
|
36
|
+
# @example [Usage]
|
37
|
+
# require 'dm-validations'
|
38
|
+
#
|
39
|
+
# class Page
|
40
|
+
# include DataMapper::Resource
|
41
|
+
#
|
42
|
+
# property :unwanted_attribute, String
|
43
|
+
# property :another_unwanted, String
|
44
|
+
# property :yet_again, String
|
45
|
+
#
|
46
|
+
# validates_absent :unwanted_attribute
|
47
|
+
# validates_absent :another_unwanted, :yet_again
|
48
|
+
#
|
49
|
+
# # a call to valid? will return false unless
|
50
|
+
# # all three attributes are blank
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
def validates_absent(*fields)
|
54
|
+
opts = opts_from_validator_args(fields)
|
55
|
+
add_validator_to_context(opts, fields, DataMapper::Validate::AbsentFieldValidator)
|
56
|
+
end
|
57
|
+
|
58
|
+
end # module ValidatesAbsent
|
59
|
+
end # module Validate
|
60
|
+
end # module DataMapper
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Validate
|
3
|
+
|
4
|
+
##
|
5
|
+
#
|
6
|
+
# @author Martin Kihlgren
|
7
|
+
# @since 0.9
|
8
|
+
class AcceptanceValidator < GenericValidator
|
9
|
+
|
10
|
+
def self.default_message_for_field(field_name)
|
11
|
+
'%s is not accepted'.t(Extlib::Inflection.humanize(field_name))
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(field_name, options = {})
|
15
|
+
super
|
16
|
+
@options = options
|
17
|
+
@field_name = field_name
|
18
|
+
@options[:allow_nil] = true unless @options.include?(:allow_nil)
|
19
|
+
@options[:accept] ||= ["1",1,"true",true,"t"]
|
20
|
+
@options[:accept] = Array(@options[:accept])
|
21
|
+
end
|
22
|
+
|
23
|
+
def call(target)
|
24
|
+
unless valid?(target)
|
25
|
+
error_message = @options[:message] || DataMapper::Validate::AcceptanceValidator.default_message_for_field(@field_name)
|
26
|
+
add_error(target, error_message , @field_name)
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
|
33
|
+
def valid?(target)
|
34
|
+
field_value = target.instance_variable_get("@#{@field_name}")
|
35
|
+
return true if @options[:allow_nil] && field_value.nil?
|
36
|
+
return false if !@options[:allow_nil] && field_value.nil?
|
37
|
+
|
38
|
+
@options[:accept].include?(field_value)
|
39
|
+
end
|
40
|
+
|
41
|
+
end # class AcceptanceValidator
|
42
|
+
|
43
|
+
module ValidatesIsAccepted
|
44
|
+
|
45
|
+
##
|
46
|
+
# Validates that the attributes's value is in the set of accepted values.
|
47
|
+
#
|
48
|
+
# @option :allow_nil<Boolean> true if nil is allowed, false if nil is not
|
49
|
+
# allowed. Default is true.
|
50
|
+
# @option :accept<Array> a list of accepted values.
|
51
|
+
# Default are ["1",1,"true",true,"t"]).
|
52
|
+
#
|
53
|
+
# @example [Usage]
|
54
|
+
# require 'dm-validations'
|
55
|
+
#
|
56
|
+
# class Page
|
57
|
+
# include DataMapper::Resource
|
58
|
+
#
|
59
|
+
# property :license_agreement_accepted, String
|
60
|
+
# property :terms_accepted, String
|
61
|
+
# validates_is_accepted :license_agreement, :accept => "1"
|
62
|
+
# validates_is_accepted :terms_accepted, :allow_nil => false
|
63
|
+
#
|
64
|
+
# # a call to valid? will return false unless:
|
65
|
+
# # license_agreement is nil or "1"
|
66
|
+
# # and
|
67
|
+
# # terms_accepted is one of ["1",1,"true",true,"t"]
|
68
|
+
#
|
69
|
+
def validates_is_accepted(*fields)
|
70
|
+
opts = opts_from_validator_args(fields)
|
71
|
+
add_validator_to_context(opts, fields, DataMapper::Validate::AcceptanceValidator)
|
72
|
+
end
|
73
|
+
|
74
|
+
end # module ValidatesIsAccepted
|
75
|
+
end # module Validate
|
76
|
+
end # module DataMapper
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module DataMapper
|
2
|
+
class Property
|
3
|
+
# for options_with_message
|
4
|
+
PROPERTY_OPTIONS << :message << :messages << :set
|
5
|
+
end
|
6
|
+
|
7
|
+
module Validate
|
8
|
+
module AutoValidate
|
9
|
+
# adds message for validator
|
10
|
+
def options_with_message(base_options, property, validator_name)
|
11
|
+
options = base_options.clone
|
12
|
+
opts = property.options
|
13
|
+
options[:message] = if opts[:messages]
|
14
|
+
if opts[:messages].is_a?(Hash) and msg = opts[:messages][validator_name]
|
15
|
+
msg
|
16
|
+
else
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
elsif opts[:message]
|
20
|
+
opts[:message]
|
21
|
+
else
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
options
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
##
|
29
|
+
# Auto-generate validations for a given property. This will only occur
|
30
|
+
# if the option :auto_validation is either true or left undefined.
|
31
|
+
#
|
32
|
+
# @details [Triggers]
|
33
|
+
# Triggers that generate validator creation
|
34
|
+
#
|
35
|
+
# :nullable => false
|
36
|
+
# Setting the option :nullable to false causes a
|
37
|
+
# validates_presence_of validator to be automatically created on
|
38
|
+
# the property
|
39
|
+
#
|
40
|
+
# :size => 20 or :length => 20
|
41
|
+
# Setting the option :size or :length causes a validates_length_of
|
42
|
+
# validator to be automatically created on the property. If the
|
43
|
+
# value is a Integer the validation will set :maximum => value if
|
44
|
+
# the value is a Range the validation will set :within => value
|
45
|
+
#
|
46
|
+
# :format => :predefined / lambda / Proc
|
47
|
+
# Setting the :format option causes a validates_format_of
|
48
|
+
# validator to be automatically created on the property
|
49
|
+
#
|
50
|
+
# :set => ["foo", "bar", "baz"]
|
51
|
+
# Setting the :set option causes a validates_within
|
52
|
+
# validator to be automatically created on the property
|
53
|
+
#
|
54
|
+
# Integer type
|
55
|
+
# Using a Integer type causes a validates_is_number
|
56
|
+
# validator to be created for the property. integer_only
|
57
|
+
# is set to true
|
58
|
+
#
|
59
|
+
# BigDecimal or Float type
|
60
|
+
# Using a Integer type causes a validates_is_number
|
61
|
+
# validator to be created for the property. integer_only
|
62
|
+
# is set to false, and precision/scale match the property
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# Messages
|
66
|
+
#
|
67
|
+
# :messages => {..}
|
68
|
+
# Setting :messages hash replaces standard error messages
|
69
|
+
# with custom ones. For instance:
|
70
|
+
# :messages => {:presence => "Field is required",
|
71
|
+
# :format => "Field has invalid format"}
|
72
|
+
# Hash keys are: :presence, :format, :length, :is_unique,
|
73
|
+
# :is_number, :is_primitive
|
74
|
+
#
|
75
|
+
# :message => "Some message"
|
76
|
+
# It is just shortcut if only one validation option is set
|
77
|
+
#
|
78
|
+
def auto_generate_validations(property)
|
79
|
+
property.options[:auto_validation] = true unless property.options.has_key?(:auto_validation)
|
80
|
+
return unless property.options[:auto_validation]
|
81
|
+
|
82
|
+
# a serial property is allowed to be nil too, because the
|
83
|
+
# value is set by the storage system
|
84
|
+
opts = { :allow_nil => property.nullable? || property.serial? }
|
85
|
+
opts[:context] = property.options[:validates] if property.options.has_key?(:validates)
|
86
|
+
|
87
|
+
# presence
|
88
|
+
unless opts[:allow_nil]
|
89
|
+
# validates_present property.name, opts
|
90
|
+
validates_present property.name, options_with_message(opts, property, :presence)
|
91
|
+
end
|
92
|
+
|
93
|
+
# length
|
94
|
+
if property.type == String
|
95
|
+
#len = property.length # XXX: maybe length should always return a Range, with the min defaulting to 1
|
96
|
+
len = property.options.fetch(:length, property.options.fetch(:size, DataMapper::Property::DEFAULT_LENGTH))
|
97
|
+
if len.is_a?(Range)
|
98
|
+
opts[:within] = len
|
99
|
+
else
|
100
|
+
opts[:maximum] = len
|
101
|
+
end
|
102
|
+
# validates_length property.name, opts
|
103
|
+
validates_length property.name, options_with_message(opts, property, :length)
|
104
|
+
end
|
105
|
+
|
106
|
+
# format
|
107
|
+
if property.options.has_key?(:format)
|
108
|
+
opts[:with] = property.options[:format]
|
109
|
+
# validates_format property.name, opts
|
110
|
+
validates_format property.name, options_with_message(opts, property, :format)
|
111
|
+
end
|
112
|
+
|
113
|
+
# uniqueness validator
|
114
|
+
if property.options.has_key?(:unique)
|
115
|
+
value = property.options[:unique]
|
116
|
+
if value.is_a?(Array) || value.is_a?(Symbol)
|
117
|
+
# validates_is_unique property.name, :scope => Array(value)
|
118
|
+
validates_is_unique property.name, options_with_message({:scope => Array(value)}, property, :is_unique)
|
119
|
+
elsif value.is_a?(TrueClass)
|
120
|
+
# validates_is_unique property.name
|
121
|
+
validates_is_unique property.name, options_with_message({}, property, :is_unique)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# within validator
|
126
|
+
if property.options.has_key?(:set)
|
127
|
+
validates_within property.name, options_with_message({:set => property.options[:set]}, property, :within)
|
128
|
+
end
|
129
|
+
|
130
|
+
# numeric validator
|
131
|
+
if Integer == property.type
|
132
|
+
opts[:integer_only] = true
|
133
|
+
# validates_is_number property.name, opts
|
134
|
+
validates_is_number property.name, options_with_message(opts, property, :is_number)
|
135
|
+
elsif BigDecimal == property.type || Float == property.type
|
136
|
+
opts[:precision] = property.precision
|
137
|
+
opts[:scale] = property.scale
|
138
|
+
# validates_is_number property.name, opts
|
139
|
+
validates_is_number property.name, options_with_message(opts, property, :is_number)
|
140
|
+
else
|
141
|
+
# We only need this in the case we don't already
|
142
|
+
# have a numeric validator, because otherwise
|
143
|
+
# it will cause duplicate validation errors
|
144
|
+
unless property.custom?
|
145
|
+
# validates_is_primitive property.name, opts
|
146
|
+
validates_is_primitive property.name, options_with_message(opts, property, :is_primitive)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
end # module AutoValidate
|
152
|
+
end # module Validate
|
153
|
+
end # module DataMapper
|