shift-client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 07021bd3baceae897cab260d54bfa16bc277941a
4
+ data.tar.gz: 54234ff75fba07bc2d216f2ee739428fbf8e7276
5
+ SHA512:
6
+ metadata.gz: cbe652fbbb545248a7e8d11ea8c7b8a3ccb2777b778ce6bee416a311156e781a1991938581501965253457d87d9e512fc1cae48347eb9158bdfa551bdb71fe44
7
+ data.tar.gz: 2a864e2b1b9394418d7cf1c4aa7fb855aa2fef6af137b44186620397dc74e7781c680ff26f8d099d8339162ee6422d67064990d26ea8e3c10cb5f16203b97ea7
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rest-client'
4
+
5
+ group :test, :development do
6
+ gem 'colored'
7
+ gem 'commander'
8
+ gem 'rspec-rails'
9
+ end
@@ -0,0 +1,100 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ actionpack (5.0.0)
5
+ actionview (= 5.0.0)
6
+ activesupport (= 5.0.0)
7
+ rack (~> 2.0)
8
+ rack-test (~> 0.6.3)
9
+ rails-dom-testing (~> 2.0)
10
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
11
+ actionview (5.0.0)
12
+ activesupport (= 5.0.0)
13
+ builder (~> 3.1)
14
+ erubis (~> 2.7.0)
15
+ rails-dom-testing (~> 2.0)
16
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
17
+ activesupport (5.0.0)
18
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
+ i18n (~> 0.7)
20
+ minitest (~> 5.1)
21
+ tzinfo (~> 1.1)
22
+ builder (3.2.2)
23
+ colored (1.2)
24
+ commander (4.4.0)
25
+ highline (~> 1.7.2)
26
+ concurrent-ruby (1.0.2)
27
+ diff-lcs (1.2.5)
28
+ domain_name (0.5.20160310)
29
+ unf (>= 0.0.5, < 1.0.0)
30
+ erubis (2.7.0)
31
+ highline (1.7.8)
32
+ http-cookie (1.0.2)
33
+ domain_name (~> 0.5)
34
+ i18n (0.7.0)
35
+ loofah (2.0.3)
36
+ nokogiri (>= 1.5.9)
37
+ method_source (0.8.2)
38
+ mime-types (2.99.1)
39
+ mini_portile2 (2.1.0)
40
+ minitest (5.9.0)
41
+ netrc (0.11.0)
42
+ nokogiri (1.6.8)
43
+ mini_portile2 (~> 2.1.0)
44
+ pkg-config (~> 1.1.7)
45
+ pkg-config (1.1.7)
46
+ rack (2.0.1)
47
+ rack-test (0.6.3)
48
+ rack (>= 1.0)
49
+ rails-dom-testing (2.0.1)
50
+ activesupport (>= 4.2.0, < 6.0)
51
+ nokogiri (~> 1.6.0)
52
+ rails-html-sanitizer (1.0.3)
53
+ loofah (~> 2.0)
54
+ railties (5.0.0)
55
+ actionpack (= 5.0.0)
56
+ activesupport (= 5.0.0)
57
+ method_source
58
+ rake (>= 0.8.7)
59
+ thor (>= 0.18.1, < 2.0)
60
+ rake (11.2.2)
61
+ rest-client (1.8.0)
62
+ http-cookie (>= 1.0.2, < 2.0)
63
+ mime-types (>= 1.16, < 3.0)
64
+ netrc (~> 0.7)
65
+ rspec-core (3.5.0)
66
+ rspec-support (~> 3.5.0)
67
+ rspec-expectations (3.5.0)
68
+ diff-lcs (>= 1.2.0, < 2.0)
69
+ rspec-support (~> 3.5.0)
70
+ rspec-mocks (3.5.0)
71
+ diff-lcs (>= 1.2.0, < 2.0)
72
+ rspec-support (~> 3.5.0)
73
+ rspec-rails (3.5.0)
74
+ actionpack (>= 3.0)
75
+ activesupport (>= 3.0)
76
+ railties (>= 3.0)
77
+ rspec-core (~> 3.5.0)
78
+ rspec-expectations (~> 3.5.0)
79
+ rspec-mocks (~> 3.5.0)
80
+ rspec-support (~> 3.5.0)
81
+ rspec-support (3.5.0)
82
+ thor (0.19.1)
83
+ thread_safe (0.3.5)
84
+ tzinfo (1.2.2)
85
+ thread_safe (~> 0.1)
86
+ unf (0.1.4)
87
+ unf_ext
88
+ unf_ext (0.0.7.2)
89
+
90
+ PLATFORMS
91
+ ruby
92
+
93
+ DEPENDENCIES
94
+ colored
95
+ commander
96
+ rest-client
97
+ rspec-rails
98
+
99
+ BUNDLED WITH
100
+ 1.12.5
@@ -0,0 +1,187 @@
1
+ Description
2
+ ------
3
+ shift-client is a command-line interface for shift. It interacts with the shift API and can be used to do all of the same actions that can be done from the ui
4
+
5
+ Installation
6
+ ------
7
+ Run the shift-client executable directly
8
+ ```
9
+ ./shift/ui/shift-client/bin/shift-client --help
10
+ ```
11
+ Or install it directly
12
+ ```
13
+ $ gem install shift-client
14
+ $ shift-client --help
15
+ ```
16
+
17
+ Usage
18
+ ------
19
+ Running with --help shows you all of the available commands and global options
20
+ ```
21
+ $ shift-client --help
22
+ NAME:
23
+
24
+ shift-client
25
+
26
+ DESCRIPTION:
27
+
28
+ Interact with the shift API from the command-line
29
+
30
+ COMMANDS:
31
+
32
+ approve migration Approve a migration
33
+ cancel migration Cancel a migration
34
+ create migration Create a migration
35
+ delete migration Delete a migration
36
+ dequeue migration Dequeue a migration
37
+ enqueue migration Enqueue a migration
38
+ get migration Get a migration
39
+ help Display global or [command] help documentation
40
+ pause migration Pause a migration
41
+ rename migration Rename a migration
42
+ resume migration Resume a migration
43
+ start migration Start a migration
44
+ unapprove migration Unapprove a migratio
45
+
46
+ GLOBAL OPTIONS:
47
+
48
+ --url URL
49
+ The API URL for shift (default: http://localhost:3000)
50
+
51
+ --ssl-cert SSL CERT
52
+ An SSL cert for authenticating against the shift api
53
+
54
+ --ssl-key SSL KEY
55
+ An SSL key for authenticating against the shift api
56
+
57
+ --ssl-ca SSL CA
58
+ An SSL CA cert for authenticating against the shift api
59
+
60
+ -h, --help
61
+ Display help documentation
62
+
63
+ -v, --version
64
+ Display version information
65
+
66
+ -t, --trace
67
+ Display backtrace when an error occurs
68
+ ```
69
+
70
+ Running with --help on a specific command shows you the specific options for that command
71
+ ```
72
+ $ shift-client approve migration --help
73
+
74
+ NAME:
75
+
76
+ approve migration
77
+
78
+ SYNOPSIS:
79
+
80
+ shift-client approve migration [options]
81
+
82
+ DESCRIPTION:
83
+
84
+ Approve a migration
85
+
86
+ OPTIONS:
87
+
88
+ --id ID
89
+ The id of the migration
90
+
91
+ --lock-version LOCK VERSION
92
+ The most recent lock version of the migration
93
+
94
+ --runtype RUNTYPE
95
+ The type of run to approve (options are: short, long, nocheckalter)
96
+
97
+ --approver APPROVER
98
+ The username of the approver
99
+
100
+ ```
101
+
102
+ ## Global Options
103
+ Without specifying any global options, shift-cli will try to talk to the shift API at localhost:3000 without SSL. If that's where the shift ui is running, you don't need to pass any global options. If it's running at a different URL, or requires valid SSL certs to access it, you can supply any of the following: `--url`, `--ssl-cert`, `--ssl-key`, and `--ssl-ca`
104
+
105
+ ## Responses
106
+ The standard response for most successful commands is a JSON object that looks like the following
107
+ ```
108
+ $ shift-client get migration --id 25
109
+ {
110
+ "migration": {
111
+ "id": 25,
112
+ "created_at": "2016-06-07T01:20:10.000Z",
113
+ "updated_at": "2016-06-07T01:21:19.000Z",
114
+ "completed_at": null,
115
+ "requestor": "developer",
116
+ "cluster_name": "default-cluster-001",
117
+ "database": "shift_development",
118
+ "ddl_statement": "alter table migrations add column mfinch int",
119
+ "final_insert": "",
120
+ "pr_url": "github.com/pr",
121
+ "table_rows_start": 25,
122
+ "table_rows_end": null,
123
+ "table_size_start": 16384,
124
+ "table_size_end": null,
125
+ "index_size_start": 16384,
126
+ "index_size_end": null,
127
+ "approved_by": "mfinch",
128
+ "approved_at": "2016-07-02T00:40:29.000Z",
129
+ "work_directory": null,
130
+ "started_at": "2016-07-02T01:08:34.000Z",
131
+ "copy_percentage": null,
132
+ "staged": true,
133
+ "status": 3,
134
+ "error_message": null,
135
+ "run_host": null,
136
+ "lock_version": 7,
137
+ "editable": false,
138
+ "runtype": 1,
139
+ "meta_request_id": null,
140
+ "initial_runtype": 1,
141
+ "auto_run": true
142
+ },
143
+ "available_actions": [
144
+ "pause",
145
+ "cancel"
146
+ ]
147
+ }
148
+ ```
149
+ As you can see, it contains a dump of the migration, as well as the actions that are available to run on it.
150
+
151
+ The only other type of response you will get from a successful command is an empty JSON object when you delete a migration
152
+ ```
153
+ $ shift-client delete migration --id 24 --lock-version 7
154
+ {
155
+ }
156
+ ```
157
+
158
+ Commands that run into errors will return JSON objects that look like the following
159
+ ```
160
+ $ shift-client start migration --id 25 --lock-version 8
161
+ {
162
+ "status": 400,
163
+ "errors": [
164
+ "Invalid action.",
165
+ "Incorrect lock_version supplied."
166
+ ]
167
+ }
168
+ ```
169
+
170
+ ## Option descriptions
171
+ * `--id`: the id of the migration you want to act on. Can get this from the response of a successful `shift-client create migration` command
172
+ * `--lock-version`: the most recent lock-version of a migration. This is used so that we know a migration's status hasn't changed without you knowing. Can get this from the response of any successful command
173
+ * `--runtype`: the type of run to approve a migration with (options are: short, long, nocheckalter). When you run `shift-client get migration` on a migration that is in the "awaiting_approval" step, the available actions in the JSON response will look something like `["approve_short", "approve_long"]`. That means that when you run `shift-client approve migration`, you must supply either `--runtype short` or `--runtype long`. A short run is one that runs an alter directly on a table. A long run is one that uses pt-osc. A nocheckalter run is one that uses pt-osc with the --nocheck-alter flag.
174
+ * `--auto-run`: this option can be passed to `shift-client start migration` and `shift-client resume migration`. When it is used, the migration will automatically rename tables after it is done copying all of its rows (instead of waiting for human interaction). `shift-client enqueue migration` automatically sets this to true
175
+ * All of the other options should be pretty self explanatory
176
+
177
+ Development
178
+ ------
179
+ Run the tests
180
+ ```
181
+ bundle exec rake spec
182
+ ```
183
+
184
+ ## License
185
+
186
+ Copyright (c) 2016 Square Inc. Distributed under the Apache 2.0 License.
187
+ See LICENSE file for further details.
@@ -0,0 +1,4 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ desc "run specs"
4
+ RSpec::Core::RakeTask.new
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
4
+
5
+ require "commander/import"
6
+ require "colored"
7
+
8
+ require "shift_client"
9
+ require "shift_client/version"
10
+
11
+ program :name, 'shift-client'
12
+ program :version, ShiftClient::VERSION
13
+ program :description, 'Interact with the shift API from the command-line'
14
+
15
+ class ShiftClientCLI
16
+ include Commander::Methods
17
+ DEFAULT_SHIFT_URL = "http://localhost:3000"
18
+
19
+ global_option "--url URL", String, "The API URL for shift (default: #{DEFAULT_SHIFT_URL})"
20
+ global_option "--ssl-cert SSL CERT", String, "An SSL cert for authenticating against the shift api"
21
+ global_option "--ssl-key SSL KEY", String, "An SSL key for authenticating against the shift api"
22
+ global_option "--ssl-ca SSL CA", String, "An SSL CA cert for authenticating against the shift api"
23
+
24
+ def run
25
+ command :'get migration' do |get_migration|
26
+ get_migration.syntax = "shift-client get migration [options]"
27
+ get_migration.description = "Get a migration"
28
+ get_migration.option "--id ID", String, "The id of the migration"
29
+
30
+ get_migration.action do |args, options|
31
+ raise "Must provide --id" unless options.id
32
+
33
+ client = shift_client_with_auth(options)
34
+ display client.get_migration(options.id)
35
+ end
36
+ end
37
+
38
+ command :'create migration' do |create_migration|
39
+ create_migration.syntax = "shift-client create migration [options]"
40
+ create_migration.description = "Create a migration"
41
+ create_migration.option "--cluster CLUSTER", String, "The cluster to run a migration on"
42
+ create_migration.option "--database DATABASE", String, "The database to run a migration on"
43
+ create_migration.option "--ddl-statement DDL STATEMENT", String, "The ddl statement to run"
44
+ create_migration.option "--pr-url PR URL", String, "The pull request URL associated with the migration"
45
+ create_migration.option "--requestor REQUESTOR", String, "Username of the person creating the migration"
46
+ create_migration.option "--final-insert FINAL INSERT", String, "A final insert statement"
47
+
48
+ create_migration.action do |args, options|
49
+ raise "Must provide --cluster" unless options.cluster
50
+ raise "Must provide --database" unless options.database
51
+ raise "Must provide --ddl-statement" unless options.ddl_statement
52
+ raise "Must provide --pr-url" unless options.pr_url
53
+ raise "Must provide --requestor" unless options.requestor
54
+
55
+ client = shift_client_with_auth(options)
56
+ display client.create_migration(options.cluster, options.database, options.ddl_statement, options.pr_url, options.requestor, final_insert: options.final_insert)
57
+ end
58
+ end
59
+
60
+ # generic actions
61
+ %w(approve unapprove start enqueue dequeue pause rename resume cancel).each do |action|
62
+ command :"#{action} migration" do |c|
63
+ c.syntax = "shift-client #{action} migration [options]"
64
+ c.description = "#{action.capitalize} a migration"
65
+
66
+ c.option "--id ID", String, "The id of the migration"
67
+ if %w(approve unapprove start enqueue dequeue rename resume).include?(action)
68
+ c.option "--lock-version LOCK VERSION", String, "The most recent lock version of the migration"
69
+ end
70
+ if %w(approve).include?(action)
71
+ c.option "--runtype RUNTYPE", String, "The type of run to approve (options are: short, long, nocheckalter)"
72
+ c.option "--approver APPROVER", String, "The username of the approver"
73
+ end
74
+ if %w(start resume).include?(action)
75
+ c.option "--auto-run", String, "If passed, this migration will automatically rename tables after completing the copy step"
76
+ end
77
+
78
+ c.action do |args, options|
79
+ raise "Must provide --id" unless options.id
80
+ if %w(approve unapprove start enqueue dequeue rename resume).include?(action)
81
+ raise "Must provide --lock-version" unless options.lock_version
82
+ end
83
+ if %w(approve).include?(action)
84
+ raise "Must provide --runtype" unless options.runtype
85
+ raise "Must provide --approver" unless options.approver
86
+ end
87
+
88
+ client = shift_client_with_auth(options)
89
+ # use the correct cancel endpoint
90
+ action = "cancel_cli" if action == "cancel"
91
+ display client.generic_migration_action_post(action, options)
92
+ end
93
+ end
94
+ end
95
+
96
+ command :'delete migration' do |delete_migration|
97
+ delete_migration.syntax = "shift-client delete migration [options]"
98
+ delete_migration.description = "Delete a migration"
99
+
100
+ delete_migration.option "--id ID", String, "The id of the migration"
101
+ delete_migration.option "--lock-version LOCK VERSION", String, "The most recent lock version of the migration"
102
+
103
+ delete_migration.action do |args, options|
104
+ raise "Must provide --id" unless options.id
105
+ raise "Must provide --lock-version" unless options.lock_version
106
+
107
+ client = shift_client_with_auth(options)
108
+ display client.delete_migration(options.id, options.lock_version)
109
+ end
110
+ end
111
+
112
+ run!
113
+ end
114
+
115
+ def shift_client_with_auth(options)
116
+ url = options.api || DEFAULT_SHIFT_URL
117
+ insecure = (options.ssl_cert && options.ssl_key && options.ssl_ca).nil?
118
+
119
+ ShiftClient.new(
120
+ url: url,
121
+ insecure: insecure,
122
+ ssl_cert: options.ssl_cert,
123
+ ssl_key: options.ssl_key,
124
+ ssl_ca: options.ssl_ca,
125
+ )
126
+ end
127
+
128
+ def display(output)
129
+ puts JSON.pretty_generate output
130
+ end
131
+ end
132
+
133
+ ShiftClientCLI.new.run
@@ -0,0 +1,132 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ class ShiftClient
5
+ attr_reader :insecure, :url
6
+ def initialize(url: raise, ssl_cert: nil, ssl_key: nil, ssl_ca: nil, insecure: true)
7
+ @ssl_cert = ssl_cert
8
+ @ssl_key = ssl_key
9
+ @ssl_ca = ssl_ca
10
+ @insecure = insecure
11
+
12
+ @url = url
13
+ end
14
+
15
+ def get_migration(migration_id)
16
+ shift_get("/api/v1/migrations/#{migration_id}")
17
+ end
18
+
19
+ def create_migration(cluster, database, ddl_statement, pr_url, requestor, final_insert: nil)
20
+ params = {
21
+ :cluster_name => cluster,
22
+ :database => database,
23
+ :ddl_statement => ddl_statement,
24
+ :pr_url => pr_url,
25
+ :requestor => requestor,
26
+ :final_insert => final_insert || "",
27
+ }
28
+
29
+ shift_post("/api/v1/migrations", params)
30
+ end
31
+
32
+ def generic_migration_action_post(action, options)
33
+ params = {}
34
+ params[:id] = options.id
35
+ params[:lock_version] = options.lock_version if options.lock_version
36
+ params[:runtype] = options.runtype if options.runtype
37
+ params[:approver] = options.approver if options.approver
38
+ params[:auto_run] = options.auto_run if options.auto_run
39
+
40
+ shift_post("/api/v1/migrations/#{action}", params)
41
+ end
42
+
43
+ def delete_migration(migration_id, lock_version)
44
+ params = {
45
+ :lock_version => lock_version,
46
+ }
47
+ shift_delete("/api/v1/migrations/#{migration_id}", params)
48
+ end
49
+
50
+ private
51
+
52
+ def shift_get(route, params = nil)
53
+ headers = get_headers
54
+ headers.merge!(params: params) if params
55
+ begin
56
+ response = resource_for_route(route).get(
57
+ headers
58
+ )
59
+ rescue RestClient::BadRequest, RestClient::ResourceNotFound => e
60
+ response = e.http_body
61
+ end
62
+
63
+ parse_response(response)
64
+ end
65
+
66
+ def shift_post(route, params = nil)
67
+ begin
68
+ response = resource_for_route(route).post(
69
+ params.to_json,
70
+ post_headers,
71
+ )
72
+ rescue RestClient::BadRequest, RestClient::ResourceNotFound => e
73
+ response = e.http_body
74
+ end
75
+
76
+ parse_response(response)
77
+ end
78
+
79
+ def shift_delete(route, params = nil)
80
+ # have to do some different stuff here because RestClient::Resource
81
+ # doesn't support extra params for deleting
82
+ headers = delete_headers
83
+ headers.merge!(params: params) if params
84
+ opts = {
85
+ method: :delete,
86
+ url: @url + route,
87
+ headers: headers,
88
+ }
89
+ opts.merge!(ssl_options) unless @insecure
90
+ begin
91
+ response = RestClient::Request.execute(opts)
92
+ rescue RestClient::BadRequest, RestClient::ResourceNotFound => e
93
+ response = e.http_body
94
+ end
95
+
96
+ parse_response(response)
97
+ end
98
+
99
+ def get_headers
100
+ {:accept => 'application/json'}
101
+ end
102
+
103
+ def post_headers
104
+ get_headers.merge!(:content_type => 'application/json')
105
+ end
106
+
107
+ def delete_headers
108
+ get_headers
109
+ end
110
+
111
+ def resource_for_route(route)
112
+ opts = {}
113
+ opts.merge!(ssl_options) unless @insecure
114
+ RestClient::Resource.new(
115
+ @url + route,
116
+ opts
117
+ )
118
+ end
119
+
120
+ def ssl_options
121
+ {
122
+ :ssl_client_cert => OpenSSL::X509::Certificate.new(File.read(@ssl_cert)),
123
+ :ssl_client_key => OpenSSL::PKey::RSA.new(File.read(@ssl_key)),
124
+ :ssl_ca_file => @ssl_ca,
125
+ :verify_ssl => OpenSSL::SSL::VERIFY_PEER,
126
+ }
127
+ end
128
+
129
+ def parse_response(response)
130
+ JSON.parse(response)
131
+ end
132
+ end
@@ -0,0 +1,3 @@
1
+ class ShiftClient
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'shift_client/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'shift-client'
9
+ spec.version = ShiftClient::VERSION
10
+ spec.authors = ['Michael Finch']
11
+ spec.email = ['mfinch@squareup.com']
12
+ spec.summary = 'Client gem for interacting with the shift API'
13
+ spec.homepage = 'https://github.com/square/shift/tree/master/ui/shift-client'
14
+ spec.required_ruby_version = '>= 2.0.0'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'json'
22
+ spec.add_runtime_dependency 'rest-client', '>= 1.8.0'
23
+ spec.add_runtime_dependency 'colored'
24
+ spec.add_runtime_dependency 'commander', '~> 4.2'
25
+
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ end
@@ -0,0 +1,70 @@
1
+ require 'shift_client'
2
+ require 'ostruct'
3
+
4
+ describe ShiftClient do
5
+ let(:shift_client) { ShiftClient.new(url: "http://localhost:3000", insecure: true) }
6
+ let(:get_headers) { {:accept => "application/json"} }
7
+ let(:post_headers) { get_headers.merge({:content_type => "application/json"}) }
8
+ let(:delete_headers) { get_headers }
9
+ let(:migration_id) { 3 }
10
+ let(:cluster) { "cluster-001" }
11
+ let(:database) { "db_01" }
12
+ let(:ddl_statement) { "alter table slug" }
13
+ let(:pr_url) { "github.com/pr" }
14
+ let(:requestor) { "michael" }
15
+ let(:final_insert) { "" }
16
+ let(:lock_version) { 7 }
17
+ let(:runtype) { "long" }
18
+ let(:approver) { "frank" }
19
+
20
+ it "#get_migration" do
21
+ path = shift_client.url + "/api/v1/migrations/#{migration_id}"
22
+ resource_double = instance_double(RestClient::Resource)
23
+ expect(RestClient::Resource).to receive(:new).with(path, {}).and_return(resource_double)
24
+ expect(resource_double).to receive(:get).with(get_headers).and_return("{}")
25
+ expect(shift_client.get_migration(migration_id)).to eq({})
26
+ end
27
+
28
+ it "#create_migration" do
29
+ path = shift_client.url + "/api/v1/migrations"
30
+ params = {
31
+ :cluster_name => cluster,
32
+ :database => database,
33
+ :ddl_statement => ddl_statement,
34
+ :pr_url => pr_url,
35
+ :requestor => requestor,
36
+ :final_insert => final_insert,
37
+ }
38
+ resource_double = instance_double(RestClient::Resource)
39
+ expect(RestClient::Resource).to receive(:new).with(path, {}).and_return(resource_double)
40
+ expect(resource_double).to receive(:post).with(params.to_json, post_headers).and_return("{}")
41
+ expect(shift_client.create_migration(
42
+ cluster, database, ddl_statement, pr_url, requestor)).to eq({})
43
+ end
44
+
45
+ it "#generic_migration_action_post" do
46
+ action = "approve"
47
+ options = OpenStruct.new \
48
+ :id => migration_id,
49
+ :lock_version => lock_version,
50
+ :runtype => runtype,
51
+ :approver => approver
52
+ path = shift_client.url + "/api/v1/migrations/" + action
53
+ resource_double = instance_double(RestClient::Resource)
54
+ expect(RestClient::Resource).to receive(:new).with(path, {}).and_return(resource_double)
55
+ expect(resource_double).to receive(:post).with(options.to_h.to_json, post_headers).and_return("{}")
56
+ expect(shift_client.generic_migration_action_post(action, options)).to eq({})
57
+ end
58
+
59
+ it "#delete_migration" do
60
+ path = shift_client.url + "/api/v1/migrations/#{migration_id}"
61
+ params = {:lock_version => lock_version}
62
+ opts = {
63
+ method: :delete,
64
+ url: path,
65
+ headers: delete_headers.merge!({params: params}),
66
+ }
67
+ expect(RestClient::Request).to receive(:execute).with(opts).and_return("{}")
68
+ expect(shift_client.delete_migration(migration_id, lock_version)).to eq({})
69
+ end
70
+ end
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_with :rspec do |mocks|
5
+ mocks.verify_doubled_constant_names = true
6
+ mocks.verify_partial_doubles = true
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shift-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Finch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: colored
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: commander
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description:
98
+ email:
99
+ - mfinch@squareup.com
100
+ executables:
101
+ - shift-client
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - Gemfile
106
+ - Gemfile.lock
107
+ - README.md
108
+ - Rakefile
109
+ - bin/shift-client
110
+ - lib/shift_client.rb
111
+ - lib/shift_client/version.rb
112
+ - shift-client.gemspec
113
+ - spec/client_spec.rb
114
+ - spec/unit_helper.rb
115
+ homepage: https://github.com/square/shift/tree/master/ui/shift-client
116
+ licenses: []
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 2.0.0
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.5.1
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Client gem for interacting with the shift API
138
+ test_files:
139
+ - spec/client_spec.rb
140
+ - spec/unit_helper.rb