dm-types 0.9.11 → 0.10.0
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/{History.txt → History.rdoc} +5 -4
- data/LICENSE +16 -14
- data/Manifest.txt +13 -3
- data/{README.txt → README.rdoc} +0 -0
- data/Rakefile +3 -4
- data/TODO +74 -0
- data/lib/dm-types.rb +15 -18
- data/lib/dm-types/bcrypt_hash.rb +1 -4
- data/lib/dm-types/comma_separated_list.rb +31 -0
- data/lib/dm-types/csv.rb +12 -18
- data/lib/dm-types/enum.rb +18 -15
- data/lib/dm-types/epoch_time.rb +6 -11
- data/lib/dm-types/file_path.rb +5 -4
- data/lib/dm-types/flag.rb +14 -13
- data/lib/dm-types/ip_address.rb +1 -0
- data/lib/dm-types/json.rb +5 -11
- data/lib/dm-types/regexp.rb +2 -3
- data/lib/dm-types/slug.rb +8 -17
- data/lib/dm-types/uri.rb +8 -14
- data/lib/dm-types/uuid.rb +9 -15
- data/lib/dm-types/version.rb +1 -1
- data/lib/dm-types/yaml.rb +4 -3
- data/spec/fixtures/article.rb +39 -0
- data/spec/fixtures/bookmark.rb +27 -0
- data/spec/fixtures/invention.rb +9 -0
- data/spec/fixtures/network_node.rb +40 -0
- data/spec/fixtures/person.rb +29 -0
- data/spec/fixtures/software_package.rb +37 -0
- data/spec/fixtures/ticket.rb +25 -0
- data/spec/fixtures/tshirt.rb +28 -0
- data/spec/integration/bcrypt_hash_spec.rb +37 -55
- data/spec/integration/comma_separated_list_spec.rb +89 -0
- data/spec/integration/enum_spec.rb +62 -42
- data/spec/integration/file_path_spec.rb +149 -17
- data/spec/integration/flag_spec.rb +56 -25
- data/spec/integration/ip_address_spec.rb +142 -17
- data/spec/integration/json_spec.rb +60 -17
- data/spec/integration/slug_spec.rb +39 -40
- data/spec/integration/uri_spec.rb +126 -21
- data/spec/integration/uuid_spec.rb +84 -30
- data/spec/integration/yaml_spec.rb +55 -25
- data/spec/shared/identity_function_group.rb +5 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +49 -17
- data/spec/unit/bcrypt_hash_spec.rb +107 -64
- data/spec/unit/csv_spec.rb +111 -27
- data/spec/unit/enum_spec.rb +128 -87
- data/spec/unit/epoch_time_spec.rb +57 -32
- data/spec/unit/file_path_spec.rb +55 -34
- data/spec/unit/flag_spec.rb +102 -65
- data/spec/unit/ip_address_spec.rb +90 -40
- data/spec/unit/json_spec.rb +108 -41
- data/spec/unit/regexp_spec.rb +47 -17
- data/spec/unit/uri_spec.rb +57 -46
- data/spec/unit/yaml_spec.rb +91 -45
- data/tasks/install.rb +1 -1
- data/tasks/spec.rb +4 -4
- metadata +25 -32
- data/lib/dm-types/serial.rb +0 -8
@@ -1,9 +1,10 @@
|
|
1
|
-
=== 0.
|
1
|
+
=== 0.10.0 / 2009-10-15
|
2
2
|
|
3
|
-
*
|
3
|
+
* Updated to work with dm-core 0.10.0
|
4
|
+
|
5
|
+
=== 0.9.11 / 2009-03-29
|
4
6
|
|
5
|
-
|
6
|
-
* Remove dependency on json
|
7
|
+
* No changes this version
|
7
8
|
|
8
9
|
=== 0.9.10 / 2009-01-19
|
9
10
|
|
data/LICENSE
CHANGED
@@ -1,20 +1,22 @@
|
|
1
|
-
Copyright (c) 2007 Sam Smoot
|
1
|
+
Copyright (c) 2007, 2008, 2009 Sam Smoot, Dan Kubb
|
2
2
|
|
3
|
-
Permission is hereby granted, free of charge, to any person
|
4
|
-
a copy of this software and associated documentation
|
5
|
-
"Software"), to deal in the Software without
|
6
|
-
without limitation the rights to use,
|
7
|
-
distribute, sublicense, and/or sell
|
8
|
-
|
9
|
-
the following
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
10
11
|
|
11
12
|
The above copyright notice and this permission notice shall be
|
12
13
|
included in all copies or substantial portions of the Software.
|
13
14
|
|
14
15
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20
|
-
WITH THE SOFTWARE OR THE USE OR
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest.txt
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
History.
|
1
|
+
History.rdoc
|
2
2
|
LICENSE
|
3
3
|
Manifest.txt
|
4
|
-
README.
|
4
|
+
README.rdoc
|
5
5
|
Rakefile
|
6
6
|
TODO
|
7
7
|
lib/dm-types.rb
|
8
8
|
lib/dm-types/bcrypt_hash.rb
|
9
|
+
lib/dm-types/comma_separated_list.rb
|
9
10
|
lib/dm-types/csv.rb
|
10
11
|
lib/dm-types/enum.rb
|
11
12
|
lib/dm-types/epoch_time.rb
|
@@ -14,13 +15,21 @@ lib/dm-types/flag.rb
|
|
14
15
|
lib/dm-types/ip_address.rb
|
15
16
|
lib/dm-types/json.rb
|
16
17
|
lib/dm-types/regexp.rb
|
17
|
-
lib/dm-types/serial.rb
|
18
18
|
lib/dm-types/slug.rb
|
19
19
|
lib/dm-types/uri.rb
|
20
20
|
lib/dm-types/uuid.rb
|
21
21
|
lib/dm-types/version.rb
|
22
22
|
lib/dm-types/yaml.rb
|
23
|
+
spec/fixtures/article.rb
|
24
|
+
spec/fixtures/bookmark.rb
|
25
|
+
spec/fixtures/invention.rb
|
26
|
+
spec/fixtures/network_node.rb
|
27
|
+
spec/fixtures/person.rb
|
28
|
+
spec/fixtures/software_package.rb
|
29
|
+
spec/fixtures/ticket.rb
|
30
|
+
spec/fixtures/tshirt.rb
|
23
31
|
spec/integration/bcrypt_hash_spec.rb
|
32
|
+
spec/integration/comma_separated_list_spec.rb
|
24
33
|
spec/integration/enum_spec.rb
|
25
34
|
spec/integration/file_path_spec.rb
|
26
35
|
spec/integration/flag_spec.rb
|
@@ -30,6 +39,7 @@ spec/integration/slug_spec.rb
|
|
30
39
|
spec/integration/uri_spec.rb
|
31
40
|
spec/integration/uuid_spec.rb
|
32
41
|
spec/integration/yaml_spec.rb
|
42
|
+
spec/shared/identity_function_group.rb
|
33
43
|
spec/spec.opts
|
34
44
|
spec/spec_helper.rb
|
35
45
|
spec/unit/bcrypt_hash_spec.rb
|
data/{README.txt → README.rdoc}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'pathname'
|
2
|
-
require 'rubygems'
|
3
2
|
|
4
3
|
ROOT = Pathname(__FILE__).dirname.expand_path
|
5
4
|
JRUBY = RUBY_PLATFORM =~ /java/
|
@@ -12,12 +11,12 @@ AUTHOR = 'Sam Smoot'
|
|
12
11
|
EMAIL = 'ssmoot [a] gmail [d] com'
|
13
12
|
GEM_NAME = 'dm-types'
|
14
13
|
GEM_VERSION = DataMapper::Types::VERSION
|
15
|
-
GEM_DEPENDENCIES = [['dm-core', GEM_VERSION]
|
14
|
+
GEM_DEPENDENCIES = [['dm-core', GEM_VERSION]]
|
16
15
|
GEM_CLEAN = %w[ log pkg coverage ]
|
17
|
-
GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.
|
16
|
+
GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.rdoc LICENSE TODO History.rdoc ] }
|
18
17
|
|
19
18
|
PROJECT_NAME = 'datamapper'
|
20
|
-
PROJECT_URL = "http://github.com/
|
19
|
+
PROJECT_URL = "http://github.com/datamapper/dm-more/tree/master/#{GEM_NAME}"
|
21
20
|
PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'DataMapper plugin providing extra data types'
|
22
21
|
|
23
22
|
[ ROOT, ROOT.parent ].each do |dir|
|
data/TODO
CHANGED
@@ -0,0 +1,74 @@
|
|
1
|
+
### -*- mode:org -*-
|
2
|
+
|
3
|
+
* Spec suite improvement
|
4
|
+
** integration
|
5
|
+
*** DONE bcrypt_hash_spec.rb
|
6
|
+
*** DONE enum_spec.rb
|
7
|
+
*** DONE file_path_spec.rb
|
8
|
+
*** DONE flag_spec.rb
|
9
|
+
*** DONE ip_address_spec.rb
|
10
|
+
*** DONE json_spec.rb
|
11
|
+
*** DONE slug_spec.rb
|
12
|
+
*** DONE uri_spec.rb
|
13
|
+
*** DONE uuid_spec.rb
|
14
|
+
*** DONE yaml_spec.rb
|
15
|
+
|
16
|
+
MK reworked spec suite to the point we actually
|
17
|
+
can trust it
|
18
|
+
|
19
|
+
** fixtures
|
20
|
+
|
21
|
+
It should be perfectly possible to combine fixture
|
22
|
+
models from dm-validations and dm-types, and publish
|
23
|
+
a little gem that all DM plugins developers can use
|
24
|
+
as a basis
|
25
|
+
|
26
|
+
*** TODO Investigate if sharing of models across DM plugins makes sense
|
27
|
+
|
28
|
+
* Ideas/prototypes of New types
|
29
|
+
** SHA1 hash
|
30
|
+
|
31
|
+
Case: when you want to compute SHA1 of another property
|
32
|
+
and store it. Useful for file stores, caching and other things.
|
33
|
+
|
34
|
+
Would be a good example of how types can interact with models
|
35
|
+
via property binding
|
36
|
+
|
37
|
+
** LowercaseString
|
38
|
+
|
39
|
+
A string type subclass that downcases the input
|
40
|
+
|
41
|
+
Case: CASES WHERE YOU WOULD HATE TO SEE UPPERCASE!
|
42
|
+
|
43
|
+
** EmbeddedValue
|
44
|
+
|
45
|
+
An experiment of type/model interaction: takes a class
|
46
|
+
and uses YAML/JSON for serialization
|
47
|
+
|
48
|
+
To complete the picture we would need to add validation
|
49
|
+
delegation (so embedded object can add errors to
|
50
|
+
the parent if it makes sense), but it would be helpful
|
51
|
+
to shape up Property/Type refactoring, and should take
|
52
|
+
as little time as one evening
|
53
|
+
|
54
|
+
** ZIP
|
55
|
+
|
56
|
+
Input: a string, output: a ZIP object that is smart enough
|
57
|
+
to provide predicates
|
58
|
+
|
59
|
+
Need to find a library for zips that would fit
|
60
|
+
|
61
|
+
** Address
|
62
|
+
|
63
|
+
Same as ZIP but for actuall address. Again, stored
|
64
|
+
in YAML I suppose
|
65
|
+
|
66
|
+
** Coordinate
|
67
|
+
|
68
|
+
Input: two floats or two strings can be cast to floats,
|
69
|
+
output: object that knows how to render a map for itself
|
70
|
+
|
71
|
+
** DNA
|
72
|
+
|
73
|
+
Mostly for fun, to see how far we can push current types API
|
74
|
+
with little help from BioRuby
|
data/lib/dm-types.rb
CHANGED
@@ -1,26 +1,23 @@
|
|
1
1
|
require 'pathname'
|
2
|
-
require 'rubygems'
|
3
|
-
|
4
|
-
gem 'dm-core', '0.9.11'
|
5
|
-
require 'dm-core'
|
6
2
|
|
7
3
|
module DataMapper
|
8
4
|
module Types
|
9
5
|
dir = (Pathname(__FILE__).dirname.expand_path / 'dm-types').to_s
|
10
6
|
|
11
|
-
autoload :BCryptHash,
|
12
|
-
autoload :
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
23
|
-
autoload :
|
24
|
-
autoload :
|
7
|
+
autoload :BCryptHash, dir / 'bcrypt_hash'
|
8
|
+
autoload :CommaSeparatedList, dir / 'comma_separated_list'
|
9
|
+
autoload :Csv, dir / 'csv'
|
10
|
+
autoload :Enum, dir / 'enum'
|
11
|
+
autoload :EpochTime, dir / 'epoch_time'
|
12
|
+
autoload :FilePath, dir / 'file_path'
|
13
|
+
autoload :Flag, dir / 'flag'
|
14
|
+
autoload :IPAddress, dir / 'ip_address'
|
15
|
+
autoload :Json, dir / 'json'
|
16
|
+
autoload :Regexp, dir / 'regexp'
|
17
|
+
autoload :Serial, dir / 'serial'
|
18
|
+
autoload :Slug, dir / 'slug'
|
19
|
+
autoload :URI, dir / 'uri'
|
20
|
+
autoload :UUID, dir / 'uuid'
|
21
|
+
autoload :Yaml, dir / 'yaml'
|
25
22
|
end
|
26
23
|
end
|
data/lib/dm-types/bcrypt_hash.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
gem 'bcrypt-ruby', '~>2.0.5'
|
4
1
|
require 'bcrypt'
|
5
2
|
|
6
3
|
module DataMapper
|
7
4
|
module Types
|
8
5
|
class BCryptHash < DataMapper::Type
|
9
6
|
primitive String
|
10
|
-
|
7
|
+
length 60
|
11
8
|
|
12
9
|
def self.load(value, property)
|
13
10
|
typecast(value, property)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Types
|
3
|
+
|
4
|
+
class CommaSeparatedList < Yaml
|
5
|
+
# this must be set even though Yaml already
|
6
|
+
# uses String primitive
|
7
|
+
#
|
8
|
+
# current DM::Type behavior probably needs to
|
9
|
+
# be improved for cases like this
|
10
|
+
primitive String
|
11
|
+
|
12
|
+
def self.dump(value, property)
|
13
|
+
if value.nil?
|
14
|
+
nil
|
15
|
+
elsif value.kind_of?(Array)
|
16
|
+
super(value, property)
|
17
|
+
elsif value.kind_of?(String)
|
18
|
+
v = (value || "").split(",").
|
19
|
+
compact.
|
20
|
+
map { |i| i.downcase.strip }.
|
21
|
+
reject { |i| i.blank? }.
|
22
|
+
uniq
|
23
|
+
super(v, property)
|
24
|
+
else
|
25
|
+
raise ArgumentError, "+value+ of CommaSeparatedList must be a string, an array or nil, but given #{value.inspect}"
|
26
|
+
end
|
27
|
+
end # self.dump
|
28
|
+
end # CommaSeparatedList
|
29
|
+
|
30
|
+
end # Types
|
31
|
+
end # DataMapper
|
data/lib/dm-types/csv.rb
CHANGED
@@ -1,37 +1,31 @@
|
|
1
1
|
if RUBY_VERSION >= '1.9.0'
|
2
|
-
|
2
|
+
require 'csv'
|
3
3
|
else
|
4
|
-
|
5
|
-
|
6
|
-
require 'fastercsv'
|
7
|
-
CSV = FasterCSV
|
8
|
-
rescue LoadError
|
9
|
-
nil
|
10
|
-
end
|
4
|
+
require 'fastercsv' # must be ~>1.5
|
5
|
+
CSV = FasterCSV unless defined?(CSV)
|
11
6
|
end
|
12
7
|
|
13
8
|
module DataMapper
|
14
9
|
module Types
|
15
10
|
class Csv < DataMapper::Type
|
16
11
|
primitive Text
|
17
|
-
lazy
|
12
|
+
lazy true
|
18
13
|
|
19
14
|
def self.load(value, property)
|
20
15
|
case value
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
when String then CSV.parse(value)
|
17
|
+
when Array then value
|
18
|
+
else
|
19
|
+
nil
|
24
20
|
end
|
25
21
|
end
|
26
22
|
|
27
23
|
def self.dump(value, property)
|
28
24
|
case value
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
when String then value
|
34
|
-
else nil
|
25
|
+
when Array then CSV.generate { |csv| value.each { |row| csv << row } }
|
26
|
+
when String then value
|
27
|
+
else
|
28
|
+
nil
|
35
29
|
end
|
36
30
|
end
|
37
31
|
end # class Csv
|
data/lib/dm-types/enum.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module DataMapper
|
2
2
|
module Types
|
3
|
-
class Enum <
|
3
|
+
class Enum < Type
|
4
|
+
primitive Integer
|
5
|
+
|
4
6
|
def self.inherited(target)
|
5
7
|
target.instance_variable_set("@primitive", self.primitive)
|
6
8
|
end
|
@@ -49,22 +51,23 @@ module DataMapper
|
|
49
51
|
else value
|
50
52
|
end
|
51
53
|
end
|
52
|
-
end # class Enum
|
53
|
-
end # module Types
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
alias :orig_auto_generate_validations :auto_generate_validations
|
59
|
-
def auto_generate_validations(property)
|
60
|
-
orig_auto_generate_validations(property)
|
61
|
-
return unless property.options[:auto_validation]
|
55
|
+
def self.bind(property)
|
56
|
+
if defined?(::DataMapper::Validate)
|
57
|
+
model = property.model
|
62
58
|
|
63
|
-
|
64
|
-
|
59
|
+
unless model.skip_auto_validation_for?(property)
|
60
|
+
if property.type.ancestors.include?(Types::Enum)
|
61
|
+
model.class_eval do
|
62
|
+
flag_map = property.type.flag_map
|
63
|
+
allowed = flag_map.values_at(*flag_map.keys.sort)
|
64
|
+
|
65
|
+
validates_within property.name, options_with_message({ :set => allowed }, property, :within)
|
66
|
+
end
|
67
|
+
end
|
65
68
|
end
|
66
69
|
end
|
67
70
|
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end #
|
71
|
+
end # class Enum
|
72
|
+
end # module Types
|
73
|
+
end # module DataMapper
|
data/lib/dm-types/epoch_time.rb
CHANGED
@@ -4,8 +4,7 @@ module DataMapper
|
|
4
4
|
primitive Integer
|
5
5
|
|
6
6
|
def self.load(value, property)
|
7
|
-
|
8
|
-
when Integer
|
7
|
+
if value.kind_of?(Integer)
|
9
8
|
Time.at(value)
|
10
9
|
else
|
11
10
|
value
|
@@ -14,14 +13,10 @@ module DataMapper
|
|
14
13
|
|
15
14
|
def self.dump(value, property)
|
16
15
|
case value
|
17
|
-
|
18
|
-
value
|
19
|
-
when Time
|
20
|
-
value.to_i
|
21
|
-
when DateTime
|
22
|
-
Time.parse(value.to_s).to_i
|
16
|
+
when Integer, Time then value.to_i
|
17
|
+
when DateTime then value.to_time.to_i
|
23
18
|
end
|
24
19
|
end
|
25
|
-
end #
|
26
|
-
end #
|
27
|
-
end #
|
20
|
+
end # class EpochTime
|
21
|
+
end # module Types
|
22
|
+
end # module DataMapper
|
data/lib/dm-types/file_path.rb
CHANGED
@@ -4,9 +4,10 @@ module DataMapper
|
|
4
4
|
module Types
|
5
5
|
class FilePath < DataMapper::Type
|
6
6
|
primitive String
|
7
|
+
length 255
|
7
8
|
|
8
9
|
def self.load(value, property)
|
9
|
-
if value.
|
10
|
+
if value.blank?
|
10
11
|
nil
|
11
12
|
else
|
12
13
|
Pathname.new(value)
|
@@ -14,7 +15,7 @@ module DataMapper
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def self.dump(value, property)
|
17
|
-
return nil if value.
|
18
|
+
return nil if value.blank?
|
18
19
|
value.to_s
|
19
20
|
end
|
20
21
|
|
@@ -23,5 +24,5 @@ module DataMapper
|
|
23
24
|
value.kind_of?(Pathname) ? value : load(value, property)
|
24
25
|
end
|
25
26
|
end # class FilePath
|
26
|
-
end #
|
27
|
-
end #
|
27
|
+
end # module Types
|
28
|
+
end # module DataMapper
|