pg-url 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.
- 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: []
|