cloner 0.12.0 → 0.14.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 +4 -4
- data/.env +5 -0
- data/.ruby-version +1 -1
- data/CLAUDE.md +58 -0
- data/README.md +166 -0
- data/cloner.gemspec +0 -1
- data/compose.yml +15 -0
- data/lib/cloner/ar.rb +7 -7
- data/lib/cloner/docker_compose.rb +283 -0
- data/lib/cloner/internal.rb +1 -0
- data/lib/cloner/mongodb.rb +32 -2
- data/lib/cloner/mysql.rb +65 -15
- data/lib/cloner/postgres.rb +63 -15
- data/lib/cloner/version.rb +1 -1
- data/lib/cloner.rb +1 -0
- data/lib/generators/cloner_generator.rb +18 -4
- data/lib/generators/templates/cloner_docker_compose.thor.erb +154 -0
- data/test/dl_compose_test.thor +158 -0
- data/test/test_docker_compose.rb +213 -0
- data/test/tmp/dump/cloner.bak +1 -0
- metadata +15 -21
@@ -0,0 +1,213 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require_relative '../lib/cloner'
|
5
|
+
|
6
|
+
# Mock Rails for testing
|
7
|
+
class ::Rails
|
8
|
+
def self.root
|
9
|
+
Pathname.new(File.expand_path("../", __FILE__))
|
10
|
+
end
|
11
|
+
def self.env
|
12
|
+
"development"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestDockerCompose < Cloner::Base
|
17
|
+
no_commands do
|
18
|
+
def rails_path
|
19
|
+
File.expand_path("../", __FILE__)
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_env
|
23
|
+
require 'net/ssh'
|
24
|
+
require 'shellwords'
|
25
|
+
require 'active_support/core_ext/object'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Test with mock SSH - no actual connection
|
29
|
+
def ssh_host
|
30
|
+
'localhost'
|
31
|
+
end
|
32
|
+
|
33
|
+
def ssh_user
|
34
|
+
'test'
|
35
|
+
end
|
36
|
+
|
37
|
+
def env_from
|
38
|
+
"production"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Docker Compose configuration
|
42
|
+
def use_docker_compose?
|
43
|
+
true
|
44
|
+
end
|
45
|
+
|
46
|
+
def local_docker_compose?
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def remote_docker_compose?
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
def local_docker_compose_service
|
55
|
+
'testdb'
|
56
|
+
end
|
57
|
+
|
58
|
+
def remote_docker_compose_service
|
59
|
+
'rtdb'
|
60
|
+
end
|
61
|
+
|
62
|
+
def local_docker_compose_path
|
63
|
+
Rails.root.parent.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
def remote_app_path
|
67
|
+
'/root/compose/rtrack'
|
68
|
+
end
|
69
|
+
|
70
|
+
def remote_dump_path
|
71
|
+
"#{remote_app_path}/tmp_dump"
|
72
|
+
end
|
73
|
+
|
74
|
+
# Mock database configurations
|
75
|
+
def read_ar_r_conf
|
76
|
+
{
|
77
|
+
adapter: "postgresql",
|
78
|
+
host: "rtdb",
|
79
|
+
database: "rtrack",
|
80
|
+
username: "rtrack",
|
81
|
+
password: "testpass"
|
82
|
+
}.stringify_keys
|
83
|
+
end
|
84
|
+
|
85
|
+
def ar_conf
|
86
|
+
{
|
87
|
+
adapter: "postgresql",
|
88
|
+
host: "localhost",
|
89
|
+
database: "test_development",
|
90
|
+
username: "testuser",
|
91
|
+
password: "testpass"
|
92
|
+
}.stringify_keys
|
93
|
+
end
|
94
|
+
|
95
|
+
def ar_to
|
96
|
+
ar_conf['database']
|
97
|
+
end
|
98
|
+
|
99
|
+
def verbose?
|
100
|
+
true
|
101
|
+
end
|
102
|
+
|
103
|
+
# Override SSH to test without actual connection
|
104
|
+
def do_ssh(&block)
|
105
|
+
puts "MOCK SSH: Would connect to #{ssh_user}@#{ssh_host}"
|
106
|
+
# Create mock SSH session
|
107
|
+
mock_ssh = Object.new
|
108
|
+
def mock_ssh.exec!(cmd)
|
109
|
+
puts "MOCK SSH EXEC: #{cmd}"
|
110
|
+
# Return mock responses
|
111
|
+
if cmd.include?('.env')
|
112
|
+
return "DB_HOST=rtdb\nDB_PORT=5432\nDB_NAME=rtrack\nDB_USER=rtrack\nDB_PASSWORD=testpass\n"
|
113
|
+
elsif cmd.include?('mkdir')
|
114
|
+
return ""
|
115
|
+
elsif cmd.include?('pg_dump')
|
116
|
+
return ""
|
117
|
+
end
|
118
|
+
""
|
119
|
+
end
|
120
|
+
def mock_ssh.open_channel(&block)
|
121
|
+
mock_channel = Object.new
|
122
|
+
def mock_channel.exec(cmd, &cb)
|
123
|
+
puts "MOCK CHANNEL EXEC: #{cmd}"
|
124
|
+
end
|
125
|
+
def mock_channel.on_data(&cb)
|
126
|
+
cb.call(nil, "")
|
127
|
+
end
|
128
|
+
def mock_channel.on_extended_data(&cb)
|
129
|
+
end
|
130
|
+
def mock_channel.on_request(type, &cb)
|
131
|
+
if type == "exit-status"
|
132
|
+
data = Object.new
|
133
|
+
def data.read_long
|
134
|
+
0
|
135
|
+
end
|
136
|
+
cb.call(nil, data)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
block.call(mock_channel)
|
140
|
+
end
|
141
|
+
def mock_ssh.loop
|
142
|
+
end
|
143
|
+
def mock_ssh.scp
|
144
|
+
mock_scp = Object.new
|
145
|
+
def mock_scp.download!(from, to, opts = {})
|
146
|
+
puts "MOCK SCP: Download #{from} to #{to}"
|
147
|
+
end
|
148
|
+
mock_scp
|
149
|
+
end
|
150
|
+
block.call(mock_ssh)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Override ssh_exec! to simplify testing
|
154
|
+
def ssh_exec!(ssh, cmd)
|
155
|
+
puts "MOCK SSH EXEC!: #{cmd}"
|
156
|
+
# Return mock .env content when requested
|
157
|
+
if cmd.include?('.env')
|
158
|
+
env_content = "DB_HOST=rtdb\nDB_PORT=5432\nDB_NAME=rtrack\nDB_USER=rtrack\nDB_PASSWORD=testpass\n"
|
159
|
+
[0, env_content]
|
160
|
+
else
|
161
|
+
[0, ""]
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Override check_ssh_err for testing
|
166
|
+
def check_ssh_err(ret)
|
167
|
+
# Do nothing in test
|
168
|
+
end
|
169
|
+
|
170
|
+
# Override rsync for testing
|
171
|
+
def rsync(from, to)
|
172
|
+
puts "MOCK RSYNC: #{from} -> #{to}"
|
173
|
+
# Create a dummy backup file for testing
|
174
|
+
FileUtils.mkdir_p(pg_path)
|
175
|
+
File.write("#{pg_path}/#{db_file_name}.bak", "MOCK BACKUP DATA")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
desc "test_compose", "Test Docker Compose functionality"
|
180
|
+
def test_compose
|
181
|
+
load_env
|
182
|
+
|
183
|
+
puts "=== Testing Docker Compose Integration ==="
|
184
|
+
puts "\nConfiguration:"
|
185
|
+
puts "- Local Docker Compose: #{local_docker_compose?}"
|
186
|
+
puts "- Remote Docker Compose: #{remote_docker_compose?}"
|
187
|
+
puts "- Local Service: #{local_docker_compose_service}"
|
188
|
+
puts "- Remote Service: #{remote_docker_compose_service}"
|
189
|
+
|
190
|
+
puts "\n=== Testing pg_bin_path methods ==="
|
191
|
+
puts "Local pg_dump command:"
|
192
|
+
puts pg_local_bin_path('pg_dump')
|
193
|
+
|
194
|
+
puts "\nRemote pg_dump command:"
|
195
|
+
puts pg_remote_bin_path('pg_dump')
|
196
|
+
|
197
|
+
puts "\n=== Testing env var reading ==="
|
198
|
+
puts "Remote DB Config:"
|
199
|
+
puts remote_db_config.inspect
|
200
|
+
|
201
|
+
puts "\nLocal DB Config:"
|
202
|
+
puts local_db_config.inspect
|
203
|
+
|
204
|
+
puts "\n=== Simulating database clone ==="
|
205
|
+
clone_db
|
206
|
+
|
207
|
+
puts "\n=== Test completed successfully! ==="
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
if __FILE__ == $0
|
212
|
+
TestDockerCompose.start(['test_compose'])
|
213
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
MOCK BACKUP DATA
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebtv
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: thor
|
@@ -52,20 +51,6 @@ dependencies:
|
|
52
51
|
- - ">="
|
53
52
|
- !ruby/object:Gem::Version
|
54
53
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: fileutils
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
54
|
- !ruby/object:Gem::Dependency
|
70
55
|
name: bundler
|
71
56
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,16 +86,20 @@ executables: []
|
|
101
86
|
extensions: []
|
102
87
|
extra_rdoc_files: []
|
103
88
|
files:
|
89
|
+
- ".env"
|
104
90
|
- ".gitignore"
|
105
91
|
- ".ruby-version"
|
92
|
+
- CLAUDE.md
|
106
93
|
- Gemfile
|
107
94
|
- LICENSE.txt
|
108
95
|
- README.md
|
109
96
|
- Rakefile
|
110
97
|
- cloner.gemspec
|
98
|
+
- compose.yml
|
111
99
|
- lib/cloner.rb
|
112
100
|
- lib/cloner/ar.rb
|
113
101
|
- lib/cloner/base.rb
|
102
|
+
- lib/cloner/docker_compose.rb
|
114
103
|
- lib/cloner/internal.rb
|
115
104
|
- lib/cloner/mongodb.rb
|
116
105
|
- lib/cloner/mysql.rb
|
@@ -120,12 +109,15 @@ files:
|
|
120
109
|
- lib/cloner/version.rb
|
121
110
|
- lib/generators/cloner_generator.rb
|
122
111
|
- lib/generators/templates/cloner_base.template
|
112
|
+
- lib/generators/templates/cloner_docker_compose.thor.erb
|
123
113
|
- lib/generators/templates/cloner_extend.thor.erb
|
114
|
+
- test/dl_compose_test.thor
|
115
|
+
- test/test_docker_compose.rb
|
116
|
+
- test/tmp/dump/cloner.bak
|
124
117
|
homepage: https://github.com/rs-pro/cloner
|
125
118
|
licenses:
|
126
119
|
- MIT
|
127
120
|
metadata: {}
|
128
|
-
post_install_message:
|
129
121
|
rdoc_options: []
|
130
122
|
require_paths:
|
131
123
|
- lib
|
@@ -140,8 +132,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
132
|
- !ruby/object:Gem::Version
|
141
133
|
version: '0'
|
142
134
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
144
|
-
signing_key:
|
135
|
+
rubygems_version: 3.6.9
|
145
136
|
specification_version: 4
|
146
137
|
summary: Easily clone your production Mongoid database and files for local development
|
147
|
-
test_files:
|
138
|
+
test_files:
|
139
|
+
- test/dl_compose_test.thor
|
140
|
+
- test/test_docker_compose.rb
|
141
|
+
- test/tmp/dump/cloner.bak
|