sbf-dm-types 1.3.0.beta

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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +45 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +468 -0
  5. data/.travis.yml +52 -0
  6. data/Gemfile +67 -0
  7. data/LICENSE +20 -0
  8. data/README.rdoc +3 -0
  9. data/Rakefile +4 -0
  10. data/dm-types.gemspec +26 -0
  11. data/lib/dm-types/api_key.rb +30 -0
  12. data/lib/dm-types/bcrypt_hash.rb +33 -0
  13. data/lib/dm-types/comma_separated_list.rb +28 -0
  14. data/lib/dm-types/csv.rb +34 -0
  15. data/lib/dm-types/enum.rb +55 -0
  16. data/lib/dm-types/epoch_time.rb +35 -0
  17. data/lib/dm-types/file_path.rb +24 -0
  18. data/lib/dm-types/flag.rb +64 -0
  19. data/lib/dm-types/ip_address.rb +34 -0
  20. data/lib/dm-types/json.rb +48 -0
  21. data/lib/dm-types/paranoid/base.rb +56 -0
  22. data/lib/dm-types/paranoid_boolean.rb +23 -0
  23. data/lib/dm-types/paranoid_datetime.rb +22 -0
  24. data/lib/dm-types/regexp.rb +21 -0
  25. data/lib/dm-types/slug.rb +28 -0
  26. data/lib/dm-types/support/dirty_minder.rb +168 -0
  27. data/lib/dm-types/support/flags.rb +41 -0
  28. data/lib/dm-types/uri.rb +27 -0
  29. data/lib/dm-types/uuid.rb +64 -0
  30. data/lib/dm-types/version.rb +5 -0
  31. data/lib/dm-types/yaml.rb +39 -0
  32. data/lib/dm-types.rb +23 -0
  33. data/spec/fixtures/api_user.rb +14 -0
  34. data/spec/fixtures/article.rb +35 -0
  35. data/spec/fixtures/bookmark.rb +23 -0
  36. data/spec/fixtures/invention.rb +7 -0
  37. data/spec/fixtures/network_node.rb +36 -0
  38. data/spec/fixtures/person.rb +25 -0
  39. data/spec/fixtures/software_package.rb +33 -0
  40. data/spec/fixtures/ticket.rb +21 -0
  41. data/spec/fixtures/tshirt.rb +24 -0
  42. data/spec/integration/api_key_spec.rb +27 -0
  43. data/spec/integration/bcrypt_hash_spec.rb +47 -0
  44. data/spec/integration/comma_separated_list_spec.rb +87 -0
  45. data/spec/integration/dirty_minder_spec.rb +197 -0
  46. data/spec/integration/enum_spec.rb +78 -0
  47. data/spec/integration/epoch_time_spec.rb +61 -0
  48. data/spec/integration/file_path_spec.rb +160 -0
  49. data/spec/integration/flag_spec.rb +72 -0
  50. data/spec/integration/ip_address_spec.rb +153 -0
  51. data/spec/integration/json_spec.rb +72 -0
  52. data/spec/integration/slug_spec.rb +67 -0
  53. data/spec/integration/uri_spec.rb +117 -0
  54. data/spec/integration/uuid_spec.rb +102 -0
  55. data/spec/integration/yaml_spec.rb +87 -0
  56. data/spec/shared/flags_shared_spec.rb +37 -0
  57. data/spec/shared/identity_function_group.rb +5 -0
  58. data/spec/spec_helper.rb +30 -0
  59. data/spec/unit/bcrypt_hash_spec.rb +155 -0
  60. data/spec/unit/csv_spec.rb +142 -0
  61. data/spec/unit/dirty_minder_spec.rb +65 -0
  62. data/spec/unit/enum_spec.rb +126 -0
  63. data/spec/unit/epoch_time_spec.rb +74 -0
  64. data/spec/unit/file_path_spec.rb +75 -0
  65. data/spec/unit/flag_spec.rb +114 -0
  66. data/spec/unit/ip_address_spec.rb +109 -0
  67. data/spec/unit/json_spec.rb +126 -0
  68. data/spec/unit/paranoid_boolean_spec.rb +149 -0
  69. data/spec/unit/paranoid_datetime_spec.rb +153 -0
  70. data/spec/unit/regexp_spec.rb +63 -0
  71. data/spec/unit/uri_spec.rb +83 -0
  72. data/spec/unit/yaml_spec.rb +111 -0
  73. data/tasks/spec.rake +21 -0
  74. data/tasks/yard.rake +9 -0
  75. data/tasks/yardstick.rake +19 -0
  76. metadata +229 -0
@@ -0,0 +1,153 @@
1
+ require_relative '../spec_helper'
2
+
3
+ RSpec::Matchers.define :run_ipv4 do
4
+ match(&:runs_ipv4?)
5
+ end
6
+
7
+ RSpec::Matchers.define :run_ipv6 do
8
+ match(&:runs_ipv6?)
9
+ end
10
+
11
+ try_spec do
12
+
13
+ require_relative '../fixtures/network_node'
14
+
15
+ describe DataMapper::TypesFixtures::NetworkNode do
16
+ supported_by :all do
17
+ before :all do
18
+ @resource = DataMapper::TypesFixtures::NetworkNode.new(
19
+ :node_uuid => '25a44800-21c9-11de-8c30-0800200c9a66',
20
+ :ip_address => nil,
21
+ :cidr_subnet_bits => nil
22
+ )
23
+ end
24
+
25
+ describe 'with IP address fe80::ab8:e8ff:fed7:f8c9' do
26
+ before :all do
27
+ @resource.ip_address = 'fe80::ab8:e8ff:fed7:f8c9'
28
+ end
29
+
30
+ describe 'when dumped and loaded' do
31
+ before :all do
32
+ expect(@resource.save).to be(true)
33
+ @resource.reload
34
+ end
35
+
36
+ it 'is an IPv6 node' do
37
+ expect(@resource).to run_ipv6
38
+ end
39
+ end
40
+ end
41
+
42
+ describe 'with IP address 127.0.0.1' do
43
+ before :all do
44
+ @resource.ip_address = '127.0.0.1'
45
+ end
46
+
47
+ describe 'when dumped and loaded' do
48
+ before :all do
49
+ expect(@resource.save).to be(true)
50
+ @resource.reload
51
+ end
52
+
53
+ it 'is an IPv4 node' do
54
+ expect(@resource).to run_ipv4
55
+ end
56
+ end
57
+ end
58
+
59
+ describe 'with IP address 218.43.243.136' do
60
+ before :all do
61
+ @resource.ip_address = '218.43.243.136'
62
+ end
63
+
64
+ describe 'when dumped and loaded' do
65
+ before :all do
66
+ expect(@resource.save).to be(true)
67
+ @resource.reload
68
+ end
69
+
70
+ it 'is an IPv4 node' do
71
+ expect(@resource).to run_ipv4
72
+ end
73
+ end
74
+ end
75
+
76
+ describe 'with IP address 221.186.184.68' do
77
+ before :all do
78
+ @resource.ip_address = '221.186.184.68'
79
+ end
80
+
81
+ describe 'when dumped and loaded' do
82
+ before :all do
83
+ expect(@resource.save).to be(true)
84
+ @resource.reload
85
+ end
86
+
87
+ it 'is an IPv4 node' do
88
+ expect(@resource).to run_ipv4
89
+ end
90
+ end
91
+ end
92
+
93
+ describe 'with IP address given as CIDR' do
94
+ before :all do
95
+ @resource.ip_address = '218.43.243.0/24'
96
+ end
97
+
98
+ describe 'when dumped and loaded' do
99
+ before :all do
100
+ expect(@resource.save).to be(true)
101
+ @resource.reload
102
+ end
103
+
104
+ it 'is an IPv4 node' do
105
+ expect(@resource).to run_ipv4
106
+ end
107
+
108
+ it 'includes IP address 218.43.243.2 in subnet hosts' do
109
+ @resource.ip_address.include?('218.43.243.2')
110
+ end
111
+ end
112
+ end
113
+
114
+ describe 'with a blank string used as IP address' do
115
+ before :all do
116
+ @resource.ip_address = ''
117
+ end
118
+
119
+ describe 'when dumped and loaded' do
120
+ before :all do
121
+ expect(@resource.save).to be(true)
122
+ @resource.reload
123
+ end
124
+
125
+ it 'is an IPv4 node' do
126
+ expect(@resource).to run_ipv4
127
+ end
128
+
129
+ it 'is the expected value' do
130
+ expect(@resource.ip_address).to eq IPAddr.new('0.0.0.0')
131
+ end
132
+ end
133
+ end
134
+
135
+ describe 'with NO IP address' do
136
+ before :all do
137
+ @resource.ip_address = nil
138
+ end
139
+
140
+ describe 'when dumped and loaded' do
141
+ before :all do
142
+ expect(@resource.save).to be(true)
143
+ @resource.reload
144
+ end
145
+
146
+ it 'has no IP address assigned' do
147
+ expect(@resource.ip_address).to be_nil
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,72 @@
1
+ require_relative '../spec_helper'
2
+
3
+ try_spec do
4
+
5
+ require_relative '../fixtures/person'
6
+
7
+ describe DataMapper::TypesFixtures::Person do
8
+ supported_by :all do
9
+ before :all do
10
+ @resource = DataMapper::TypesFixtures::Person.new(:name => 'Thomas Edison')
11
+ end
12
+
13
+ describe 'with no positions information' do
14
+ before :all do
15
+ @resource.positions = nil
16
+ end
17
+
18
+ describe 'when dumped and loaded again' do
19
+ before :all do
20
+ expect(@resource.save).to be(true)
21
+ @resource.reload
22
+ end
23
+
24
+ it 'has nil positions list' do
25
+ expect(@resource.positions).to be_nil
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'with a few items on the positions list' do
31
+ before :all do
32
+ @resource.positions = [
33
+ { :company => 'The Death Star, Inc', :title => 'Light sabre engineer' },
34
+ { :company => 'Sane Little Company', :title => 'Chief Curiosity Officer' },
35
+ ]
36
+ end
37
+
38
+ describe 'when dumped and loaded again' do
39
+ before :all do
40
+ expect(@resource.save).to be(true)
41
+ @resource.reload
42
+ end
43
+
44
+ it 'loads positions list to the state when it was dumped/persisted with keys being strings' do
45
+ expect(@resource.positions).to eq [
46
+ { 'company' => 'The Death Star, Inc', 'title' => 'Light sabre engineer' },
47
+ { 'company' => 'Sane Little Company', 'title' => 'Chief Curiosity Officer' },
48
+ ]
49
+ end
50
+ end
51
+ end
52
+
53
+ describe 'with positions information given as empty list' do
54
+ before :all do
55
+ @resource.positions = []
56
+ end
57
+
58
+ describe 'when dumped and loaded again' do
59
+ before :all do
60
+ expect(@resource.save).to be(true)
61
+ @resource.reload
62
+ end
63
+
64
+ it 'has empty positions list' do
65
+ expect(@resource.positions).to eq []
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ try_spec do
6
+
7
+ require_relative '../fixtures/article'
8
+
9
+ describe DataMapper::TypesFixtures::Article do
10
+ supported_by :all do
11
+ describe "persisted with title and slug set to 'New DataMapper Type'" do
12
+ before :all do
13
+ @input = 'New DataMapper Type'
14
+ @resource = DataMapper::TypesFixtures::Article.create(:title => @input, :slug => @input)
15
+
16
+ @resource.reload
17
+ end
18
+
19
+ it 'has slug equal to "new-datamapper-type"' do
20
+ expect(@resource.slug).to eq 'new-datamapper-type'
21
+ end
22
+
23
+ it 'can be found by slug' do
24
+ expect(DataMapper::TypesFixtures::Article.first(:slug => 'new-datamapper-type')).to eq @resource
25
+ end
26
+ end
27
+
28
+ # FIXME: when stringex fixes the problems it has with it's YAML
29
+ # files not being parsable by psych remove this conditional.
30
+ unless RUBY_PLATFORM =~ /java/ && JRUBY_VERSION >= '1.6' && RUBY_VERSION >= '1.9.2'
31
+ [
32
+ [ 'Iñtërnâtiônàlizætiøn', 'internationalizaetion' ],
33
+ [ "This is Dan's Blog", 'this-is-dans-blog' ],
34
+ [ 'This is My Site, and Blog', 'this-is-my-site-and-blog' ],
35
+ [ 'Google searches for holy grail of Python performance', 'google-searches-for-holy-grail-of-python-performance' ],
36
+ [ 'iPhone dev: Creating length-controlled data sources', 'iphone-dev-creating-length-controlled-data-sources' ],
37
+ [ "Review: Nintendo's New DSi -- A Quantum Leap Forward", 'review-nintendos-new-dsi-a-quantum-leap-forward' ],
38
+ [ "Arriva BraiVe, è l'auto-robot che si 'guida' da sola'", 'arriva-braive-e-lauto-robot-che-si-guida-da-sola' ],
39
+ [ "La ley antipiratería reduce un 33% el tráfico online en Suecia", 'la-ley-antipirateria-reduce-un-33-percent-el-trafico-online-en-suecia' ],
40
+ [ "L'Etat américain du Texas s'apprête à interdire Windows Vista", 'letat-americain-du-texas-sapprete-a-interdire-windows-vista' ],
41
+ ].each do |title, slug|
42
+ describe "set with title '#{title}'" do
43
+ before :all do
44
+ @resource = DataMapper::TypesFixtures::Article.new(:title => title)
45
+ expect(@resource.valid?).to be(true)
46
+ end
47
+
48
+ it "has slug equal to '#{slug}'" do
49
+ expect(@resource.slug).to eq slug
50
+ end
51
+
52
+ describe "and persisted" do
53
+ before :all do
54
+ expect(@resource.save).to be(true)
55
+ @resource.reload
56
+ end
57
+
58
+ it 'can be found by slug' do
59
+ expect(DataMapper::TypesFixtures::Article.first(:slug => slug)).to eq @resource
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../spec_helper'
2
+
3
+ try_spec do
4
+ require_relative '../fixtures/bookmark'
5
+
6
+ describe DataMapper::TypesFixtures::Bookmark do
7
+ supported_by :all do
8
+ before :all do
9
+ DataMapper::TypesFixtures::Bookmark.auto_migrate!
10
+ end
11
+
12
+ let(:resource) do
13
+ DataMapper::TypesFixtures::Bookmark.create(
14
+ :title => 'Check this out',
15
+ :uri => uri,
16
+ :shared => false,
17
+ :tags => %w[ misc ]
18
+ )
19
+ end
20
+
21
+ before do
22
+ expect(resource).to be_saved
23
+ end
24
+
25
+ context 'without URI' do
26
+ let(:uri) { nil }
27
+
28
+ it 'can be found by uri' do
29
+ expect(DataMapper::TypesFixtures::Bookmark.first(:uri => uri)).to eql(resource)
30
+ end
31
+
32
+ describe 'when reloaded' do
33
+ before do
34
+ resource.reload
35
+ end
36
+
37
+ it 'has no uri' do
38
+ expect(resource.uri).to be(nil)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe 'with a blank URI' do
44
+ let(:uri) { '' }
45
+
46
+ it 'can be found by uri' do
47
+ expect(DataMapper::TypesFixtures::Bookmark.first(:uri => uri)).to eql(resource)
48
+ end
49
+
50
+ describe 'when reloaded' do
51
+ before do
52
+ resource.reload
53
+ end
54
+
55
+ it 'is loaded as URI object' do
56
+ expect(resource.uri).to be_an_instance_of(Addressable::URI)
57
+ end
58
+
59
+ it 'has the same original URI' do
60
+ expect(resource.uri.to_s).to eql(uri)
61
+ end
62
+ end
63
+ end
64
+
65
+ describe 'with invalid URI' do
66
+ let(:uri) { 'this is def. not URI' }
67
+
68
+ it 'is perfectly valid (URI type does not provide auto validations)' do
69
+ expect(resource.save).to be(true)
70
+ end
71
+ end
72
+
73
+ %w[
74
+ http://apple.com
75
+ http://www.apple.com
76
+ http://apple.com/
77
+ http://apple.com/iphone
78
+ http://www.google.com/search?client=safari&rls=en-us&q=LED&ie=UTF-8&oe=UTF-8
79
+ http://books.google.com
80
+ http://books.google.com/
81
+ http://db2.clouds.megacorp.net:8080
82
+ https://github.com
83
+ https://github.com/
84
+ http://www.example.com:8088/never/ending/path/segments/
85
+ http://db2.clouds.megacorp.net:8080/resources/10
86
+ http://www.example.com:8088/never/ending/path/segments
87
+ http://books.google.com/books?id=uSUJ3VhH4BsC&printsec=frontcover&dq=subject:%22+Linguistics+%22&as_brr=3&ei=DAHPSbGQE5rEzATk1sShAQ&rview=1
88
+ http://books.google.com:80/books?uid=14472359158468915761&rview=1
89
+ http://books.google.com/books?id=Ar3-TXCYXUkC&printsec=frontcover&rview=1
90
+ http://books.google.com/books/vp6ae081e454d30f89b6bca94e0f96fc14.js
91
+ http://www.google.com/images/cleardot.gif
92
+ http://books.google.com:80/books?id=Ar3-TXCYXUkC&printsec=frontcover&rview=1#PPA5,M1
93
+ http://www.hulu.com/watch/64923/terminator-the-sarah-connor-chronicles-to-the-lighthouse
94
+ http://hulu.com:80/browse/popular/tv
95
+ http://www.hulu.com/watch/62475/the-simpsons-gone-maggie-gone#s-p1-so-i0
96
+ ].each do |uri|
97
+ describe "with URI set to '#{uri}'" do
98
+ let(:uri) { uri }
99
+
100
+ it 'can be found by uri' do
101
+ expect(DataMapper::TypesFixtures::Bookmark.first(:uri => uri)).not_to be(nil)
102
+ end
103
+
104
+ describe 'when reloaded' do
105
+ before do
106
+ resource.reload
107
+ end
108
+
109
+ it 'matches a normalized form of the original URI' do
110
+ expect(resource.uri).to eql(Addressable::URI.parse(uri).normalize)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,102 @@
1
+ require_relative '../spec_helper'
2
+
3
+ try_spec do
4
+
5
+ require_relative '../fixtures/network_node'
6
+
7
+ describe DataMapper::TypesFixtures::NetworkNode do
8
+ supported_by :all do
9
+ describe 'with UUID set as UUID object' do
10
+ before :all do
11
+ @uuid_string = 'b0fc632e-d744-4821-afe3-4ea0701859ee'
12
+ @uuid = UUIDTools::UUID.parse(@uuid_string)
13
+ @resource = DataMapper::TypesFixtures::NetworkNode.new(:uuid => @uuid)
14
+
15
+ expect(@resource.save).to be(true)
16
+ end
17
+
18
+ describe 'when reloaded' do
19
+ before :all do
20
+ @resource.reload
21
+ end
22
+
23
+ it 'has the same UUID string' do
24
+ expect(@resource.uuid.to_s).to eq @uuid_string
25
+ end
26
+
27
+ it 'returns UUID as an object' do
28
+ expect(@resource.uuid).to be_an_instance_of(UUIDTools::UUID)
29
+ end
30
+ end
31
+ end
32
+
33
+ describe 'with UUID set as a valid UUID string' do
34
+ before :all do
35
+ @uuid = 'b0fc632e-d744-4821-afe3-4ea0701859ee'
36
+ @resource = DataMapper::TypesFixtures::NetworkNode.new(:uuid => @uuid)
37
+ end
38
+
39
+ describe 'when reloaded' do
40
+ before :all do
41
+ @resource.reload
42
+ end
43
+
44
+ it 'has the same UUID string' do
45
+ expect(@resource.uuid.to_s).to eq @uuid
46
+ end
47
+
48
+ it 'returns UUID as an object' do
49
+ expect(@resource.uuid).to be_an_instance_of(UUIDTools::UUID)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe 'with UUID set as invalid UUID string' do
55
+ before :all do
56
+ @uuid = 'meh'
57
+ @operation = lambda do
58
+ DataMapper::TypesFixtures::NetworkNode.new(:uuid => @uuid)
59
+ end
60
+ end
61
+
62
+ describe 'when assigned UUID' do
63
+ it 'raises ArgumentError' do
64
+ expect { @operation }.to raise_error(ArgumentError, /Invalid UUID format/)
65
+ end
66
+ end
67
+ end
68
+
69
+ describe 'with UUID set as a blank string' do
70
+ before :all do
71
+ @uuid = ''
72
+ @operation = lambda do
73
+ DataMapper::TypesFixtures::NetworkNode.new(uuid: @uuid)
74
+ end
75
+ end
76
+
77
+ describe 'when assigned UUID' do
78
+ it 'raises ArgumentError' do
79
+ expect { @operation }.to raise_error(ArgumentError, /Invalid UUID format/)
80
+ end
81
+ end
82
+ end
83
+
84
+ describe 'with missing UUID' do
85
+ before :all do
86
+ @uuid = nil
87
+ @resource = DataMapper::TypesFixtures::NetworkNode.new(:uuid => @uuid)
88
+ end
89
+
90
+ describe 'when reloaded' do
91
+ before :all do
92
+ @resource.reload
93
+ end
94
+
95
+ it 'has no UUID' do
96
+ expect(@resource.uuid).to be_nil
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,87 @@
1
+ require_relative '../spec_helper'
2
+
3
+ try_spec do
4
+
5
+ require_relative '../fixtures/person'
6
+ require_relative '../fixtures/invention'
7
+
8
+ describe DataMapper::TypesFixtures::Person do
9
+ supported_by :all do
10
+ before :all do
11
+ @resource = DataMapper::TypesFixtures::Person.new(:name => '')
12
+ end
13
+
14
+ describe 'with no inventions information' do
15
+ before :all do
16
+ @resource.inventions = nil
17
+ end
18
+
19
+ describe 'when dumped and loaded again' do
20
+ before :all do
21
+ expect(@resource.save).to be(true)
22
+ @resource.reload
23
+ end
24
+
25
+ it 'has nil inventions list' do
26
+ expect(@resource.inventions).to be_nil
27
+ end
28
+ end
29
+ end
30
+
31
+ describe 'with a few items on the inventions list' do
32
+ before :all do
33
+ @input = [ 'carbon telephone transmitter', 'light bulb', 'electric grid' ].map do |name|
34
+ DataMapper::TypesFixtures::Invention.new(name)
35
+ end
36
+ @resource.inventions = @input
37
+ end
38
+
39
+ describe 'when dumped and loaded again' do
40
+ before :all do
41
+ expect(@resource.save).to be(true)
42
+ @resource.reload
43
+ end
44
+
45
+ it 'loads inventions list to the state when it was dumped/persisted with keys being strings' do
46
+ expect(@resource.inventions).to eq [{ 'name' => 'carbon telephone transmitter' }, { 'name' => 'light bulb' }, { 'name' => 'electric grid' }]
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'with inventions information given as empty list' do
52
+ before :all do
53
+ @resource.inventions = []
54
+ end
55
+
56
+ describe 'when dumped and loaded again' do
57
+ before :all do
58
+ expect(@resource.save).to be(true)
59
+ @resource.reload
60
+ end
61
+
62
+ it 'has empty inventions list' do
63
+ expect(@resource.inventions).to eq []
64
+ end
65
+ end
66
+ end
67
+
68
+ describe 'with inventions as a string' do
69
+ before :all do
70
+ object = "Foo and Bar" #.freeze
71
+ @resource.inventions = object
72
+ end
73
+
74
+ describe 'when dumped and loaded again' do
75
+ before :all do
76
+ expect(@resource.save).to be(true)
77
+ @resource.reload
78
+ end
79
+
80
+ it 'has correct inventions' do
81
+ expect(@resource.inventions).to eq 'Foo and Bar'
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,37 @@
1
+ shared_examples 'A property with flags' do
2
+ before :all do
3
+ %w(@property_klass).each do |ivar|
4
+ raise "+#{ivar}+ should be defined in before block" unless instance_variable_defined?(ivar)
5
+ end
6
+
7
+ @flags = %i(one two three)
8
+
9
+ class ::User
10
+ include DataMapper::Resource
11
+ end
12
+
13
+ @property = User.property :item, @property_klass[@flags], key: true
14
+ end
15
+
16
+ describe '.generated_classes' do
17
+ it 'caches the generated class' do
18
+ expect(@property_klass.generated_classes[@flags]).not_to be_nil
19
+ end
20
+ end
21
+
22
+ it 'includes :flags in accepted_options' do
23
+ expect(@property_klass.accepted_options).to include(:flags)
24
+ end
25
+
26
+ it 'responds to :generated_classes' do
27
+ expect(@property_klass).to respond_to(:generated_classes)
28
+ end
29
+
30
+ it 'responds to :flag_map' do
31
+ expect(@property).to respond_to(:flag_map)
32
+ end
33
+
34
+ it 'is custom' do
35
+ expect(@property.custom?).to be(true)
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ shared_examples 'identity function' do
2
+ it 'returns value unchanged' do
3
+ expect(@result).to eq @input
4
+ end
5
+ end
@@ -0,0 +1,30 @@
1
+ require 'dm-core/spec/setup'
2
+ require 'dm-core/spec/lib/adapter_helpers'
3
+
4
+ require 'dm-types'
5
+ require 'dm-migrations'
6
+ require 'dm-validations'
7
+
8
+ Dir["#{Pathname(__FILE__).dirname.expand_path}/shared/*.rb"].sort.each { |file| require file }
9
+
10
+ DataMapper::Spec.setup
11
+
12
+ RSpec.configure do |config|
13
+ config.extend(DataMapper::Spec::Adapters::Helpers)
14
+ end
15
+
16
+ DEPENDENCIES = {
17
+ 'bcrypt' => 'bcrypt-ruby'
18
+ }.freeze
19
+
20
+ def try_spec
21
+ begin
22
+ yield
23
+ rescue LoadError => error
24
+ raise error unless (lib = error.message.match(/\Ano such file to load -- (.+)\z/)[1])
25
+
26
+ gem_location = DEPENDENCIES[lib] || raise("Unknown lib #{lib}")
27
+
28
+ warn "[WARNING] Skipping specs using #{lib}, please do: gem install #{gem_location}"
29
+ end
30
+ end