database_url 0.0.1 → 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ba2ea5185f9833e0f0b30d7e4440c138019b6427
4
+ data.tar.gz: 87bd701c1f3eea559518ca379f6361d795f68e0d
5
+ SHA512:
6
+ metadata.gz: e016566a71450259e626674d6725ca26dcb41651a929ea342a42023eeb3c4c50c7044536cb154c1e7b7f0078fa839f6d2e270c045decf098c7b6a99376408837
7
+ data.tar.gz: 34cb07b00a0673467d9c747a3251efe2da3bffbde41eca00f6989ee3b04b8b3cd006d5b8a7fdb13d3c66f5646e90517d234a33e1e7f088d778887aa13263da02
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ 0.1.0 / 2014-07-12
2
+
3
+ * Breaking changes
4
+
5
+ * replaced .active_record_config(url = nil) with .to_active_record_hash(url = nil)
6
+ * replaced .database_url(hash) with .to_active_record_url(hash)
7
+
8
+ * Enhancements
9
+
10
+ * .to_sequel_hash(url = nil)
11
+ * .to_sequel_url(hash)
12
+
1
13
  0.0.1 / 2013-09-19
2
14
 
3
15
  Initial release!
data/README.md CHANGED
@@ -4,29 +4,40 @@ Convert back and forth between Heroku-style `ENV['DATABASE_URL']` and Rails/Acti
4
4
 
5
5
  ## Usage
6
6
 
7
+ ### Methods
8
+
9
+ DatabaseUrl.to_active_record_hash(url = nil)
10
+ DatabaseUrl.to_active_record_url(hash)
11
+ DatabaseUrl.to_sequel_hash(url = nil)
12
+ DatabaseUrl.to_sequel_url(hash)
13
+
7
14
  ### Get `DATABASE_URL` from config hash
8
15
 
9
16
  You pass it a hash (string or symbol keys, doesn't matter) and it gives you a URL:
10
17
 
11
18
  >> c = YAML.load_file('/path/to/config/database.yml')
12
19
  => {"development"=>{"adapter"=>"mysql2", "database"=>"myapp_development", "username"=>"root", "password"=>"password", "encoding"=>"utf8"}, "test"=>{"adapter"=>"mysql2", "database"=>"myapp_test", "username"=>"root", "password"=>"password", "encoding"=>"utf8"}, "production"=>{"adapter"=>"mysql2", "database"=>"myapp", "username"=>"myapp", "password"=>"XXX", "encoding"=>"utf8"}, "cucumber"=>{"adapter"=>"mysql2", "database"=>"myapp_cucumber", "username"=>"root", "password"=>"password", "encoding"=>"utf8"}}
13
- >> DatabaseUrl.database_url c['development']
20
+ >> DatabaseUrl.to_active_record_url c['development']
14
21
  => "mysql2://root:password@127.0.0.1/myapp_development?encoding=utf8"
15
22
 
16
23
  ### Get config hash from `DATABASE_URL`
17
24
 
18
- Let's assume `DATABASE_URL` is set to `postgres://uuu:xxx@127.0.0.1:1234/abc`...
19
-
20
- >> DatabaseUrl.active_record_config
25
+ >> DatabaseUrl.to_active_record_hash('postgres://uuu:xxx@127.0.0.1:1234/abc')
21
26
  => {:adapter=>"postgres", :host=>"127.0.0.1", :port=>1234, :database=>"abc", :user=>"uuu", :password=>"xxx"}
22
27
 
23
- You can also pass a URL as the first argument to `DatabaseUrl.active_record_config`.
28
+ If you omit the argument, it will try `ENV['DATABASE_URL']`
24
29
 
25
30
  ## Query parameters supported
26
31
 
27
32
  * `encoding`
28
33
  * `pool`
29
34
 
35
+ ## TODO
36
+
37
+ * all query params
38
+ * automatically pull from config/database.yml
39
+ * automatically pull from ActiveRecord::Base.connection_config
40
+
30
41
  ## Copyright
31
42
 
32
- Copyright 2013 Seamus Abshere
43
+ Copyright 2014 Seamus Abshere
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = DatabaseUrl::VERSION
9
9
  spec.authors = ["Seamus Abshere"]
10
10
  spec.email = ["seamus@abshere.net"]
11
- spec.description = %q{Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Rails/ActiveRecord-style config/database.yml hashes.}
12
- spec.summary = %q{Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Rails/ActiveRecord-style config/database.yml hashes.}
11
+ spec.description = %q{Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Sequel/ActiveRecord-style config hashes.}
12
+ spec.summary = %q{Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Sequel/ActiveRecord-style config hashes.}
13
13
  spec.homepage = "https://github.com/seamusabshere/database_url"
14
14
  spec.license = "MIT"
15
15
 
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
24
25
  end
@@ -5,38 +5,56 @@ require 'cgi'
5
5
 
6
6
  module DatabaseUrl
7
7
  class << self
8
- def active_record_config(url = nil)
8
+ def to_active_record_hash(url = nil)
9
+ to_hash ACTIVE_RECORD_FIELD_MAP, url
10
+ end
11
+
12
+ def to_active_record_url(hash)
13
+ to_url ACTIVE_RECORD_FIELD_MAP, hash
14
+ end
15
+
16
+ def to_sequel_hash(url = nil)
17
+ to_hash SEQUEL_FIELD_MAP, url
18
+ end
19
+
20
+ def to_sequel_url(hash)
21
+ to_url SEQUEL_FIELD_MAP, hash
22
+ end
23
+
24
+ private
25
+
26
+ def to_hash(field_map, url = nil)
9
27
  if url.nil?
10
28
  url = ENV.fetch 'DATABASE_URL'
11
29
  end
12
30
  uri = URI.parse url
13
- retval = {
31
+ memo = {
14
32
  adapter: uri.scheme,
15
33
  host: uri.host,
16
34
  database: File.basename(uri.path),
17
35
  }
18
36
  if uri.port
19
- retval[:port] = uri.port
37
+ memo[:port] = uri.port
20
38
  end
21
39
  if uri.user
22
- retval[:user] = uri.user
40
+ memo[:user] = uri.user
23
41
  end
24
42
  if uri.password
25
- retval[:password] = uri.password
43
+ memo[:password] = uri.password
26
44
  end
27
45
  query = CGI.parse uri.query
28
46
  if query.has_key?('encoding')
29
- retval[:encoding] = query['encoding'][0]
47
+ memo[:encoding] = query['encoding'][0]
30
48
  end
31
- if query.has_key?('pool')
32
- retval[:pool] = query['pool'][0].to_i
49
+ if (pool = query['pool'] || query['max_connections']) and pool.length > 0 # CGI.parse creates a Hash that defaults to []
50
+ memo[field_map.fetch('pool').to_sym] = pool[0].to_i
33
51
  end
34
- retval
52
+ memo
35
53
  end
36
54
 
37
- def database_url(active_record_config)
55
+ def to_url(field_map, hash)
38
56
  # stringify keys
39
- c = active_record_config.inject({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
57
+ c = hash.inject({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
40
58
  userinfo = if c.has_key?('user') or c.has_key?('username') or c.has_key?('password')
41
59
  username = c.values_at('user', 'username').compact.first
42
60
  [ username, c['password'] ].join ':'
@@ -45,8 +63,8 @@ module DatabaseUrl
45
63
  if c.has_key?('encoding')
46
64
  query['encoding'] = c['encoding']
47
65
  end
48
- if c.has_key?('pool')
49
- query['pool'] = c['pool'].to_i
66
+ if pool = c['pool'] || c['max_connections']
67
+ query[field_map.fetch('pool')] = pool.to_i
50
68
  end
51
69
  query = if query.length > 0
52
70
  URI.encode_www_form query
@@ -69,4 +87,11 @@ module DatabaseUrl
69
87
  end
70
88
 
71
89
  DEFAULT_HOST = '127.0.0.1'
90
+
91
+ SEQUEL_FIELD_MAP = {
92
+ 'pool' => 'max_connections',
93
+ }
94
+ ACTIVE_RECORD_FIELD_MAP = {
95
+ 'pool' => 'pool',
96
+ }
72
97
  end
@@ -1,3 +1,3 @@
1
1
  module DatabaseUrl
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -5,43 +5,87 @@ describe DatabaseUrl do
5
5
  ENV.delete 'DATABASE_URL'
6
6
  end
7
7
 
8
- it "should build Rails/ActiveRecord-style config hashes using ENV['DATABASE_URL']" do
9
- ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc?encoding=latin1&pool=9"
10
- DatabaseUrl.active_record_config.should == {
11
- adapter: 'postgres',
12
- host: '127.0.0.1',
13
- port: 1234,
14
- database: 'abc',
15
- user: 'uuu',
16
- password: 'xxx',
17
- encoding: 'latin1',
18
- pool: 9,
19
- }
20
- end
8
+ describe 'ActiveRecord' do
9
+ it "builds config hashes using ENV['DATABASE_URL']" do
10
+ ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc?encoding=latin1&pool=9"
11
+ DatabaseUrl.to_active_record_hash.should == {
12
+ adapter: 'postgres',
13
+ host: '127.0.0.1',
14
+ port: 1234,
15
+ database: 'abc',
16
+ user: 'uuu',
17
+ password: 'xxx',
18
+ encoding: 'latin1',
19
+ pool: 9,
20
+ }
21
+ end
22
+
23
+ it "builds URL from config hash" do
24
+ DatabaseUrl.to_active_record_url({
25
+ adapter: 'postgreq',
26
+ host: '127.0.0.2',
27
+ port: 1235,
28
+ database: 'abd',
29
+ user: 'uu1',
30
+ password: 'xx1',
31
+ encoding: 'utf8',
32
+ pool: 15,
33
+ }).should == "postgreq://uu1:xx1@127.0.0.2:1235/abd?encoding=utf8&pool=15"
34
+ end
21
35
 
22
- it "should build DATABASE_URL-style URL from Rails/ActiveRecord-style config hash" do
23
- DatabaseUrl.database_url({
24
- adapter: 'postgreq',
25
- host: '127.0.0.2',
26
- port: 1235,
27
- database: 'abd',
28
- user: 'uu1',
29
- password: 'xx1',
30
- encoding: 'utf8',
31
- pool: 15,
32
- }).should == "postgreq://uu1:xx1@127.0.0.2:1235/abd?encoding=utf8&pool=15"
36
+ it "builds config hashes given a URL" do
37
+ ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc" # should be ignored!
38
+ DatabaseUrl.to_active_record_hash("postgres://uu2:xxx@127.0.0.3:1236/abc?encoding=latin1").should == {
39
+ adapter: 'postgres',
40
+ host: '127.0.0.3',
41
+ port: 1236,
42
+ database: 'abc',
43
+ user: 'uu2',
44
+ password: 'xxx',
45
+ encoding: 'latin1',
46
+ }
47
+ end
33
48
  end
34
49
 
35
- it "should build Rails/ActiveRecord-style config hashes given a URL" do
36
- ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc" # should be ignored!
37
- DatabaseUrl.active_record_config("postgres://uu2:xxx@127.0.0.3:1236/abc?encoding=latin1").should == {
38
- adapter: 'postgres',
39
- host: '127.0.0.3',
40
- port: 1236,
41
- database: 'abc',
42
- user: 'uu2',
43
- password: 'xxx',
44
- encoding: 'latin1',
45
- }
50
+ describe 'Sequel' do
51
+ it "builds config hashes using ENV['DATABASE_URL']" do
52
+ ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc?encoding=latin1&pool=9"
53
+ DatabaseUrl.to_sequel_hash.should == {
54
+ adapter: 'postgres',
55
+ host: '127.0.0.1',
56
+ port: 1234,
57
+ database: 'abc',
58
+ user: 'uuu',
59
+ password: 'xxx',
60
+ encoding: 'latin1',
61
+ max_connections: 9,
62
+ }
63
+ end
64
+
65
+ it "builds URL from config hash" do
66
+ DatabaseUrl.to_sequel_url({
67
+ adapter: 'postgreq',
68
+ host: '127.0.0.2',
69
+ port: 1235,
70
+ database: 'abd',
71
+ user: 'uu1',
72
+ password: 'xx1',
73
+ encoding: 'utf8',
74
+ pool: 15,
75
+ }).should == "postgreq://uu1:xx1@127.0.0.2:1235/abd?encoding=utf8&max_connections=15"
76
+ end
77
+
78
+ it "builds config hashes given a URL" do
79
+ ENV['DATABASE_URL'] = "postgres://uuu:xxx@127.0.0.1:1234/abc" # should be ignored!
80
+ DatabaseUrl.to_sequel_hash("postgres://uu2:xxx@127.0.0.3:1236/abc?encoding=latin1").should == {
81
+ adapter: 'postgres',
82
+ host: '127.0.0.3',
83
+ port: 1236,
84
+ database: 'abc',
85
+ user: 'uu2',
86
+ password: 'xxx',
87
+ encoding: 'latin1',
88
+ }
89
+ end
46
90
  end
47
91
  end
@@ -1,2 +1,4 @@
1
+ require 'pry'
2
+
1
3
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
4
  require 'database_url'
metadata CHANGED
@@ -1,75 +1,82 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: database_url
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Seamus Abshere
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-19 00:00:00.000000000 Z
11
+ date: 2014-07-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.3'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
- description: Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Rails/ActiveRecord-style
63
- config/database.yml hashes.
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Sequel/ActiveRecord-style
70
+ config hashes.
64
71
  email:
65
72
  - seamus@abshere.net
66
73
  executables: []
67
74
  extensions: []
68
75
  extra_rdoc_files: []
69
76
  files:
70
- - .gitignore
71
- - .rspec
72
- - .travis.yml
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".travis.yml"
73
80
  - CHANGELOG
74
81
  - Gemfile
75
82
  - LICENSE.txt
@@ -83,29 +90,28 @@ files:
83
90
  homepage: https://github.com/seamusabshere/database_url
84
91
  licenses:
85
92
  - MIT
93
+ metadata: {}
86
94
  post_install_message:
87
95
  rdoc_options: []
88
96
  require_paths:
89
97
  - lib
90
98
  required_ruby_version: !ruby/object:Gem::Requirement
91
- none: false
92
99
  requirements:
93
- - - ! '>='
100
+ - - ">="
94
101
  - !ruby/object:Gem::Version
95
102
  version: '0'
96
103
  required_rubygems_version: !ruby/object:Gem::Requirement
97
- none: false
98
104
  requirements:
99
- - - ! '>='
105
+ - - ">="
100
106
  - !ruby/object:Gem::Version
101
107
  version: '0'
102
108
  requirements: []
103
109
  rubyforge_project:
104
- rubygems_version: 1.8.25
110
+ rubygems_version: 2.2.2
105
111
  signing_key:
106
- specification_version: 3
107
- summary: Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Rails/ActiveRecord-style
108
- config/database.yml hashes.
112
+ specification_version: 4
113
+ summary: Convert back and forth between Heroku-style ENV['DATABASE_URL'] and Sequel/ActiveRecord-style
114
+ config hashes.
109
115
  test_files:
110
116
  - spec/database_url_spec.rb
111
117
  - spec/spec_helper.rb