pgchief 0.2.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dac74bd646caf6b54ac884174ea91654af3733a4a638b45cf7e690c501c0534a
4
- data.tar.gz: b0be173c4090cda9a176f25434318f805f6892324e8b7a148db6ee93a09e24c5
3
+ metadata.gz: 627e9af2dc140bd7210c9f4e999f5be13ba0bf514e6397619d42bef8a6d8b838
4
+ data.tar.gz: 78a5456432854cebd9b6d6fb68f9f02256a9a37c626ac0d78ef35b3bf79f4f21
5
5
  SHA512:
6
- metadata.gz: 57135dde1c56aee8a082a36f03b440470a74549bd21ae970167ca5e4c02da91ed254ecf2a670818a712cdd6ad615372cd9a75229ff3f20c61f8ade718f0bf0a0
7
- data.tar.gz: 2a70cc3718d84daba51d552c5d7a3ae144567bdb660db57fc4f890ff13ff3b154996f0ae5cae15212e3a433d01e8f2188cb1e62064cd364c51e7c9c0705d4671
6
+ metadata.gz: 26a19391751adbd9846cd70532becfa91c4f2e6a704405764c207e817f388b5ad900a5993eb2e20b574e09e78a089658b9f1f14591e9ea5f0349476fa7b49c13
7
+ data.tar.gz: e96db718dd3e594b4f612d47b2d63bfe0792e94b4ba622d9093db6b2d8138c02cf8dc45885557a8048f767d280f597103a410468914496dd937e25b759eb2c18
data/.rubocop.yml CHANGED
@@ -18,5 +18,17 @@ Metrics/BlockLength:
18
18
  - 'spec/**/*'
19
19
  - '*.gemspec'
20
20
 
21
+ Lint/MixedRegexpCaptureTypes:
22
+ Enabled: false
23
+
21
24
  RSpec/MultipleExpectations:
22
25
  Max: 5
26
+
27
+ RSpec/ExampleLength:
28
+ Max: 20
29
+
30
+ Lint/MissingSuper:
31
+ Enabled: false
32
+
33
+ Metrics/ParameterLists:
34
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -9,6 +9,50 @@ and this project will try its best to adhere to [Semantic Versioning](https://se
9
9
 
10
10
  ### Additions
11
11
 
12
+ ### Changes
13
+
14
+ ### Fixes
15
+
16
+ ## [0.3.1]
17
+
18
+ ### Changes
19
+
20
+ - The main database url will be accessed via the config class and will prioritize
21
+ the ENV over the config file, if it is set.
22
+
23
+ ### Fixes
24
+
25
+ - Do not use the ENV only. Until now that was the only method and it was ignoring
26
+ what was set in the config file. This fixes the issue where nothing will work
27
+ if `ENV["DATABASE_URL"]` is not set.
28
+
29
+ ## [0.3.0]
30
+
31
+ ### Additions
32
+
33
+ - Refactor `exe/pgchief` to utilize `TTY::Option` for kicking off config initialization
34
+ - `pgchief --init` now creates a toml config file in your `$HOME`
35
+ - Added ability to store credentials if your config sets `credentials_file`
36
+ when db's and users are created
37
+ - Added `ConnectionString` class that abstracts the base db connection,
38
+ allowing for additions of users and db's
39
+ - Load everything in the config file to the Config attributes
40
+
41
+ ### Changes
42
+
43
+ - Default location of config changed from `~/.pgchief.toml` to `~/.config/pgchief/config.toml`
44
+ - Automatically require 'pry' in the test suite
45
+
46
+ ### Fixes
47
+
48
+ - When dropping user, ignore whenever a database has no privileges for the
49
+ selected user
50
+ - Retroactive addition of tests to cover any regressions
51
+
52
+ ## [0.2.0] - 2024-08-30
53
+
54
+ ### Additions
55
+
12
56
  - Add `j` and `k` keys as substitutes for `↑` and `↓`.
13
57
  - Allow exiting the program with the `esc` key.
14
58
  - Add ability to grant access privileges for newly created users.
@@ -17,8 +61,10 @@ and this project will try its best to adhere to [Semantic Versioning](https://se
17
61
  ### Fixes
18
62
 
19
63
  - GitHub now running CI successfully.
20
- - Newly created databases are no longer open for connection by default. `CONNECT` is revoked by default for them.
21
- - When dropping users, loop through all the databases they have access to and revoke access before dropping them.
64
+ - Newly created databases are no longer open for connection by default.
65
+ `CONNECT` is revoked by default for them.
66
+ - When dropping users, loop through all the databases they have access to and
67
+ revoke access before dropping them.
22
68
 
23
69
  ## [0.1.0] - 2024-08-30
24
70
 
@@ -29,5 +75,7 @@ and this project will try its best to adhere to [Semantic Versioning](https://se
29
75
  - Drop user ✅
30
76
  - List databases ✅
31
77
 
32
- [Unreleased]: https://github.com/jayroh/pgchief/compare/v0.1.0...HEAD
78
+ [Unreleased]: https://github.com/jayroh/pgchief/compare/v0.3.0...HEAD
79
+ [0.3.0]: https://github.com/jayroh/pgchief/releases/tag/v0.3.0
80
+ [0.2.0]: https://github.com/jayroh/pgchief/releases/tag/v0.2.0
33
81
  [0.1.0]: https://github.com/jayroh/pgchief/releases/tag/v0.1.0
data/README.md CHANGED
@@ -21,17 +21,41 @@ below for the feature check-list and current progress.
21
21
 
22
22
  ***
23
23
 
24
- ## Usage:
24
+ ## Usage
25
25
 
26
- ```
26
+ ```sh
27
27
  gem install pgchief
28
28
 
29
- # make sure the DATABASE_URL is set to the connection string for a pg server's superuser
30
- export DATABASE_URL=postgresql://postgres:password@postgres.local:5432
29
+ # To initialize the config file at `~/.config/pgchief/config.toml`:
30
+
31
+ pgchief --init
32
+
33
+ # edit the config file and set your main administrative connection string
34
+ # (vim|nano|pico|ed) ~/.config/pgchief/config.toml
35
+
36
+ # OR ... make sure the DATABASE_URL env is set to the connection string
37
+ # export DATABASE_URL=postgresql://postgres:password@postgres.local:5432
31
38
 
32
39
  pgchief
33
40
  ```
34
41
 
42
+ ## Config
43
+
44
+ Format of `~/.pgchief.toml`
45
+
46
+ ```toml
47
+ # Connection string to superuser account at your PG instance
48
+ pgurl = "postgresql://username:password@host:5432"
49
+
50
+ # Directory where db backups will be placed
51
+ backup_dir = "~/.pgchief/backups"
52
+
53
+ # ** OPTIONAL **
54
+
55
+ # Location of encrypted database connection strings
56
+ # credentials_file = "~/.pgchief/credentials"
57
+ ```
58
+
35
59
  Note:
36
60
 
37
61
  1. Prompts accept both `↑` and `↓` arrows, as well as `j` and `k`.
@@ -43,13 +67,15 @@ Note:
43
67
  2. `bundle install`
44
68
  3. `cp .env.sample .env`
45
69
  4. Edit `.env` and change:
46
- * `DATABASE_URL` to point to your main pg instance's superuser account with a connection string.
47
- * `TEST_DATABASE_URL` to point to your local pg instance where tests can be run against.
70
+ * `DATABASE_URL` to point to your main pg instance's superuser account with a
71
+ connection string.
72
+ * `TEST_DATABASE_URL` to point to your local pg instance where tests can be
73
+ run against.
48
74
  5. `bundle exec rake` to run test suite & rubocop.
49
75
 
50
- ## The ideal, aspirational, DX:
76
+ ## The ideal, aspirational, DX
51
77
 
52
- ```
78
+ ```sh
53
79
  $ pgchief --init # create the TOML file in your home dir (w/600 permissions)
54
80
  $ pgchief
55
81
 
@@ -92,27 +118,17 @@ Give "rando-username" access to database(s):
92
118
  # ... etc.
93
119
  ```
94
120
 
95
- Format of `~/.pgchief.toml`
96
-
97
- ```toml
98
- pgurl = "postgres://username:password@host:5432"
99
- backup_dir = "~/.pg_backups"
100
-
101
- # [optional] encryption key (to display hashed passwords)
102
- # encryption_key = "my-password"
103
- ```
104
-
105
121
  ***
106
122
 
107
123
  ## Feature Roadmap
108
124
 
109
- - [x] Create database
110
- - [x] Create user
111
- - [x] Drop database
112
- - [x] Drop user
113
- - [x] List databases
114
- - [x] Give user permissions to use database
115
- - [ ] Initialize toml file
116
- - [ ] Back up database
117
- - [ ] Restore database
118
- - [ ] Display connection information
125
+ * [x] Create database
126
+ * [x] Create user
127
+ * [x] Drop database
128
+ * [x] Drop user
129
+ * [x] List databases
130
+ * [x] Give user permissions to use database
131
+ * [x] Initialize toml file
132
+ * [x] Display connection information
133
+ * [ ] Back up database
134
+ * [ ] Restore database
@@ -0,0 +1,10 @@
1
+ # Connection string to superuser account at your PG instance
2
+ pgurl = "postgresql://localhost:5432"
3
+
4
+ # Directory where db backups will be placed
5
+ backup_dir = "~/.config/pgchief/backups"
6
+
7
+ # ** OPTIONAL **
8
+
9
+ # Location of saved database connection strings
10
+ # credentials_file = "~/.config/pgchief/credentials"
data/exe/pgchief CHANGED
@@ -7,4 +7,6 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
7
7
 
8
8
  require "pgchief"
9
9
 
10
- Pgchief::Prompt::Start.call
10
+ cli = Pgchief::Cli.new
11
+ cli.parse(ARGV)
12
+ cli.run
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pgchief
4
+ # Command line interface and option parsing
5
+ class Cli
6
+ include TTY::Option
7
+
8
+ option :init do
9
+ short "-i"
10
+ long "--init"
11
+ desc "Initialize the TOML configuration file"
12
+ end
13
+
14
+ def run
15
+ if params[:init]
16
+ Pgchief::Command::ConfigCreate.call
17
+ else
18
+ Pgchief::Prompt::Start.call
19
+ end
20
+ end
21
+ end
22
+ end
@@ -12,7 +12,7 @@ module Pgchief
12
12
 
13
13
  def initialize(*params)
14
14
  @params = params
15
- @conn = PG.connect(ENV.fetch("DATABASE_URL"))
15
+ @conn = PG.connect(Pgchief::Config.pgurl)
16
16
  end
17
17
 
18
18
  def call
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ module Pgchief
6
+ module Command
7
+ # Create a configuration file at $HOME
8
+ class ConfigCreate < Base
9
+ def call(dir: "#{Dir.home}/.config/pgchief")
10
+ return if File.exist?("#{dir}/config.toml")
11
+
12
+ template = File.join(__dir__, "..", "..", "..", "config", "pgchief.toml")
13
+ FileUtils.mkdir_p(dir)
14
+ FileUtils.cp(template, "#{dir}/config.toml")
15
+
16
+ puts "Configuration file created at #{dir}/config.toml"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -4,19 +4,57 @@ module Pgchief
4
4
  module Command
5
5
  # Class to grant database privileges
6
6
  class DatabasePrivilegesGrant < Base
7
- def call
8
- username = params.first
9
- databases = params.last
7
+ attr_reader :username, :password, :database
8
+
9
+ def initialize(*params)
10
+ @username = params[0]
11
+ @password = params[1]
12
+ @databases = params[2]
13
+ end
10
14
 
11
- databases.each do |database|
12
- conn.exec("GRANT CONNECT ON DATABASE #{database} TO #{username};")
15
+ def call
16
+ @databases.each do |database|
17
+ @database = database
18
+ grant_privs!
19
+ store_credentials!
13
20
  end
14
21
 
15
- "Privileges granted to #{username} on #{databases.join(", ")}"
22
+ "Privileges granted to #{username} on #{@databases.join(", ")}"
23
+ end
24
+
25
+ private
26
+
27
+ def grant_privs! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
28
+ conn = PG.connect("#{Pgchief::Config.pgurl}/#{database}")
29
+ conn.exec("GRANT CONNECT ON DATABASE #{database} TO #{username};")
30
+ conn.exec("GRANT CREATE ON SCHEMA public TO #{username};")
31
+ conn.exec("GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO #{username};")
32
+ conn.exec("GRANT USAGE ON SCHEMA public TO #{username};")
33
+ conn.exec(
34
+ <<~SQL
35
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
36
+ GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES
37
+ TO #{username};
38
+ SQL
39
+ )
40
+ conn.close
16
41
  rescue PG::Error => e
17
42
  "Error: #{e.message}"
18
43
  ensure
19
- conn.close
44
+ conn.finished? || conn.close
45
+ end
46
+
47
+ def store_credentials!
48
+ Pgchief::Command::StoreConnectionString.call(connection_string)
49
+ end
50
+
51
+ def connection_string
52
+ ConnectionString.new(
53
+ Pgchief::Config.pgurl,
54
+ username: username,
55
+ password: password,
56
+ database: database
57
+ ).to_s
20
58
  end
21
59
  end
22
60
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pgchief
4
+ module Command
5
+ # Class to view database connection string
6
+ class RetrieveConnectionString < Base
7
+ attr_reader :username, :database
8
+
9
+ def initialize(username, database = nil)
10
+ @username = username
11
+ @database = database
12
+ @connection_string = nil
13
+ end
14
+
15
+ def call
16
+ File.foreach(Config.credentials_file) do |line|
17
+ @connection_string = line if regex.match?(line)
18
+ end
19
+
20
+ @connection_string.nil? ? "No connection string found" : @connection_string
21
+ end
22
+
23
+ private
24
+
25
+ def regex
26
+ if database
27
+ /#{username}.*#{database}$/
28
+ else
29
+ /#{username}.*\d$/
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pgchief
4
+ module Command
5
+ # Class to store connection string
6
+ class StoreConnectionString
7
+ def self.call(connection_string)
8
+ new(connection_string).call
9
+ end
10
+
11
+ attr_reader :connection_string
12
+
13
+ def initialize(connection_string)
14
+ @connection_string = connection_string
15
+ end
16
+
17
+ def call
18
+ File.open(Config.credentials_file, "a") do |file|
19
+ file.puts @connection_string
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -18,7 +18,8 @@ module Pgchief
18
18
  @username, @password = params
19
19
  raise Pgchief::Errors::UserExistsError if user_exists?
20
20
 
21
- conn.exec("CREATE USER #{username} WITH #{user_options} PASSWORD '#{password}'")
21
+ create_user!
22
+ save_credentials!
22
23
 
23
24
  "User '#{username}' created successfully!"
24
25
  rescue PG::Error => e
@@ -34,9 +35,25 @@ module Pgchief
34
35
  conn.exec(query).any?
35
36
  end
36
37
 
38
+ def create_user!
39
+ conn.exec("CREATE USER #{username} WITH #{user_options} PASSWORD '#{password}'")
40
+ end
41
+
42
+ def save_credentials!
43
+ Pgchief::Command::StoreConnectionString.call(connection_string)
44
+ end
45
+
37
46
  def user_options
38
47
  USER_OPTIONS.join(" ")
39
48
  end
49
+
50
+ def connection_string
51
+ ConnectionString.new(
52
+ Pgchief::Config.pgurl,
53
+ username: username,
54
+ password: password
55
+ ).to_s
56
+ end
40
57
  end
41
58
  end
42
59
  end
@@ -30,6 +30,8 @@ module Pgchief
30
30
  def revoke_all_privileges
31
31
  databases_with_access.each do |database|
32
32
  conn.exec("REVOKE ALL PRIVILEGES ON DATABASE #{database} FROM #{username};")
33
+ rescue PG::Error
34
+ next
33
35
  end
34
36
  end
35
37
 
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ module Pgchief
6
+ # Class to store configuration settings
7
+ class Config
8
+ class << self
9
+ attr_accessor \
10
+ :backup_dir,
11
+ :credentials_file
12
+
13
+ attr_writer :pgurl
14
+
15
+ def load_config!(toml_file = "#{Dir.home}/.config/pgchief/config.toml")
16
+ config = TomlRB.load_file(toml_file, symbolize_keys: true)
17
+
18
+ @backup_dir = config[:backup_dir].gsub("~", Dir.home)
19
+ @credentials_file = config[:credentials_file]&.gsub("~", Dir.home)
20
+ @pgurl = config[:pgurl]
21
+ end
22
+
23
+ def pgurl
24
+ ENV.fetch("DATABASE_URL", @pgurl)
25
+ end
26
+
27
+ def set_up_file_structure!
28
+ FileUtils.mkdir_p(backup_dir)
29
+
30
+ return unless credentials_file && !File.exist?(credentials_file)
31
+
32
+ FileUtils.touch(credentials_file)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pgchief
4
+ # Class to parse and manipulate connection strings
5
+ class ConnectionString
6
+ URL_REGEX = %r{(?x)\A
7
+ postgres(ql)?://
8
+ (?<username>[^:@]*)?
9
+ :?(?<password>[^@]*)?
10
+ @?(?<host>[^:]*)?
11
+ :?(?<port>\d+)?
12
+ /?(?<database>[^\?]*)?
13
+ \z}
14
+
15
+ attr_reader :database_url
16
+
17
+ def initialize(
18
+ database_url,
19
+ username: nil,
20
+ password: nil,
21
+ host: nil,
22
+ port: nil,
23
+ database: nil
24
+ )
25
+ @database_url = database_url
26
+ @host = host
27
+ @username = username
28
+ @password = password
29
+ @port = port
30
+ @database = database
31
+ end
32
+
33
+ def to_s
34
+ "postgresql://#{username}:#{password}@#{host}:#{port}/#{database}"
35
+ end
36
+
37
+ def host
38
+ @host || (matched[:username] if matched[:host].empty?) || matched[:host]
39
+ end
40
+
41
+ def username
42
+ @username || ("" if matched[:host].empty? && !matched[:username].empty?) || matched[:username] || ""
43
+ end
44
+
45
+ def password
46
+ @password || matched[:password] || ""
47
+ end
48
+
49
+ def port
50
+ @port || matched[:port] || "5432"
51
+ end
52
+
53
+ def database
54
+ @database || matched[:database] || ""
55
+ end
56
+
57
+ private
58
+
59
+ def matched
60
+ @matched ||= database_url.match(URL_REGEX) || {}
61
+ end
62
+ end
63
+ end
@@ -6,7 +6,7 @@ module Pgchief
6
6
  # Database information and operations
7
7
  class Database
8
8
  def self.all
9
- conn = PG.connect(ENV.fetch("DATABASE_URL"))
9
+ conn = PG.connect(Pgchief::Config.pgurl)
10
10
  result = conn.exec("SELECT datname FROM pg_database WHERE datistemplate = false")
11
11
  result
12
12
  .map { |row| row["datname"] }
@@ -13,7 +13,7 @@ module Pgchief
13
13
 
14
14
  yes_or_no(
15
15
  "Give \"#{username}\" access to database(s)?",
16
- yes: -> { Pgchief::Prompt::GrantDatabasePrivileges.call(username) }
16
+ yes: -> { Pgchief::Prompt::GrantDatabasePrivileges.call(username, password) }
17
17
  )
18
18
  end
19
19
  end
@@ -5,16 +5,22 @@ module Pgchief
5
5
  # Class to ask for database names, in order to create it
6
6
  class GrantDatabasePrivileges < Base
7
7
  def call
8
- username = params.first || select_user
9
- databases = prompt.multi_select("Give \"#{username}\" access to database(s):", Pgchief::Database.all)
10
- result = Pgchief::Command::DatabasePrivilegesGrant.call(username, databases)
8
+ username = params[0] || select_user
9
+ password = params[1] || ask_for_password
10
+ databases = params[2] || prompt.multi_select("Give \"#{username}\" access to database(s):",
11
+ Pgchief::Database.all)
11
12
 
13
+ result = Pgchief::Command::DatabasePrivilegesGrant.call(username, password, databases)
12
14
  prompt.say result
13
15
  end
14
16
 
15
17
  def select_user
16
18
  prompt.select("Select user to update:", Pgchief::User.all)
17
19
  end
20
+
21
+ def ask_for_password
22
+ prompt.mask("Password:")
23
+ end
18
24
  end
19
25
  end
20
26
  end
@@ -5,6 +5,8 @@ module Pgchief
5
5
  # Kicks off the CLI with an initial prompt
6
6
  class Start < Base
7
7
  def call
8
+ manage_config!
9
+
8
10
  result = prompt.select(
9
11
  "Welcome! How can I help?",
10
12
  [
@@ -15,6 +17,13 @@ module Pgchief
15
17
 
16
18
  klassify("prompt", result).call
17
19
  end
20
+
21
+ private
22
+
23
+ def manage_config!
24
+ Pgchief::Config.load_config!
25
+ Pgchief::Config.set_up_file_structure!
26
+ end
18
27
  end
19
28
  end
20
29
  end
@@ -9,7 +9,8 @@ module Pgchief
9
9
  "Create user",
10
10
  "Drop user",
11
11
  "User list",
12
- "Grant database privileges"
12
+ "Grant database privileges",
13
+ "View database connection string"
13
14
  ])
14
15
 
15
16
  scope = result == "User list" ? "command" : "prompt"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pgchief
4
+ module Prompt
5
+ # Class to ask for database names, in order to create it
6
+ class ViewDatabaseConnectionString < Base
7
+ def call
8
+ username = params.first || select_user
9
+ database = prompt.select("Database you're connecting to:", Pgchief::Database.all + ["None"])
10
+ database = nil if database == "None"
11
+ result = Pgchief::Command::RetrieveConnectionString.call(username, database)
12
+
13
+ prompt.say result
14
+ end
15
+
16
+ def select_user
17
+ prompt.select("Select user to update:", Pgchief::User.all)
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/pgchief/user.rb CHANGED
@@ -6,7 +6,7 @@ module Pgchief
6
6
  # Database information and operations
7
7
  class User
8
8
  def self.all
9
- conn = PG.connect(ENV.fetch("DATABASE_URL"))
9
+ conn = PG.connect(Pgchief::Config.pgurl)
10
10
  result = conn.exec("SELECT usename FROM pg_user")
11
11
 
12
12
  result.map { |row| row["usename"] }.reject { |name| name == "postgres" }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pgchief
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/pgchief.rb CHANGED
@@ -2,10 +2,15 @@
2
2
 
3
3
  require "pg"
4
4
  require "tty-prompt"
5
- require "pgchief/version"
5
+ require "tty-option"
6
6
 
7
+ require "pgchief/cli"
8
+ require "pgchief/config"
9
+ require "pgchief/connection_string"
10
+ require "pgchief/version"
7
11
  require "pgchief/database"
8
12
  require "pgchief/user"
13
+
9
14
  require "pgchief/prompt/base"
10
15
  require "pgchief/prompt/start"
11
16
  require "pgchief/prompt/create_database"
@@ -15,12 +20,17 @@ require "pgchief/prompt/drop_database"
15
20
  require "pgchief/prompt/drop_user"
16
21
  require "pgchief/prompt/user_management"
17
22
  require "pgchief/prompt/grant_database_privileges"
23
+ require "pgchief/prompt/view_database_connection_string"
18
24
 
25
+ require "pgchief/command"
19
26
  require "pgchief/command/base"
27
+ require "pgchief/command/config_create"
20
28
  require "pgchief/command/database_create"
21
29
  require "pgchief/command/database_drop"
22
30
  require "pgchief/command/database_list"
23
31
  require "pgchief/command/database_privileges_grant"
32
+ require "pgchief/command/retrieve_connection_string"
33
+ require "pgchief/command/store_connection_string"
24
34
  require "pgchief/command/user_create"
25
35
  require "pgchief/command/user_drop"
26
36
  require "pgchief/command/user_list"
data/tmp/.gitkeep ADDED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgchief
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Oliveira
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-31 00:00:00.000000000 Z
11
+ date: 2024-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -79,21 +79,27 @@ files:
79
79
  - ".rubocop.yml"
80
80
  - CHANGELOG.md
81
81
  - CODE_OF_CONDUCT.md
82
- - LICENSE
83
82
  - LICENSE.txt
84
83
  - README.md
85
84
  - Rakefile
85
+ - config/pgchief.toml
86
86
  - exe/pgchief
87
87
  - lib/pgchief.rb
88
+ - lib/pgchief/cli.rb
88
89
  - lib/pgchief/command.rb
89
90
  - lib/pgchief/command/base.rb
91
+ - lib/pgchief/command/config_create.rb
90
92
  - lib/pgchief/command/database_create.rb
91
93
  - lib/pgchief/command/database_drop.rb
92
94
  - lib/pgchief/command/database_list.rb
93
95
  - lib/pgchief/command/database_privileges_grant.rb
96
+ - lib/pgchief/command/retrieve_connection_string.rb
97
+ - lib/pgchief/command/store_connection_string.rb
94
98
  - lib/pgchief/command/user_create.rb
95
99
  - lib/pgchief/command/user_drop.rb
96
100
  - lib/pgchief/command/user_list.rb
101
+ - lib/pgchief/config.rb
102
+ - lib/pgchief/connection_string.rb
97
103
  - lib/pgchief/database.rb
98
104
  - lib/pgchief/prompt.rb
99
105
  - lib/pgchief/prompt/base.rb
@@ -105,9 +111,11 @@ files:
105
111
  - lib/pgchief/prompt/grant_database_privileges.rb
106
112
  - lib/pgchief/prompt/start.rb
107
113
  - lib/pgchief/prompt/user_management.rb
114
+ - lib/pgchief/prompt/view_database_connection_string.rb
108
115
  - lib/pgchief/user.rb
109
116
  - lib/pgchief/version.rb
110
117
  - sig/pgchief.rbs
118
+ - tmp/.gitkeep
111
119
  homepage: https://github.com/jayroh/pgchief
112
120
  licenses:
113
121
  - MIT
@@ -131,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
139
  - !ruby/object:Gem::Version
132
140
  version: '0'
133
141
  requirements: []
134
- rubygems_version: 3.5.11
142
+ rubygems_version: 3.2.33
135
143
  signing_key:
136
144
  specification_version: 4
137
145
  summary: A simple ruby script to manage postgresql databases and users
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Joel Oliveira
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.