mack-data_mapper 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|