mortar 0.15.25 → 0.15.26

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mortar/auth.rb CHANGED
@@ -180,9 +180,9 @@ class Mortar::Auth
180
180
 
181
181
  def ask_for_github_username
182
182
  puts
183
- puts "Please enter your github username (not email address)."
183
+ puts "Please enter your GitHub username (not email address)."
184
184
 
185
- print "Github Username: "
185
+ print "GitHub Username: "
186
186
  github_username = ask
187
187
  github_username
188
188
  end
@@ -250,11 +250,15 @@ class Mortar::Auth
250
250
  task_id = api.update_user(@mortar_user['user_id'], {'user_github_username' => @github_username}).body['task_id']
251
251
 
252
252
  task_result = nil
253
+ user_result = nil
253
254
  ticking(polling_interval) do |ticks|
254
255
  task_result = api.get_task(task_id).body
255
256
  is_finished =
256
257
  Mortar::API::Task::STATUSES_COMPLETE.include?(task_result["status_code"])
257
-
258
+ if is_finished
259
+ user_result = api.get_user().body
260
+ end
261
+
258
262
  redisplay("Setting github username: %s" %
259
263
  [is_finished ? " Done!" : spinner(ticks)],
260
264
  is_finished) # only display newline on last message
@@ -272,6 +276,10 @@ class Mortar::Auth
272
276
  raise Mortar::CLI::Errors::InvalidGithubUsername.new
273
277
  when Mortar::API::Task::STATUS_SUCCESS
274
278
  display "Successfully set github username."
279
+
280
+ if user_result['github_team_state'] == 'pending'
281
+ display pending_github_team_state_message(user_result['github_accept_invite_url'])
282
+ end
275
283
  else
276
284
  #Raise error so .netrc file is wiped out.
277
285
  raise RuntimeError, "Unknown task status: #{task_result['status_code']}"
@@ -451,6 +451,34 @@ protected
451
451
  pigscript
452
452
  end
453
453
 
454
+ def validate_github_username()
455
+ user_result = api.get_user().body
456
+ task_id = api.update_user(user_result['user_id'], {'github_team_state' => true}).body['task_id']
457
+
458
+ task_result = nil
459
+ user_result = nil
460
+ ticking(polling_interval) do |ticks|
461
+ task_result = api.get_task(task_id).body
462
+ is_finished =
463
+ Mortar::API::Task::STATUSES_COMPLETE.include?(task_result["status_code"])
464
+ if is_finished
465
+ user_result = api.get_user().body
466
+ end
467
+
468
+ redisplay("Verifying GitHub username: %s" %
469
+ [is_finished ? " Done!" : spinner(ticks)],
470
+ is_finished) # only display newline on last message
471
+ if is_finished
472
+ display
473
+ break
474
+ end
475
+ end
476
+
477
+ if user_result['github_team_state'] == 'pending'
478
+ error(pending_github_team_state_message(user_result['github_accept_invite_url']))
479
+ end
480
+ end
481
+
454
482
  def extract_project_in_dir_no_git()
455
483
  current_dirs = Dir.glob("*/")
456
484
  missing_dir = Mortar::Project::Project.required_directories.find do |required_dir|
@@ -534,7 +562,7 @@ protected
534
562
  def default_git_organization
535
563
  "mortarcode"
536
564
  end
537
-
565
+
538
566
  def polling_interval
539
567
  (options[:polling_interval] || 2.0).to_f
540
568
  end
@@ -102,6 +102,8 @@ class Mortar::Command::Projects < Mortar::Command::Base
102
102
  ask_public(is_public)
103
103
  end
104
104
  validate_project_name(name)
105
+ validate_github_username
106
+
105
107
  project_id = register_api_call(name,is_public)
106
108
  Mortar::Command::run("generate:project", [name])
107
109
  FileUtils.cd(name)
@@ -195,6 +197,7 @@ class Mortar::Command::Projects < Mortar::Command::Base
195
197
  error("Usage: mortar projects:clone PROJECT\nMust specify PROJECT.")
196
198
  end
197
199
  validate_arguments!
200
+ validate_github_username
198
201
  projects = api.get_projects().body["projects"]
199
202
  project = projects.find{|p| p['name'] == name}
200
203
  unless project
@@ -226,6 +229,7 @@ class Mortar::Command::Projects < Mortar::Command::Base
226
229
  end
227
230
  validate_arguments!
228
231
  validate_project_name(name)
232
+ validate_github_username
229
233
 
230
234
  if git.has_dot_git?
231
235
  begin
@@ -526,6 +526,17 @@ module Mortar
526
526
  end
527
527
  end
528
528
 
529
+ def pending_github_team_state_message(invite_url)
530
+ """
531
+ \nYour GitHub username has been set, but you must accept GitHub's invitation to
532
+ join the Mortar GitHub organization. If you have not received an email you
533
+ can visit #{invite_url} to view and accept your invitation.
534
+
535
+ You will need to accept this invitation to start using Mortar projects.
536
+ """
537
+ end
538
+
539
+
529
540
  private
530
541
 
531
542
  def create_display_method(name, colour_code, new_line=true)
@@ -16,5 +16,5 @@
16
16
 
17
17
  module Mortar
18
18
  # see http://semver.org/
19
- VERSION = "0.15.25"
19
+ VERSION = "0.15.26"
20
20
  end
@@ -106,7 +106,7 @@ module Mortar
106
106
 
107
107
  mock(@cli).ask_for_credentials.returns("username", "apikey")
108
108
  stub(@cli).write_credentials
109
- mock(@cli.api).get_user() {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com"})}
109
+ mock(@cli.api).get_user().times(2) {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com"})}
110
110
  mock(@cli).ask_for_github_username.returns(new_github_username)
111
111
 
112
112
  mock(@cli.api).update_user(user_id,{"user_github_username" => new_github_username}) {Excon::Response.new(:body => {"task_id" => task_id})}
@@ -128,7 +128,7 @@ module Mortar
128
128
 
129
129
  mock(@cli).ask_for_credentials.returns("username", "apikey")
130
130
  stub(@cli).write_credentials
131
- mock(@cli.api).get_user() {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com"})}
131
+ mock(@cli.api).get_user().times(2) {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com", "github_team_state" => "active"})}
132
132
  mock(@cli).ask_for_github_username.returns(new_github_username)
133
133
 
134
134
  mock(@cli.api).update_user(user_id,{"user_github_username" => new_github_username}) {Excon::Response.new(:body => {"task_id" => task_id})}
@@ -18,7 +18,7 @@ require 'spec_helper'
18
18
  require 'fakefs/spec_helpers'
19
19
  require 'mortar/command/projects'
20
20
  require 'launchy'
21
- require "mortar/api"
21
+ require 'mortar/api'
22
22
 
23
23
 
24
24
  module Mortar::Command
@@ -92,8 +92,36 @@ STDOUT
92
92
  end
93
93
 
94
94
  context("create") do
95
+ it "tries to create a project with pending github_team_state" do
96
+ task_id = "1a2b3c4d5e"
97
+ user_id = "abcdef"
98
+ project_name = "some_new_project"
99
+
100
+ mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
101
+
102
+ mock(Mortar::Auth.api).get_user().times(2) {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com", "github_team_state" => "pending"})}
103
+
104
+ mock(Mortar::Auth.api).update_user(user_id,{"github_team_state" => true}) {Excon::Response.new(:body => {"task_id" => task_id})}
105
+ mock(Mortar::Auth.api).get_task(task_id).returns(Excon::Response.new(:body => {"task_id" => task_id, "status_code" => "SUCCESS"})).ordered
106
+
107
+ stderr, stdout = execute("projects:create #{project_name}", nil, @git)
108
+ stdout.should == <<-STDOUT
109
+ \r\e[0KVerifying GitHub username: Done!
110
+
111
+ STDOUT
112
+ end
95
113
 
96
114
  it "registers and generates a project" do
115
+ task_id = "1a2b3c4d5e"
116
+ user_id = "abcdef"
117
+ mock(Mortar::Auth.api).get_user().times(2) {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com", "github_team_state" => "active"})}
118
+
119
+ mock(Mortar::Auth.api).update_user(user_id,{"github_team_state" => true}) {Excon::Response.new(:body => {"task_id" => task_id})}
120
+
121
+ mock(Mortar::Auth.api).get_task(task_id).returns(Excon::Response.new(:body => {"task_id" => task_id, "status_code" => "QUEUED"})).ordered
122
+ mock(Mortar::Auth.api).get_task(task_id).returns(Excon::Response.new(:body => {"task_id" => task_id, "status_code" => "PROGRESS"})).ordered
123
+ mock(Mortar::Auth.api).get_task(task_id).returns(Excon::Response.new(:body => {"task_id" => task_id, "status_code" => "SUCCESS"})).ordered
124
+
97
125
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
98
126
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
99
127
  project_id = "1234abcd1234abcd1234"
@@ -130,6 +158,8 @@ STDOUT
130
158
  File.read("pigscripts/some_new_project.pig").each_line { |line| line.match(/<%.*%>/).should be_nil }
131
159
 
132
160
  stdout.should == <<-STDOUT
161
+ \r\e[0KVerifying GitHub username: /\r\e[0KVerifying GitHub username: -\r\e[0KVerifying GitHub username: Done!
162
+
133
163
  Sending request to register project: some_new_project... done
134
164
  \e[1;32m create\e[0m
135
165
  \e[1;32m create\e[0m README.md
@@ -165,6 +195,13 @@ STDOUT
165
195
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
166
196
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
167
197
 
198
+ task_id = "1a2b3c4d5e"
199
+ user_id = "abcdef"
200
+ mock(Mortar::Auth.api).get_user().times(2) {Excon::Response.new(:body => {"user_id" => user_id, "user_email" => "foo@foo.com", "github_team_state" => "active"})}
201
+ mock(Mortar::Auth.api).update_user(user_id,{"github_team_state" => true}) {Excon::Response.new(:body => {"task_id" => task_id})}
202
+ mock(Mortar::Auth.api).get_task(task_id).returns(Excon::Response.new(:body => {"task_id" => task_id, "status_code" => "SUCCESS"})).ordered
203
+
204
+
168
205
  project_id = "1234abcd1234abcd1234"
169
206
  project_name = "some_new_project"
170
207
  project_git_url = "git@github.com:mortarcode-dev/#{project_name}"
@@ -426,6 +463,9 @@ STDERR
426
463
  end
427
464
 
428
465
  it "shows appropriate error message when user tries to clone non-existent project" do
466
+ any_instance_of(Mortar::Command::Base) do |b|
467
+ mock(b).validate_github_username.returns(true)
468
+ end
429
469
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
430
470
 
431
471
  stderr, stdout = execute('projects:clone sillyProjectName')
@@ -438,6 +478,9 @@ STDERR
438
478
 
439
479
  it "shows appropriate error message when user tries to clone into existing directory" do
440
480
  with_no_git_directory do
481
+ any_instance_of(Mortar::Command::Base) do |b|
482
+ mock(b).validate_github_username.returns(true)
483
+ end
441
484
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
442
485
  starting_dir = Dir.pwd
443
486
  project_dir = File.join(Dir.pwd, project1['name'])
@@ -452,6 +495,9 @@ STDERR
452
495
  end
453
496
 
454
497
  it "calls git clone when existing project is cloned" do
498
+ any_instance_of(Mortar::Command::Base) do |b|
499
+ mock(b).validate_github_username.returns(true)
500
+ end
455
501
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
456
502
  mock(@git).clone(project1['git_url'], project1['name'])
457
503
 
@@ -483,6 +529,9 @@ STDERR
483
529
  end
484
530
 
485
531
  it "shows error when in git repo already" do
532
+ any_instance_of(Mortar::Command::Base) do |b|
533
+ mock(b).validate_github_username.returns(true)
534
+ end
486
535
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
487
536
 
488
537
  with_git_initialized_project do |p|
@@ -494,6 +543,10 @@ STDERR
494
543
  end
495
544
 
496
545
  it "calls correct git commands on success" do
546
+ any_instance_of(Mortar::Command::Base) do |b|
547
+ mock(b).validate_github_username.returns(true)
548
+ end
549
+
497
550
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
498
551
  mock(Mortar::Auth.api).get_projects().returns(Excon::Response.new(:body => {"projects" => [project1, project2]}))
499
552
  project_id = "1234abcd1234abcd1234"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mortar
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 15
9
- - 25
10
- version: 0.15.25
9
+ - 26
10
+ version: 0.15.26
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mortar Data
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2014-09-10 00:00:00 Z
18
+ date: 2014-09-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rdoc
@@ -41,12 +41,12 @@ dependencies:
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- hash: 51
44
+ hash: 49
45
45
  segments:
46
46
  - 0
47
47
  - 8
48
- - 6
49
- version: 0.8.6
48
+ - 7
49
+ version: 0.8.7
50
50
  type: :runtime
51
51
  version_requirements: *id002
52
52
  - !ruby/object:Gem::Dependency