pg-url 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/Gemfile +6 -0
- data/README.md +67 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/pg/url.rb +26 -0
- data/lib/pg/url/error.rb +45 -0
- data/lib/pg/url/generator.rb +34 -0
- data/lib/pg/url/prompt.rb +61 -0
- data/lib/pg/url/type.rb +36 -0
- data/lib/pg/url/version.rb +5 -0
- data/pg-url.gemspec +28 -0
- metadata +129 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 88f00bb7a3c5071d8f2fa6ec4c41aea5666e37733b1c36c35743c287445390c3
|
4
|
+
data.tar.gz: bf4c9624e39b358aacf49bdd539e8af89b6d1fc91557552bfc404f2b268dfece
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 053a0fc9e6ff4b6fded5f1d437132c22cbdae405b595498fcc71640fdff697323d90de1e883e09b47e6a67db977e601814a1a7808b10ecf6cddd14f113889326
|
7
|
+
data.tar.gz: d7fe87d1d1ff91de5bc27d7e8952d9c098b8452feea7043fa8fd28f04b645acd3f23591cad56806a1852da31516a6c26fc1a064f0c04452689d887f7f120ca61
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# PG::URL
|
2
|
+
|
3
|
+
Postgres connection string builder gem with construction through a prompt or Ruby method.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'pg-url'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install pg-url
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Method
|
24
|
+
|
25
|
+
- `PG::URL.new` (alias `PG::URL[]`)
|
26
|
+
|
27
|
+
Constructs and returns a connection string built from the parameters given.
|
28
|
+
|
29
|
+
#### Parameters
|
30
|
+
|
31
|
+
The parameters indicated with a check mark are **required**.
|
32
|
+
|
33
|
+
- [ ] `host` - The host address that the database is hosted on. If no host is specified, then `localhost` is used as the host.
|
34
|
+
- [ ] `port` - The port of the host address. If no port is specified (and no host is specified), then the default Postgres port `5432` will be used on `localhost`.
|
35
|
+
- [x] `database` - The name of the Postgres database.
|
36
|
+
- [x] `username` - The username of a user on the Postgres table
|
37
|
+
- [ ] `password` - The password for the user specified by the `username` parameter. If the user does not have a password, this parameter can be left empty.
|
38
|
+
|
39
|
+
#### Examples
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
require 'pg/url'
|
43
|
+
|
44
|
+
PG::URL.new(host: '192.168.2.1', database: 'db', username: 'root', password: 'test')
|
45
|
+
#=> "postgres://root:test@192.168.2.1/db"
|
46
|
+
|
47
|
+
PG::URL[host: 'pg-host.com', port: 3755, database: 'db', username: 'root']
|
48
|
+
#=> "postgres://root@pg-host.com:3755/db"
|
49
|
+
|
50
|
+
conn = {port: '4321', database: 'users', username: 'K&fB2y'}
|
51
|
+
PG::URL[conn]
|
52
|
+
#=> "postgres://K&fB2y@localhost:4321/users"
|
53
|
+
```
|
54
|
+
|
55
|
+
### Prompt
|
56
|
+
|
57
|
+
- `PG::URL.prompt` (aliases `PG::URL.>>`, `PG::URL.request`)
|
58
|
+
|
59
|
+
Constructs and returns a connection string built from details specified by the user in a prompt.
|
60
|
+
|
61
|
+
## Development
|
62
|
+
|
63
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
64
|
+
|
65
|
+
## Contributing
|
66
|
+
|
67
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/eonu/pg-url.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "pg/url"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/lib/pg/url.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'url/prompt'
|
2
|
+
require_relative 'url/generator'
|
3
|
+
require_relative 'url/error'
|
4
|
+
require_relative 'url/type'
|
5
|
+
require_relative 'url/version'
|
6
|
+
|
7
|
+
module PG
|
8
|
+
class URL
|
9
|
+
PARAMS = %i[host port database username password]
|
10
|
+
ALLOW_EMPTY = %i[host port password]
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def new(**params)
|
14
|
+
if ((PARAMS-ALLOW_EMPTY)-params.keys).empty?
|
15
|
+
required = {}
|
16
|
+
(PARAMS-(PARAMS-params.keys)).each{|k|required[k] = params[k]}
|
17
|
+
Type.check(required)
|
18
|
+
Generator.new(params).to_s
|
19
|
+
else
|
20
|
+
raise Error::MissingParams.new((PARAMS-ALLOW_EMPTY)-params.keys)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
alias_method :[], :new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/pg/url/error.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'string/builder'
|
2
|
+
|
3
|
+
module PG
|
4
|
+
class URL
|
5
|
+
module Error
|
6
|
+
class MissingParams < StandardError
|
7
|
+
attr_reader :params
|
8
|
+
def initialize(params = [], message = String.new)
|
9
|
+
@params = params
|
10
|
+
case params.length
|
11
|
+
when 1
|
12
|
+
message = message.empty? ? 'Missing required connection string parameter' : message
|
13
|
+
super("#{message}: #{params.first}")
|
14
|
+
else
|
15
|
+
message = message.empty? ? 'Missing required connection string parameters' : message
|
16
|
+
super("#{message}: [#{params*', '}].")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class InvalidType < StandardError
|
22
|
+
using String::Builder
|
23
|
+
|
24
|
+
attr_reader :invalid
|
25
|
+
def initialize(invalid = [], message = String.new)
|
26
|
+
@invalid = invalid
|
27
|
+
message = message.empty? ? 'Invalid parameter type(s)' : message
|
28
|
+
message.build! do |s|
|
29
|
+
lines = []
|
30
|
+
invalid.each do |param|
|
31
|
+
line = String.build "\n" do |s2|
|
32
|
+
s2 << "#{param[:param]}: "
|
33
|
+
s2 << "Got #{param[:is_a?]}, "
|
34
|
+
s2 << "Expected [#{param[:expected]*', '}]"
|
35
|
+
end
|
36
|
+
lines << line
|
37
|
+
end
|
38
|
+
s << lines*', '
|
39
|
+
end
|
40
|
+
super(message)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'string/builder'
|
2
|
+
|
3
|
+
module PG
|
4
|
+
class URL
|
5
|
+
class Generator
|
6
|
+
using String::Builder
|
7
|
+
|
8
|
+
def initialize(**params)
|
9
|
+
PARAMS.each do |param|
|
10
|
+
instance_variable_set("@#{param}", params[param])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
String.build 'postgres://' do |s|
|
16
|
+
s << @username
|
17
|
+
s << ":#{@password}" unless @password.nil? || @password.empty?
|
18
|
+
s << ?@
|
19
|
+
if @host.nil? || @host.empty?
|
20
|
+
s << 'localhost'
|
21
|
+
s << ?:
|
22
|
+
s << (@port.nil? ? '5432' : (@port.to_s.empty? ? '5432' : "#{@port}"))
|
23
|
+
else
|
24
|
+
s << @host
|
25
|
+
s << ":#{@port}" unless @port.nil? || @port.to_s.empty?
|
26
|
+
end
|
27
|
+
s << ?/
|
28
|
+
s << @database
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
private_constant :Generator
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'io/console'
|
3
|
+
require_relative '../url.rb'
|
4
|
+
require_relative 'generator'
|
5
|
+
|
6
|
+
module PG
|
7
|
+
class URL
|
8
|
+
class Prompt < Thor
|
9
|
+
include Thor::Actions
|
10
|
+
|
11
|
+
no_tasks do
|
12
|
+
def initialize() end
|
13
|
+
|
14
|
+
def request()
|
15
|
+
params = {}
|
16
|
+
puts
|
17
|
+
PARAMS.each do |param|
|
18
|
+
params[param] = if param == :password
|
19
|
+
puts("Enter password (Or leave blank): ")
|
20
|
+
STDIN.noecho(&:gets).chomp
|
21
|
+
else
|
22
|
+
if ALLOW_EMPTY.include?(param)
|
23
|
+
ask("Enter #{param} (Or leave blank):")
|
24
|
+
else
|
25
|
+
value = String.new
|
26
|
+
valid = false
|
27
|
+
until valid do
|
28
|
+
value = ask("Enter #{param}:")
|
29
|
+
valid = true unless value.empty?
|
30
|
+
end
|
31
|
+
value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
censored = params.dup
|
36
|
+
censored[:password] = "\e[93m*OBSCURED*\e[0m" unless censored[:password].nil? || censored[:password].empty?
|
37
|
+
puts("\n#{Generator.new(censored).to_s}")
|
38
|
+
valid = false
|
39
|
+
until valid do
|
40
|
+
value = ask("Correct connection string? [Y/n]")
|
41
|
+
if %w[Y y YES Yes yes].include? value
|
42
|
+
valid = true
|
43
|
+
elsif %w[N n NO No no].include? value
|
44
|
+
valid = true
|
45
|
+
request()
|
46
|
+
end
|
47
|
+
end
|
48
|
+
Generator.new(params).to_s
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private_constant :Prompt
|
54
|
+
|
55
|
+
class << self
|
56
|
+
def prompt() Prompt.new.request end
|
57
|
+
alias_method :request, :prompt
|
58
|
+
alias_method :>>, :prompt
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/pg/url/type.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'error'
|
2
|
+
|
3
|
+
module PG
|
4
|
+
class URL
|
5
|
+
module Type
|
6
|
+
CLASSES = {
|
7
|
+
host: [String],
|
8
|
+
port: [String, Integer],
|
9
|
+
database: [String],
|
10
|
+
username: [String],
|
11
|
+
password: [String],
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def check(params)
|
16
|
+
classes = {}
|
17
|
+
invalid = []
|
18
|
+
params.each do |k,v|
|
19
|
+
classes[k] = v.class
|
20
|
+
end
|
21
|
+
classes.each do |k,v|
|
22
|
+
unless CLASSES[k].include? v
|
23
|
+
invalid << {
|
24
|
+
param: k,
|
25
|
+
is_a?: v,
|
26
|
+
expected: CLASSES[k]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
raise Error::InvalidType.new(invalid) unless invalid.empty?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
private_constant :Type
|
35
|
+
end
|
36
|
+
end
|
data/pg-url.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "pg/url/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "pg-url"
|
7
|
+
spec.version = PG::URL::VERSION
|
8
|
+
spec.authors = ["Edwin Onuonga"]
|
9
|
+
spec.email = ["edwinonuonga@gmail.com"]
|
10
|
+
spec.summary = %q{Postgres connection string builder gem with construction through a prompt or Ruby method.}
|
11
|
+
spec.homepage = "https://www.github.com/eonu/pg-url"
|
12
|
+
|
13
|
+
# Specify which files should be added to the gem when it is released.
|
14
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
15
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
16
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
end
|
18
|
+
spec.bindir = "bin"
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
23
|
+
spec.add_development_dependency "rake", "~> 12.3"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.7"
|
25
|
+
|
26
|
+
spec.add_runtime_dependency "string-builder", "~> 2.3"
|
27
|
+
spec.add_runtime_dependency "thor", "~> 0.20"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pg-url
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Edwin Onuonga
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-07-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.7'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.7'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: string-builder
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.3'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.20'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.20'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- edwinonuonga@gmail.com
|
86
|
+
executables:
|
87
|
+
- console
|
88
|
+
- setup
|
89
|
+
extensions: []
|
90
|
+
extra_rdoc_files: []
|
91
|
+
files:
|
92
|
+
- ".gitignore"
|
93
|
+
- Gemfile
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- bin/console
|
97
|
+
- bin/setup
|
98
|
+
- lib/pg/url.rb
|
99
|
+
- lib/pg/url/error.rb
|
100
|
+
- lib/pg/url/generator.rb
|
101
|
+
- lib/pg/url/prompt.rb
|
102
|
+
- lib/pg/url/type.rb
|
103
|
+
- lib/pg/url/version.rb
|
104
|
+
- pg-url.gemspec
|
105
|
+
homepage: https://www.github.com/eonu/pg-url
|
106
|
+
licenses: []
|
107
|
+
metadata: {}
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.7.3
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: Postgres connection string builder gem with construction through a prompt
|
128
|
+
or Ruby method.
|
129
|
+
test_files: []
|