dm-pg-types 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/Gemfile CHANGED
@@ -16,6 +16,8 @@ gem 'dm-do-adapter', DM_VERSION
16
16
  gem 'dm-postgres-adapter', DM_VERSION
17
17
 
18
18
  gem 'rake', '~> 0.9.2'
19
- gem 'rspec', '~> 1.3.2'
20
19
 
21
- gem 'jeweler', '~> 1.8.4'
20
+ group :development do
21
+ gem 'rspec', '~> 1.3.2'
22
+ gem 'jeweler', '~> 1.8.4'
23
+ end
data/Gemfile.lock CHANGED
@@ -15,14 +15,14 @@ GEM
15
15
  dm-postgres-adapter (1.2.0)
16
16
  dm-do-adapter (~> 1.2.0)
17
17
  do_postgres (~> 0.10.6)
18
- dm-types (1.2.1)
19
- bcrypt-ruby (~> 3.0.0)
18
+ dm-types (1.2.2)
19
+ bcrypt-ruby (~> 3.0)
20
20
  dm-core (~> 1.2.0)
21
- fastercsv (~> 1.5.4)
22
- json (~> 1.6.1)
23
- multi_json (~> 1.0.3)
24
- stringex (~> 1.3.0)
25
- uuidtools (~> 2.1.2)
21
+ fastercsv (~> 1.5)
22
+ json (~> 1.6)
23
+ multi_json (~> 1.0)
24
+ stringex (~> 1.4)
25
+ uuidtools (~> 2.1)
26
26
  dm-validations (1.2.0)
27
27
  dm-core (~> 1.2.0)
28
28
  do_postgres (0.10.8)
@@ -34,14 +34,14 @@ GEM
34
34
  git (>= 1.2.5)
35
35
  rake
36
36
  rdoc
37
- json (1.6.7)
38
- multi_json (1.0.4)
37
+ json (1.7.5)
38
+ multi_json (1.3.6)
39
39
  rake (0.9.2.2)
40
40
  rdoc (3.12)
41
41
  json (~> 1.4)
42
42
  rspec (1.3.2)
43
- stringex (1.3.3)
44
- uuidtools (2.1.2)
43
+ stringex (1.4.0)
44
+ uuidtools (2.1.3)
45
45
 
46
46
  PLATFORMS
47
47
  ruby
data/README.md CHANGED
@@ -1,24 +1,34 @@
1
1
  # dm-pg-types
2
2
 
3
+ # Installation
4
+
5
+ dm-pg-types is available as a RubyGem. Simply put this in your Gemfile
6
+
7
+ ```
8
+ gem 'dm-pg-types'
9
+ ```
10
+
11
+ and you should be good to go.
12
+
3
13
  DataMapper plugin providing support for PostgreSQL's HSTORE and ARRAY types. An example will suffice
4
14
 
5
15
  ```ruby
6
- DataMapper.setup(:default, 'postgres://svs@localhost/dm_pg_types_person')
16
+ DataMapper.setup(:default, 'postgres://localhost/dm_pg_types_person')
7
17
  DataMapper.repository(:default).adapter.execute("DROP TABLE IF EXISTS people")
8
18
  DataMapper.repository(:default).adapter.execute("CREATE EXTENSION HSTORE")
9
19
 
10
20
  class Person
11
21
  include DataMapper::Resource
12
-
22
+
13
23
  property :id, Serial
14
24
  property :name, String
15
25
  property :info, HStore
16
26
  property :decimals, DecimalArray, :scale => 5, :precision => 10
17
27
  end
18
-
28
+
19
29
  DataMapper.finalize
20
30
  DataMapper.auto_migrate!
21
-
31
+
22
32
  p = Person.new
23
33
  p.info = {:a => "b", :c => "d"}
24
34
  p.decimals = [10.1, 11.2]
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ begin
19
19
  gem.add_dependency 'data_mapper', '~> 1.2.0'
20
20
  gem.add_dependency 'dm-postgres-adapter', '~> 1.2.0'
21
21
 
22
- gem.version = "0.8.1"
22
+ gem.version = "0.8.2"
23
23
  end
24
24
 
25
25
  Jeweler::GemcutterTasks.new
data/dm-pg-types.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "dm-pg-types"
8
- s.version = "0.8.1"
8
+ s.version = "0.8.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["svs"]
12
- s.date = "2012-09-08"
12
+ s.date = "2012-09-19"
13
13
  s.description = "DataMapper plugin providing HSTORE and ARRAY datatype support for postgres"
14
14
  s.email = "svs [a] svs [d] io"
15
15
  s.extra_rdoc_files = [
@@ -28,17 +28,21 @@ Gem::Specification.new do |s|
28
28
  "lib/dm-pg-types.rb",
29
29
  "lib/dm-pg-types/decimal_array.rb",
30
30
  "lib/dm-pg-types/hstore.rb",
31
+ "lib/dm-pg-types/pg_array.rb",
32
+ "lib/dm-pg-types/string_array.rb",
31
33
  "spec/fixtures/person.rb",
32
34
  "spec/integration/decimal_array_spec.rb",
33
35
  "spec/integration/full_spec.rb",
34
36
  "spec/integration/hstore_spec.rb",
37
+ "spec/integration/string_array_spec.rb",
35
38
  "spec/rcov.opts",
36
39
  "spec/shared/flags_shared_spec.rb",
37
40
  "spec/shared/identity_function_group.rb",
38
41
  "spec/spec.opts",
39
42
  "spec/spec_helper.rb",
43
+ "spec/unit/decimal_array_spec.rb",
40
44
  "spec/unit/hstore_spec.rb",
41
- "spec/unit/pg_array_spec.rb",
45
+ "spec/unit/string_array_spec.rb",
42
46
  "tasks/spec.rake",
43
47
  "tasks/yard.rake",
44
48
  "tasks/yardstick.rake"
@@ -62,8 +66,8 @@ Gem::Specification.new do |s|
62
66
  s.add_runtime_dependency(%q<dm-do-adapter>, ["~> 1.2.0"])
63
67
  s.add_runtime_dependency(%q<dm-postgres-adapter>, ["~> 1.2.0"])
64
68
  s.add_runtime_dependency(%q<rake>, ["~> 0.9.2"])
65
- s.add_runtime_dependency(%q<rspec>, ["~> 1.3.2"])
66
- s.add_runtime_dependency(%q<jeweler>, ["~> 1.8.4"])
69
+ s.add_development_dependency(%q<rspec>, ["~> 1.3.2"])
70
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
67
71
  s.add_runtime_dependency(%q<data_mapper>, ["~> 1.2.0"])
68
72
  s.add_runtime_dependency(%q<dm-postgres-adapter>, ["~> 1.2.0"])
69
73
  else
data/lib/dm-pg-types.rb CHANGED
@@ -5,19 +5,25 @@ require 'dm-postgres-adapter'
5
5
 
6
6
  module DataMapper
7
7
  class Property
8
+ autoload :PgArray, 'dm-pg-types/pg_array'
8
9
  autoload :HStore, 'dm-pg-types/hstore'
9
10
  autoload :DecimalArray, 'dm-pg-types/decimal_array'
11
+ autoload :StringArray, 'dm-pg-types/string_array'
10
12
  end
11
13
 
12
14
  module Migrations
13
15
  module PostgresAdapter
14
16
  def property_schema_hash(property)
15
17
  schema = super
16
-
18
+
17
19
  if property.kind_of?(Property::DecimalArray)
18
20
  schema[:primitive] = "#{schema[:primitive]}(#{property.precision},#{property.scale})[]"
19
21
  schema[:precision] = schema[:scale] = nil
22
+ elsif property.kind_of?(Property::StringArray)
23
+ schema[:primitive] = "#{schema[:primitive]}(#{property.length})[]"
24
+ schema[:length] = nil
20
25
  end
26
+
21
27
  schema
22
28
  end
23
29
  end
@@ -27,7 +33,7 @@ module DataMapper
27
33
  def self.included(base)
28
34
  base.extend ClassMethods
29
35
  end
30
-
36
+
31
37
  module ClassMethods
32
38
  # Types for PostgreSQL databases.
33
39
  #
@@ -37,7 +43,8 @@ module DataMapper
37
43
  def type_map
38
44
  super.merge(
39
45
  Property::HStore => {:primitive => 'HSTORE'},
40
- Property::DecimalArray => {:primitive => "NUMERIC"}
46
+ Property::DecimalArray => {:primitive => "NUMERIC"},
47
+ Property::StringArray => {:primitive => "VARCHAR"}
41
48
  ).freeze
42
49
  end
43
50
  end
@@ -2,7 +2,7 @@ require 'dm-core'
2
2
 
3
3
  module DataMapper
4
4
  class Property
5
- class DecimalArray < Object
5
+ class DecimalArray < PgArray
6
6
  accept_options :precision, :scale, :min, :max
7
7
  attr_reader :precision, :scale, :min, :max
8
8
 
@@ -18,11 +18,7 @@ module DataMapper
18
18
 
19
19
 
20
20
  def load(value)
21
- value.gsub(/[{}]/,'').split(",").map(&:to_f) if value
22
- end
23
-
24
- def dump(value)
25
- "{#{value.join(",")}}" if value
21
+ super.map(&:to_f) if value
26
22
  end
27
23
  end # class DecimalArray
28
24
  end # class Property
@@ -0,0 +1,16 @@
1
+ require 'dm-core'
2
+ require 'csv'
3
+
4
+ module DataMapper
5
+ class Property
6
+ class PgArray < Object
7
+ def load(value)
8
+ CSV.parse_line(value.gsub(/[{}]/,'')) || [] if value
9
+ end
10
+
11
+ def dump(value)
12
+ "{#{CSV.generate_line(value, :row_sep => '')}}" if value
13
+ end
14
+ end # class PgArray
15
+ end # class Property
16
+ end # module DataMapper
@@ -0,0 +1,25 @@
1
+ require 'dm-core'
2
+
3
+ module DataMapper
4
+ class Property
5
+ class StringArray < PgArray
6
+ accept_options :length
7
+
8
+ DEFAULT_LENGTH = 50
9
+ length(DEFAULT_LENGTH)
10
+
11
+ def length
12
+ if @length.kind_of?(Range)
13
+ @length.max
14
+ else
15
+ @length
16
+ end
17
+ end
18
+
19
+ def initialize(model, name, options = {})
20
+ super
21
+ @length = @options.fetch(:length)
22
+ end
23
+ end # class StringArray
24
+ end # class Property
25
+ end # module DataMapper
@@ -15,6 +15,7 @@ module DataMapper
15
15
  property :name, String
16
16
  property :other_information, HStore
17
17
  property :numbers, DecimalArray
18
+ property :aliases, StringArray
18
19
  end
19
20
  end
20
21
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'debugger'
4
3
  try_spec do
5
4
 
6
5
  require './spec/fixtures/person'
@@ -35,7 +34,6 @@ try_spec do
35
34
 
36
35
  describe 'when dumped and loaded again' do
37
36
  before :all do
38
- debugger
39
37
  @resource.save.should be(true)
40
38
  @resource.reload
41
39
  end
@@ -3,28 +3,30 @@ require 'spec_helper'
3
3
  describe "dm-pg-types" do
4
4
  before :all do
5
5
  # Create the table manually before running this spec.
6
- DataMapper.setup(:default, 'postgres://svs@localhost/dm_pg_types_person')
6
+ DataMapper.setup(:default, 'postgres://localhost/dm_pg_types_person')
7
7
  DataMapper.repository(:default).adapter.execute("DROP TABLE IF EXISTS people")
8
8
  DataMapper.repository(:default).adapter.execute("CREATE EXTENSION HSTORE") rescue nil
9
9
  class Person
10
10
  include DataMapper::Resource
11
-
11
+
12
12
  property :id, Serial
13
13
  property :name, String
14
14
  property :info, HStore
15
15
  property :decimals, DecimalArray, :scale => 5, :precision => 10
16
+ property :aliases, StringArray, :length => 10
16
17
  end
17
-
18
+
18
19
  DataMapper.finalize
19
20
  DataMapper.auto_migrate!
20
-
21
+
21
22
  p = Person.new
22
23
  p.info = {:a => "b", :c => "d"}
23
24
  p.decimals = [10.1, 11.2]
25
+ p.aliases = ["Bob", "George"]
24
26
  p.save
25
27
  @p = Person.last
26
28
  end
27
-
29
+
28
30
  it "should provide a person with info" do
29
31
  @p.info.should == {"a" => "b", "c" => "d"}
30
32
  end
@@ -33,4 +35,8 @@ describe "dm-pg-types" do
33
35
  @p.decimals.should == [10.1,11.2]
34
36
  end
35
37
 
38
+ it "should provide a person with aliases" do
39
+ @p.aliases.should == ['Bob', 'George']
40
+ end
41
+
36
42
  end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ try_spec do
4
+
5
+ require './spec/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 => '')
11
+ end
12
+
13
+ describe 'with no other information' do
14
+ before :all do
15
+ @resource.aliases = nil
16
+ end
17
+
18
+ describe 'when dumped and loaded again' do
19
+ before :all do
20
+ @resource.save.should be(true)
21
+ @resource.reload
22
+ end
23
+
24
+ it 'has no aliases' do
25
+ @resource.aliases.should == nil
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'with no aliases information' do
31
+ before :all do
32
+ @resource.aliases = []
33
+ end
34
+
35
+ describe 'when dumped and loaded again' do
36
+ before :all do
37
+ @resource.save.should be(true)
38
+ @resource.reload
39
+ end
40
+
41
+ it 'has empty aliases list' do
42
+ @resource.aliases.should == []
43
+ end
44
+ end
45
+ end
46
+
47
+ describe 'with a few items on the aliases list' do
48
+ before :all do
49
+ @input = ['Bob','George','Michael']
50
+ @resource.aliases = @input
51
+ end
52
+
53
+ describe 'when dumped and loaded again' do
54
+ before :all do
55
+ @resource.save.should be(true)
56
+ @resource.reload
57
+ end
58
+
59
+ it 'includes saved aliases' do
60
+ @resource.aliases.should == ['Bob','George','Michael']
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ try_spec do
4
+ describe DataMapper::Property::StringArray do
5
+ supported_by :all do
6
+ before :all do
7
+ class User
8
+ include DataMapper::Resource
9
+ property :id, Serial
10
+ property :things, StringArray, :length => 10
11
+ end
12
+
13
+ @property = User.properties[:things]
14
+ end
15
+
16
+ describe '.load' do
17
+ describe "argument is a string that is a string array" do
18
+ before :all do
19
+ @input = '{"10.1","2.3","4","5","6"}'
20
+ @result = @property.load(@input)
21
+ end
22
+
23
+ it "parses the input into an array" do
24
+ @result.should == ['10.1','2.3','4','5','6']
25
+ end
26
+ end
27
+ end
28
+
29
+ describe ".dump" do
30
+ before :all do
31
+ @input = ['foo','bar','baz','quux','foo,bar']
32
+ @result = @property.dump(@input)
33
+ end
34
+
35
+ describe "when argument is an Array" do
36
+ it "should result in a postgres array string" do
37
+ @result.should == '{foo,bar,baz,quux,"foo,bar"}'
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-pg-types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-08 00:00:00.000000000 Z
12
+ date: 2012-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dm-core
@@ -163,7 +163,7 @@ dependencies:
163
163
  - - ~>
164
164
  - !ruby/object:Gem::Version
165
165
  version: 1.3.2
166
- type: :runtime
166
+ type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  none: false
@@ -179,7 +179,7 @@ dependencies:
179
179
  - - ~>
180
180
  - !ruby/object:Gem::Version
181
181
  version: 1.8.4
182
- type: :runtime
182
+ type: :development
183
183
  prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
185
  none: false
@@ -238,17 +238,21 @@ files:
238
238
  - lib/dm-pg-types.rb
239
239
  - lib/dm-pg-types/decimal_array.rb
240
240
  - lib/dm-pg-types/hstore.rb
241
+ - lib/dm-pg-types/pg_array.rb
242
+ - lib/dm-pg-types/string_array.rb
241
243
  - spec/fixtures/person.rb
242
244
  - spec/integration/decimal_array_spec.rb
243
245
  - spec/integration/full_spec.rb
244
246
  - spec/integration/hstore_spec.rb
247
+ - spec/integration/string_array_spec.rb
245
248
  - spec/rcov.opts
246
249
  - spec/shared/flags_shared_spec.rb
247
250
  - spec/shared/identity_function_group.rb
248
251
  - spec/spec.opts
249
252
  - spec/spec_helper.rb
253
+ - spec/unit/decimal_array_spec.rb
250
254
  - spec/unit/hstore_spec.rb
251
- - spec/unit/pg_array_spec.rb
255
+ - spec/unit/string_array_spec.rb
252
256
  - tasks/spec.rake
253
257
  - tasks/yard.rake
254
258
  - tasks/yardstick.rake
@@ -266,7 +270,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
270
  version: '0'
267
271
  segments:
268
272
  - 0
269
- hash: -3719502644642354910
273
+ hash: -3868045948250256032
270
274
  required_rubygems_version: !ruby/object:Gem::Requirement
271
275
  none: false
272
276
  requirements: