pgai 1.0.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b90d7c59fd71a8be56fa44aa2cb5f0852ffd32727d32122623374f55351e91d
4
- data.tar.gz: aceb7f2333e5335779f5de61c78a13522e8b3181561f42f72d4f7feb5430ee6c
3
+ metadata.gz: 00ac038ff78647c4a3569cb87ebe3ae2dd10b9946be720ccffba5b951fc09f26
4
+ data.tar.gz: b4581834f1c91edfddff07cff3e05bdd658aa8983038a40adc24b3beaaf68158
5
5
  SHA512:
6
- metadata.gz: cdd32ea51e752bc2430206445dfdd63f99d3102213a5412083750b6b1ec522681fb3ecf4d49e4328a7d84efff543cd7405ebe6b39a7613270d268fbd38f7672b
7
- data.tar.gz: f9efad629d63f4094e75d8c79c1a2af85eb7947864437828c42417948b28606a47a5bd09f3545377e72f1e5e9894ee2c06b3f5a3a43529b135a883cc733b1056
6
+ metadata.gz: 572343b7a247938db90162ed94f44aa835f0dd7078ca6366f78b0b4151e8c82218b2aacd47f45f8ecb21c0d381e093642a5e40f0b61da37a28014c0a104d80a4
7
+ data.tar.gz: f7fa39825ffcac44f5130b5e2a98f9348d013928382f8ee5ae73d63417f75c1f6cb2dfc85d4ef627c4828656ede3fccee9eea4dcb9efcbdcde9385b44e238ccf
data/lib/pgai/cli/env.rb CHANGED
@@ -33,10 +33,26 @@ module Pgai::Cli
33
33
  desc "list", "List all configured environments"
34
34
  def list
35
35
  data = Pgai::Resources::Local::Environment.all.map do |env|
36
- env.attributes.slice(:id, :alias, :port, :dbname)
36
+ env.attributes.slice(:id, :alias, :port, :dbname, :snapshot)
37
37
  end
38
38
 
39
39
  say JSON.pretty_generate(data)
40
40
  end
41
+
42
+ desc "dup env", "Duplicate an environment and override the provided attributes"
43
+ method_option :alias, aliases: "-a",
44
+ desc: "This will be used internally for the connect command",
45
+ required: true
46
+ method_option :dbname,
47
+ aliases: "-n",
48
+ desc: "Specify database name to connect to by default"
49
+ method_option :snapshot,
50
+ aliases: "-s",
51
+ desc: "Specify the snapshot id if you want to create a clone from a specific snapshot"
52
+ def dup(env)
53
+ env = Pgai::Resources::Local::Environment.find(env)
54
+ attrs = env.attributes.merge(options.transform_keys(&:to_sym))
55
+ Pgai::Resources::Local::Environment.new(attrs).save
56
+ end
41
57
  end
42
58
  end
data/lib/pgai/client.rb CHANGED
@@ -46,6 +46,7 @@ module Pgai
46
46
  def parse_reponse(data)
47
47
  data = JSON.parse(data)
48
48
  transform!(data)
49
+ handle_unauthorized(data)
49
50
  data
50
51
  end
51
52
 
@@ -65,5 +66,12 @@ module Pgai
65
66
  transform_array!(data)
66
67
  end
67
68
  end
69
+
70
+ def handle_unauthorized(data)
71
+ return unless data.is_a?(Hash)
72
+ return unless data[:code] == "UNAUTHORIZED"
73
+
74
+ raise UnauthorizedError, data[:message]
75
+ end
68
76
  end
69
77
  end
@@ -6,6 +6,7 @@ module Pgai
6
6
  class CreateCloneService
7
7
  HOSTNAME = "127.0.0.1"
8
8
  CLONE_REFRESH_INTERVAL = 0.2
9
+ PROGRESS_BAR_WIDTH = 80
9
10
 
10
11
  attr_reader :id, :env, :logger
11
12
 
@@ -16,11 +17,15 @@ module Pgai
16
17
  end
17
18
 
18
19
  def execute
20
+ logger.info("Preparing clone ...")
21
+ logger.debug { "Expected cloning time: #{env.expected_cloning_time}" }
22
+ progress_bar.start
23
+
19
24
  create_clone_resource
20
- logger.debug(clone_resource.status_message)
21
- progress_bar.advance
25
+
26
+ logger.debug { clone_resource.status_message }
22
27
  wait_for_clone_to_be_ready
23
- logger.debug(clone_resource.status_message)
28
+ logger.debug { clone_resource.status_message }
24
29
 
25
30
  Resources::Local::Clone.new(cached_clone_attributes).tap(&:save)
26
31
  end
@@ -28,7 +33,7 @@ module Pgai
28
33
  def create_clone_resource
29
34
  @clone_resource = Resources::Remote::Clone.new(id: id).tap do |resource|
30
35
  resource.db_object = Resources::Remote::DbObject.new(db_name: env.dbname)
31
- resource.snapshot = Resources::Remote::Snapshot.latest
36
+ resource.snapshot = find_snapshot
32
37
  resource.save
33
38
  end
34
39
  end
@@ -51,10 +56,18 @@ module Pgai
51
56
  @clone_resource ||= create_clone_resource
52
57
  end
53
58
 
59
+ def find_snapshot
60
+ if env.snapshot
61
+ Resources::Remote::Snapshot.find(env.snapshot)
62
+ else
63
+ Resources::Remote::Snapshot.latest
64
+ end
65
+ end
66
+
54
67
  def wait_for_clone_to_be_ready
55
68
  loop do
69
+ progress_bar.advance(steps)
56
70
  clone_resource.refresh
57
- progress_bar.advance
58
71
  break if clone_resource.ready?
59
72
  sleep(CLONE_REFRESH_INTERVAL)
60
73
  end
@@ -62,14 +75,11 @@ module Pgai
62
75
  end
63
76
 
64
77
  def progress_bar
65
- @progress_bar ||= TTY::ProgressBar.new(
66
- "Preparing clone ... [:bar]",
67
- total: progress_bar_steps
68
- )
78
+ @progress_bar ||= TTY::ProgressBar.new("[:bar]", total: PROGRESS_BAR_WIDTH)
69
79
  end
70
80
 
71
- def progress_bar_steps
72
- (env.expected_cloning_time / CLONE_REFRESH_INTERVAL).ceil + 1
81
+ def steps
82
+ @steps ||= (PROGRESS_BAR_WIDTH / env.expected_cloning_time).ceil
73
83
  end
74
84
  end
75
85
  end
@@ -95,7 +95,6 @@ module Pgai
95
95
  def assign_attributes(user_attributes)
96
96
  user_attributes.each do |key, value|
97
97
  attribute = self.class.attributes.find { |attr| attr.name == key }
98
- raise "shit" unless attribute
99
98
 
100
99
  assign_attribute(attribute, value)
101
100
  end
@@ -10,6 +10,7 @@ module Pgai
10
10
  attribute :dbname, :string
11
11
  attribute :access_token, :string
12
12
  attribute :clone_prefix, :string
13
+ attribute :snapshot, :string
13
14
 
14
15
  def client
15
16
  @client ||= Pgai::Client.new(
@@ -24,6 +24,12 @@ module Pgai
24
24
  def path
25
25
  "snapshots"
26
26
  end
27
+
28
+ def find(id)
29
+ record = all.find { |snapshot| snapshot.id.to_s == id.to_s }
30
+ raise Pgai::ResourceNotFound unless record
31
+ record
32
+ end
27
33
  end
28
34
  end
29
35
  end
data/lib/pgai/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pgai
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.2"
3
3
  end
data/lib/pgai.rb CHANGED
@@ -5,8 +5,14 @@ require "zeitwerk"
5
5
  loader = Zeitwerk::Loader.for_gem
6
6
  loader.setup
7
7
 
8
+ require "thor"
9
+
8
10
  module Pgai
9
11
  class Error < StandardError; end
10
12
 
13
+ class CliError < ::Thor::Error; end
14
+
11
15
  class ResourceNotFound < Error; end
16
+
17
+ class UnauthorizedError < CliError; end
12
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marius Bobin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-18 00:00:00.000000000 Z
11
+ date: 2024-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -284,7 +284,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
284
284
  - !ruby/object:Gem::Version
285
285
  version: '0'
286
286
  requirements: []
287
- rubygems_version: 3.4.10
287
+ rubygems_version: 3.4.19
288
288
  signing_key:
289
289
  specification_version: 4
290
290
  summary: CLI wrapper for postgres.ai thin clones