learn-open 1.2.20 → 1.2.21

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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +4 -0
  3. data/Guardfile +70 -0
  4. data/learn-open.gemspec +7 -1
  5. data/lib/learn_open.rb +66 -0
  6. data/lib/learn_open/adapters/io_adapter.rb +24 -0
  7. data/lib/learn_open/adapters/learn_web_adapter.rb +103 -0
  8. data/lib/learn_open/adapters/system_adapter.rb +30 -0
  9. data/lib/learn_open/environments.rb +35 -0
  10. data/lib/learn_open/environments/base_environment.rb +70 -0
  11. data/lib/learn_open/environments/generic_environment.rb +9 -0
  12. data/lib/learn_open/environments/ide_environment.rb +63 -0
  13. data/lib/learn_open/environments/jupyter_container_environment.rb +28 -0
  14. data/lib/learn_open/environments/linux_environment.rb +17 -0
  15. data/lib/learn_open/environments/mac_environment.rb +75 -0
  16. data/lib/learn_open/lessons.rb +24 -0
  17. data/lib/learn_open/lessons/base_lesson.rb +57 -0
  18. data/lib/learn_open/lessons/ios_lesson.rb +14 -0
  19. data/lib/learn_open/lessons/jupyter_lesson.rb +14 -0
  20. data/lib/learn_open/lessons/lab_lesson.rb +9 -0
  21. data/lib/learn_open/lessons/readme_lesson.rb +13 -0
  22. data/lib/learn_open/opener.rb +26 -469
  23. data/lib/learn_open/services/dependency_installers.rb +19 -0
  24. data/lib/learn_open/services/dependency_installers/base_installer.rb +21 -0
  25. data/lib/learn_open/services/dependency_installers/gem_installer.rb +14 -0
  26. data/lib/learn_open/services/dependency_installers/jupyter_pip_installer.rb +14 -0
  27. data/lib/learn_open/services/dependency_installers/node_package_installer.rb +20 -0
  28. data/lib/learn_open/services/dependency_installers/pip_installer.rb +14 -0
  29. data/lib/learn_open/services/file_backup_starter.rb +20 -0
  30. data/lib/learn_open/services/lesson_downloader.rb +82 -0
  31. data/lib/learn_open/services/logger.rb +23 -0
  32. data/lib/learn_open/version.rb +1 -1
  33. data/spec/fakes/fake_git.rb +20 -0
  34. data/spec/fakes/fake_learn_client.rb +214 -0
  35. data/spec/fixtures/learn-config +3 -0
  36. data/spec/learn_open/environments/ide_environment_spec.rb +62 -0
  37. data/spec/learn_open/opener_spec.rb +789 -14
  38. data/spec/spec_helper.rb +41 -0
  39. metadata +121 -5
  40. data/spec/home_dir/.learn-config +0 -3
@@ -0,0 +1,3 @@
1
+ ---
2
+ :learn_directory: "/Users/student/Development/code"
3
+ :editor: atom
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require 'fakefs/spec_helpers'
3
+
4
+ describe LearnOpen::Environments::IDEEnvironment do
5
+ include FakeFS::SpecHelpers
6
+ subject { LearnOpen::Environments::IDEEnvironment }
7
+
8
+ let(:io) { instance_double(LearnOpen::Adapters::IOAdapter) }
9
+
10
+ context "Invalid environment" do
11
+ before do
12
+ @home_dir = create_linux_home_dir("bobby")
13
+
14
+ expect(io)
15
+ .to receive(:puts)
16
+ .with("Opening new window")
17
+ end
18
+
19
+ let(:lesson) { double(name: "a-different-lesson") }
20
+ let(:env_vars) {{ "LAB_NAME" => "correct_lab", "CREATED_USER" => "bobby" }}
21
+ let(:environment) { subject.new({ io: io, environment_vars: env_vars, logger: spy }) }
22
+
23
+ it "opens correct readme" do
24
+ environment.open_readme(lesson)
25
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
26
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
27
+ end
28
+
29
+ it "opens correct lab" do
30
+ environment.open_lab(lesson, double, double)
31
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
32
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
33
+ end
34
+
35
+ it "opens correct jupyter lab" do
36
+ environment.open_jupyter_lab(lesson, double, double)
37
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
38
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
39
+ end
40
+ end
41
+
42
+ context "valid environments" do
43
+ before do
44
+ @home_dir = create_linux_home_dir("bobby")
45
+ end
46
+
47
+ let(:lesson) { double(name: "valid_lab", later_lesson: false, to_url: "valid-lesson-url") }
48
+ let(:env_vars) {{ "LAB_NAME" => "valid_lab", "CREATED_USER" => "bobby" }}
49
+ let(:environment) { subject.new({ io: io, environment_vars: env_vars, logger: spy }) }
50
+
51
+ it "opens the readme in the browser" do
52
+ expect(io).to receive(:puts).with("Opening readme...")
53
+ environment.open_readme(lesson)
54
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
55
+ expect(custom_commands_log).to eq(%Q{{"command":"browser_open","url":"valid-lesson-url"}\n})
56
+ end
57
+ it "opens the lab" do
58
+ expect(io).to receive(:puts).with("Opening readme...")
59
+ environment.open_lab(lesson, double, double)
60
+ end
61
+ end
62
+ end
@@ -1,25 +1,800 @@
1
1
  require 'spec_helper'
2
+ require 'fakefs/spec_helpers'
3
+ require 'pry'
2
4
 
3
5
  describe LearnOpen::Opener do
4
- LearnOpen::Opener::HOME_DIR = File.join(__dir__, "..", "home_dir")
6
+ include FakeFS::SpecHelpers
7
+ let(:learn_web_client) { FakeLearnClient.new(token: "some-amazing-password") }
8
+ let(:git_adapter) { FakeGit.new }
9
+ let(:system_adapter) { class_double(LearnOpen::Adapters::SystemAdapter) }
5
10
 
6
- context "Verifying repo existance" do
7
- let(:opener) { LearnOpen::Opener.new("","","") }
8
- after do
9
- path = File.join(__dir__, "..", "home_dir", "code")
10
- FileUtils.rm_rf(path)
11
+ before do
12
+ create_home_dir
13
+ create_netrc_file
14
+ create_learn_config_file
15
+ end
16
+
17
+ context "Initializer" do
18
+ it "sets the lesson" do
19
+ opener = LearnOpen::Opener.new("ttt-2-board-rb-v-000","", false)
20
+ expect(opener.target_lesson).to eq("ttt-2-board-rb-v-000")
21
+ end
22
+ it "sets the editor" do
23
+ opener = LearnOpen::Opener.new("", "atom", false)
24
+ expect(opener.editor).to eq("atom")
11
25
  end
26
+ it "sets the whether to open the next lesson or not" do
27
+ opener = LearnOpen::Opener.new("", "", true)
28
+ expect(opener.get_next_lesson).to eq(true)
29
+ end
30
+ end
31
+
32
+ context "running the opener" do
33
+ it "calls its collaborators" do
34
+ expect(system_adapter)
35
+ .to receive(:open_editor)
36
+ .with("atom", path: ".")
12
37
 
13
- it "returns true if .git directory for lab exists" do
14
- expect(opener).to receive(:repo_dir).and_return("js-rubber-duck-wrangling")
15
- FileUtils.mkdir_p("#{opener.lessons_dir}/js-rubber-duck-wrangling/.git")
38
+ expect(system_adapter)
39
+ .to receive(:open_login_shell)
40
+ .with("/usr/local/bin/fish")
16
41
 
17
- expect(opener.repo_exists?).to be_truthy
42
+ expect(system_adapter)
43
+ .to receive(:change_context_directory)
44
+ .with("/home/bobby/Development/code/rails-dynamic-request-lab-cb-000")
45
+
46
+ expect(learn_web_client)
47
+ .to receive(:fork_repo)
48
+ .with(repo_name: "rails-dynamic-request-lab-cb-000")
49
+
50
+ opener = LearnOpen::Opener.new(nil, "atom", true,
51
+ learn_web_client: learn_web_client,
52
+ git_adapter: git_adapter,
53
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
54
+ system_adapter: system_adapter,
55
+ io: spy)
56
+ opener.run
57
+ end
58
+ end
59
+ context "Opening on specific environments" do
60
+ before do
61
+ allow(system_adapter).to receive_messages(
62
+ open_editor: :noop,
63
+ open_login_shell: :noop,
64
+ change_context_directory: :noop
65
+ )
66
+ allow(learn_web_client).to receive(:fork_repo)
18
67
  end
68
+ context "IDE" do
69
+ it "restores files and watches for changes" do
70
+ environment = {
71
+ "SHELL" => "/usr/local/bin/fish",
72
+ "LAB_NAME" => "ruby_lab",
73
+ "CREATED_USER" => "bobby",
74
+ "IDE_CONTAINER" => "true",
75
+ "IDE_VERSION" => "3"
76
+ }
77
+
78
+ create_linux_home_dir("bobby")
79
+ expect(system_adapter)
80
+ .to receive(:spawn)
81
+ .with('restore-lab', block: true)
82
+ expect(system_adapter)
83
+ .to receive(:watch_dir)
84
+ .with("/home/bobby/Development/code/ruby_lab", "backup-lab")
85
+ expect(system_adapter)
86
+ .to receive(:run_command)
87
+ .with("bundle install")
88
+
89
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
90
+ learn_web_client: learn_web_client,
91
+ git_adapter: git_adapter,
92
+ environment_vars: environment,
93
+ system_adapter: system_adapter,
94
+ io: spy)
95
+ opener.run
96
+ end
97
+ it "does not write to the custom commands log if environment is for intended lab" do
98
+ environment = {
99
+ "SHELL" => "/usr/local/bin/fish",
100
+ "LAB_NAME" => "rails-dynamic-request-lab-cb-000",
101
+ "CREATED_USER" => "bobby",
102
+ "IDE_CONTAINER" => "true",
103
+ "IDE_VERSION" => "3"
104
+ }
105
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
106
+
107
+ home_dir = create_linux_home_dir("bobby")
108
+ opener = LearnOpen::Opener.new(nil, "atom", true,
109
+ learn_web_client: learn_web_client,
110
+ git_adapter: git_adapter,
111
+ environment_vars: environment,
112
+ system_adapter: system_adapter,
113
+ io: spy)
114
+ opener.run
115
+ expect(File.exist?("#{home_dir}/.custom_commands.log")).to eq(false)
116
+ end
117
+
118
+ it "does not prompt if they want to skip lesson if the container is for a different lab" do
119
+ environment = {
120
+ "SHELL" => "/usr/local/bin/fish",
121
+ "LAB_NAME" => "Something wild",
122
+ "CREATED_USER" => "bobby",
123
+ "IDE_CONTAINER" => "true",
124
+ "IDE_VERSION" => "3"
125
+ }
126
+ io = instance_double(LearnOpen::Adapters::IOAdapter)
127
+ expect(io)
128
+ .to receive(:puts)
129
+ .with("Looking for lesson...")
130
+
131
+ expect(io)
132
+ .to receive(:puts)
133
+ .with("Opening new window")
134
+
135
+ create_linux_home_dir("bobby")
136
+ opener = LearnOpen::Opener.new("later_lesson", "atom", true,
137
+ learn_web_client: learn_web_client,
138
+ git_adapter: git_adapter,
139
+ environment_vars: environment,
140
+ system_adapter: system_adapter,
141
+ io: io)
142
+ opener.run
143
+ end
144
+ it "prompts if they want to skip lesson" do
145
+ environment = {
146
+ "SHELL" => "/usr/local/bin/fish",
147
+ "LAB_NAME" => "later_lesson",
148
+ "CREATED_USER" => "bobby",
149
+ "IDE_CONTAINER" => "true",
150
+ "IDE_VERSION" => "3"
151
+ }
152
+ io = instance_double(LearnOpen::Adapters::IOAdapter)
153
+ expect(io)
154
+ .to receive(:puts)
155
+ .with("Looking for lesson...")
156
+
157
+ expect(io)
158
+ .to receive(:puts)
159
+ .with("WARNING: You are attempting to open a lesson that is beyond your current lesson.")
160
+
161
+ expect(io)
162
+ .to receive(:print)
163
+ .with("Are you sure you want to continue? [Yn]: ")
164
+
165
+ expect(io)
166
+ .to receive(:gets)
167
+ .and_return("yes")
168
+
169
+ expect(io)
170
+ .to receive(:puts)
171
+ .with("Opening readme...")
172
+
173
+ create_linux_home_dir("bobby")
174
+ opener = LearnOpen::Opener.new("later_lesson", "atom", true,
175
+ learn_web_client: learn_web_client,
176
+ git_adapter: git_adapter,
177
+ environment_vars: environment,
178
+ system_adapter: system_adapter,
179
+ io: io)
180
+ opener.run
181
+ end
182
+ it "writes to custom_commands_log if lab name doesn't match env" do
183
+ environment = {
184
+ "SHELL" => "/usr/local/bin/fish",
185
+ "LAB_NAME" => "Something wild",
186
+ "CREATED_USER" => "bobby",
187
+ "IDE_CONTAINER" => "true",
188
+ "IDE_VERSION" => "3"
189
+ }
190
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
191
+
192
+ home_dir = create_linux_home_dir("bobby")
193
+ opener = LearnOpen::Opener.new(nil, "atom", true,
194
+ learn_web_client: learn_web_client,
195
+ git_adapter: git_adapter,
196
+ environment_vars: environment,
197
+ system_adapter: system_adapter,
198
+ io: spy)
199
+ opener.run
200
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
201
+ expect(custom_commands_log).to eq("{\"command\":\"open_lab\",\"lab_name\":\"rails-dynamic-request-lab-cb-000\"}\n")
202
+ end
203
+
204
+ it "writes to custom_commands_log if only if it's IDE" do
205
+ environment = {
206
+ "SHELL" => "/usr/local/bin/fish",
207
+ "LAB_NAME" => "Something wild",
208
+ "CREATED_USER" => "bobby"
209
+ }
210
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
211
+
212
+ home_dir = create_linux_home_dir("bobby")
213
+ opener = LearnOpen::Opener.new(nil, "atom", true,
214
+ learn_web_client: learn_web_client,
215
+ git_adapter: git_adapter,
216
+ environment_vars: environment,
217
+ system_adapter: system_adapter,
218
+ io: spy)
219
+ opener.run
220
+ expect(File.exist?("#{home_dir}/.custom_commands.log")).to eq(false)
221
+ end
222
+
223
+ it "runs yarn install if lab is a node lab" do
224
+ environment = {
225
+ "SHELL" => "/usr/local/bin/fish",
226
+ "LAB_NAME" => "node_lab",
227
+ "CREATED_USER" => "bobby",
228
+ "IDE_CONTAINER" => "true",
229
+ }
230
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
231
+ expect(system_adapter)
232
+ .to receive(:open_editor)
233
+ .with("atom", path: ".")
234
+
235
+ expect(system_adapter)
236
+ .to receive(:open_login_shell)
237
+ .with("/usr/local/bin/fish")
238
+
239
+ expect(system_adapter)
240
+ .to receive(:change_context_directory)
241
+ .with("/home/bobby/Development/code/node_lab")
242
+
243
+ expect(system_adapter)
244
+ .to receive(:run_command)
245
+ .with("yarn install --no-lockfile")
246
+
247
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
248
+ learn_web_client: learn_web_client,
249
+ git_adapter: git_adapter,
250
+ environment_vars: environment,
251
+ system_adapter: system_adapter,
252
+ io: spy)
253
+ opener.run
254
+ end
255
+ end
256
+ end
257
+ context "Logging" do
258
+ let(:environment) {{ "SHELL" => "/usr/local/bin/fish", "JUPYTER_CONTAINER" => "true" }}
259
+ it "prints the right things" do
260
+ allow(learn_web_client).to receive(:fork_repo)
261
+
262
+ allow(git_adapter).to receive(:clone).and_call_original
263
+
264
+ allow(system_adapter).to receive_messages(
265
+ open_editor: :noop,
266
+ spawn: :noop,
267
+ watch_dir: :noop,
268
+ open_login_shell: :noop,
269
+ change_context_directory: :noop,
270
+ run_command: :noop,
271
+ )
272
+
273
+ io = StringIO.new
274
+
275
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
276
+ learn_web_client: learn_web_client,
277
+ git_adapter: git_adapter,
278
+ environment_vars: environment,
279
+ system_adapter: system_adapter,
280
+ io: io)
281
+ opener.run
282
+ io.rewind
283
+ expect(io.read).to eq(<<-EOF)
284
+ Looking for lesson...
285
+ Forking lesson...
286
+ Cloning lesson...
287
+ Opening lesson...
288
+ Installing pip dependencies...
289
+ Done.
290
+ EOF
291
+ end
292
+
293
+ it "logs final status in file" do
294
+ allow(learn_web_client).to receive(:fork_repo)
295
+
296
+ allow(git_adapter).to receive(:clone).and_call_original
297
+
298
+ allow(system_adapter).to receive_messages(
299
+ open_editor: :noop,
300
+ spawn: :noop,
301
+ watch_dir: :noop,
302
+ open_login_shell: :noop,
303
+ change_context_directory: :noop,
304
+ run_command: :noop,
305
+ )
306
+
307
+
308
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
309
+ learn_web_client: learn_web_client,
310
+ git_adapter: git_adapter,
311
+ environment_vars: environment,
312
+ system_adapter: system_adapter,
313
+ io: spy)
314
+ opener.run
315
+ expect(File.read("#{home_dir}/.learn-open-tmp")).to eq("Done.")
316
+ end
317
+ end
318
+ context "Lab Types" do
319
+ context "Jupyter Labs" do
320
+ it "correctly opens jupyter lab on jupyter container" do
321
+ environment = { "SHELL" => "/usr/local/bin/fish", "JUPYTER_CONTAINER" => "true" }
322
+ expect(learn_web_client)
323
+ .to receive(:fork_repo)
324
+ .with(repo_name: "jupyter_lab")
325
+
326
+ expect(git_adapter)
327
+ .to receive(:clone)
328
+ .with("git@github.com:StevenNunez/jupyter_lab.git", "jupyter_lab", {:path=>"/home/bobby/Development/code"})
329
+ .and_call_original
330
+
331
+ expect(system_adapter)
332
+ .to receive(:open_editor)
333
+ .with("atom", path: ".")
334
+ expect(system_adapter)
335
+ .to receive(:spawn)
336
+ .with("restore-lab", block: true)
337
+ expect(system_adapter)
338
+ .to receive(:watch_dir)
339
+ .with("/home/bobby/Development/code/jupyter_lab", "backup-lab")
340
+ expect(system_adapter)
341
+ .to receive(:open_login_shell)
342
+ .with("/usr/local/bin/fish")
343
+ expect(system_adapter)
344
+ .to receive(:change_context_directory)
345
+ .with("/home/bobby/Development/code/jupyter_lab")
346
+ expect(system_adapter)
347
+ .to receive(:run_command)
348
+ .with("/opt/conda/bin/python -m pip install -r requirements.txt")
349
+
350
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
351
+ learn_web_client: learn_web_client,
352
+ git_adapter: git_adapter,
353
+ environment_vars: environment,
354
+ system_adapter: system_adapter,
355
+ io: spy)
356
+ opener.run
357
+ end
358
+
359
+ it "opens browser in IDE" do
360
+ environment = {"CREATED_USER" => "bobby", "IDE_CONTAINER" => "true", "LAB_NAME" => "jupyter_lab"}
361
+ io = StringIO.new
362
+ home_dir = create_linux_home_dir("bobby")
363
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
364
+ learn_web_client: learn_web_client,
365
+ git_adapter: git_adapter,
366
+ environment_vars: environment,
367
+ system_adapter: system_adapter,
368
+ io: io)
369
+ opener.run
370
+ io.rewind
371
+ expect(io.read).to eq(<<-EOF)
372
+ Looking for lesson...
373
+ Opening Jupyter Lesson...
374
+ EOF
375
+
376
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
377
+ expect(custom_commands_log).to eq("{\"command\":\"browser_open\",\"url\":\"https://learn.co/lessons/31322\"}\n")
378
+ end
379
+ it "opens the lab in the safari on mac" do
380
+ expect(system_adapter)
381
+ .to receive(:run_command)
382
+ .with("open -a Safari https://learn.co/lessons/31322")
383
+ io = StringIO.new
384
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
385
+ learn_web_client: learn_web_client,
386
+ git_adapter: git_adapter,
387
+ system_adapter: system_adapter,
388
+ io: io,
389
+ platform: "darwin")
390
+ opener.run
391
+ io.rewind
392
+ expect(io.read).to eq(<<-EOF)
393
+ Looking for lesson...
394
+ Opening Jupyter Lesson...
395
+ EOF
396
+ end
397
+ it "opens the lab in the chrome on mac if present" do
398
+ FileUtils.mkdir_p("/Applications")
399
+ FileUtils.touch('/Applications/Google Chrome.app')
400
+ expect(system_adapter)
401
+ .to receive(:run_command)
402
+ .with("open -a 'Google Chrome' https://learn.co/lessons/31322")
403
+
404
+ io = StringIO.new
405
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
406
+ learn_web_client: learn_web_client,
407
+ git_adapter: git_adapter,
408
+ system_adapter: system_adapter,
409
+ io: io,
410
+ platform: "darwin")
411
+ opener.run
412
+ io.rewind
413
+ expect(io.read).to eq(<<-EOF)
414
+ Looking for lesson...
415
+ Opening Jupyter Lesson...
416
+ EOF
417
+ end
418
+
419
+ it "opens the lab in the browser on linux" do
420
+ expect(system_adapter)
421
+ .to receive(:run_command)
422
+ .with("xdg-open https://learn.co/lessons/31322")
423
+ io = StringIO.new
424
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
425
+ learn_web_client: learn_web_client,
426
+ git_adapter: git_adapter,
427
+ system_adapter: system_adapter,
428
+ io: io,
429
+ platform: "linux")
430
+ opener.run
431
+ io.rewind
432
+ expect(io.read).to eq(<<-EOF)
433
+ Looking for lesson...
434
+ Opening Jupyter Lesson...
435
+ EOF
436
+ end
437
+ end
438
+ context "Readme" do
439
+ it "does not open readme if on unsupported environment" do
440
+ io = StringIO.new
441
+ opener = LearnOpen::Opener.new("readme", "atom", false,
442
+ learn_web_client: learn_web_client,
443
+ git_adapter: git_adapter,
444
+ environment_vars: {},
445
+ system_adapter: system_adapter,
446
+ io: io,
447
+ platform: "chromeos")
448
+ opener.run
449
+
450
+ io.rewind
451
+ expect(io.read).to eq(<<-EOF)
452
+ Looking for lesson...
453
+ It looks like this lesson is a Readme. Please open it in your browser.
454
+ EOF
455
+ end
456
+
457
+ it "writes to custom_commands_log on IDE" do
458
+ environment = {"CREATED_USER" => "bobby", "IDE_CONTAINER" => "true", "LAB_NAME" => "readme"}
459
+ io = StringIO.new
460
+ home_dir = create_linux_home_dir("bobby")
461
+ opener = LearnOpen::Opener.new("readme", "atom", false,
462
+ learn_web_client: learn_web_client,
463
+ git_adapter: git_adapter,
464
+ environment_vars: environment,
465
+ system_adapter: system_adapter,
466
+ io: io)
467
+ opener.run
468
+
469
+ io.rewind
470
+ expect(io.read).to eq(<<-EOF)
471
+ Looking for lesson...
472
+ Opening readme...
473
+ EOF
474
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
475
+ expect(custom_commands_log).to eq("{\"command\":\"browser_open\",\"url\":\"https://learn.co/lessons/31322\"}\n")
476
+ end
477
+ context "on a mac" do
478
+ it "opens safari by default" do
479
+ io = StringIO.new
480
+ expect(system_adapter)
481
+ .to receive(:run_command)
482
+ .with("open -a Safari https://learn.co/lessons/31322")
483
+
484
+ opener = LearnOpen::Opener.new("readme", "atom", false,
485
+ learn_web_client: learn_web_client,
486
+ git_adapter: git_adapter,
487
+ environment_vars: {},
488
+ system_adapter: system_adapter,
489
+ io: io,
490
+ platform: "darwin")
491
+ opener.run
492
+
493
+ io.rewind
494
+ expect(io.read).to eq(<<-EOF)
495
+ Looking for lesson...
496
+ Opening readme...
497
+ EOF
498
+ end
499
+
500
+ it "opens chrome if it exists" do
501
+ FileUtils.mkdir_p("/Applications")
502
+ FileUtils.touch('/Applications/Google Chrome.app')
503
+ io = StringIO.new
504
+ expect(system_adapter)
505
+ .to receive(:run_command)
506
+ .with("open -a 'Google Chrome' https://learn.co/lessons/31322")
507
+
508
+
509
+ opener = LearnOpen::Opener.new("readme", "atom", false,
510
+ learn_web_client: learn_web_client,
511
+ git_adapter: git_adapter,
512
+ environment_vars: {},
513
+ system_adapter: system_adapter,
514
+ io: io,
515
+ platform: "darwin")
516
+ opener.run
517
+
518
+ io.rewind
519
+ expect(io.read).to eq(<<-EOF)
520
+ Looking for lesson...
521
+ Opening readme...
522
+ EOF
523
+ end
524
+ end
525
+
526
+ context "on linux" do
527
+ it "opens in default brower" do
528
+ io = StringIO.new
529
+ expect(system_adapter)
530
+ .to receive(:run_command)
531
+ .with("xdg-open https://learn.co/lessons/31322")
532
+
533
+
534
+ opener = LearnOpen::Opener.new("readme", "atom", false,
535
+ learn_web_client: learn_web_client,
536
+ git_adapter: git_adapter,
537
+ environment_vars: {},
538
+ system_adapter: system_adapter,
539
+ io: io,
540
+ platform: "linux")
541
+ opener.run
542
+
543
+ io.rewind
544
+ expect(io.read).to eq(<<-EOF)
545
+ Looking for lesson...
546
+ Opening readme...
547
+ EOF
548
+ end
549
+ end
550
+ end
551
+ context "iOS labs" do
552
+ it "fails to open on Linux" do
553
+ io = StringIO.new
554
+
555
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
556
+ learn_web_client: learn_web_client,
557
+ git_adapter: git_adapter,
558
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
559
+ system_adapter: system_adapter,
560
+ io: io,
561
+ platform: "linux")
562
+ opener.run
563
+
564
+ io.rewind
565
+ expect(io.read).to eq(<<-EOF)
566
+ Looking for lesson...
567
+ You need to be on a Mac to work on iOS lessons.
568
+ EOF
569
+ end
570
+
571
+ it "fails to open on the IDE" do
572
+ environment = {
573
+ "SHELL" => "/usr/local/bin/fish",
574
+ "LAB_NAME" => "ios_lab",
575
+ "CREATED_USER" => "bobby",
576
+ "IDE_CONTAINER" => "true",
577
+ "IDE_VERSION" => "3"
578
+ }
579
+ create_linux_home_dir("bobby")
580
+ io = StringIO.new
581
+
582
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
583
+ learn_web_client: learn_web_client,
584
+ git_adapter: git_adapter,
585
+ environment_vars: environment,
586
+ system_adapter: system_adapter,
587
+ io: io,
588
+ platform: "linux")
589
+ opener.run
590
+
591
+ io.rewind
592
+ expect(io.read).to eq(<<-EOF)
593
+ Looking for lesson...
594
+ You need to be on a Mac to work on iOS lessons.
595
+ EOF
596
+ end
597
+
598
+ it "opens xcodeproj if on a mac and it exists" do
599
+ io = StringIO.new
600
+ expect(system_adapter)
601
+ .to receive(:change_context_directory)
602
+ .with("/home/bobby/Development/code/ios_lab")
603
+ expect(system_adapter)
604
+ .to receive(:open_login_shell)
605
+ .with("/usr/local/bin/fish")
606
+ expect(system_adapter)
607
+ .to receive(:run_command)
608
+ .with("cd /home/bobby/Development/code/ios_lab && open *.xcodeproj")
609
+
610
+
611
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
612
+ learn_web_client: learn_web_client,
613
+ git_adapter: git_adapter,
614
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
615
+ system_adapter: system_adapter,
616
+ io: io,
617
+ platform: "darwin")
618
+ opener.run
619
+
620
+ end
621
+ it "opens xcworkspace if on a mac and it exists" do
622
+ io = StringIO.new
623
+ expect(system_adapter)
624
+ .to receive(:change_context_directory)
625
+ .with("/home/bobby/Development/code/ios_with_workspace_lab")
626
+ expect(system_adapter)
627
+ .to receive(:open_login_shell)
628
+ .with("/usr/local/bin/fish")
629
+ expect(system_adapter)
630
+ .to receive(:run_command)
631
+ .with("cd /home/bobby/Development/code/ios_with_workspace_lab && open *.xcworkspace")
632
+
633
+
634
+ opener = LearnOpen::Opener.new("ios_with_workspace_lab", "atom", false,
635
+ learn_web_client: learn_web_client,
636
+ git_adapter: git_adapter,
637
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
638
+ system_adapter: system_adapter,
639
+ io: io,
640
+ platform: "darwin")
641
+ opener.run
642
+
643
+ end
644
+ end
645
+ context "Lab" do
646
+ context "installing dependencies" do
647
+ it "runs bundle install if lab is a ruby lab" do
648
+ allow(system_adapter)
649
+ .to receive_messages(
650
+ open_editor: ["atom", path: "."],
651
+ open_login_shell: ["/usr/local/bin/fish"],
652
+ change_context_directory: ["/home/bobby/Development/code/rails-dynamic-request-lab-cb-000"],
653
+ )
654
+
655
+ expect(system_adapter)
656
+ .to receive(:run_command)
657
+ .with("bundle install")
658
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
659
+ learn_web_client: learn_web_client,
660
+ git_adapter: git_adapter,
661
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
662
+ system_adapter: system_adapter,
663
+ io: spy)
664
+ opener.run
665
+ end
666
+
667
+ it "outputs correctly for ruby lab" do
668
+ allow(system_adapter)
669
+ .to receive_messages(
670
+ open_editor: :noop,
671
+ open_login_shell: :noop,
672
+ change_context_directory: :noop,
673
+ run_command: :noop,
674
+ )
675
+
676
+ io = StringIO.new
677
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
678
+ learn_web_client: learn_web_client,
679
+ git_adapter: git_adapter,
680
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
681
+ system_adapter: system_adapter,
682
+ io: io)
683
+ opener.run
684
+ io.rewind
685
+ expect(io.read).to eq(<<-EOF)
686
+ Looking for lesson...
687
+ Forking lesson...
688
+ Cloning lesson...
689
+ Opening lesson...
690
+ Bundling...
691
+ Done.
692
+ EOF
693
+ end
694
+
695
+ it "runs pip install if lab is a python lab" do
696
+ expect(system_adapter)
697
+ .to receive(:open_editor)
698
+ .with("atom", path: ".")
699
+
700
+ expect(system_adapter)
701
+ .to receive(:open_login_shell)
702
+ .with("/usr/local/bin/fish")
703
+
704
+ expect(system_adapter)
705
+ .to receive(:change_context_directory)
706
+ .with("/home/bobby/Development/code/python_lab")
707
+
708
+ expect(system_adapter)
709
+ .to receive(:run_command)
710
+ .with("python -m pip install -r requirements.txt")
711
+ opener = LearnOpen::Opener.new("python_lab", "atom", false,
712
+ learn_web_client: learn_web_client,
713
+ git_adapter: git_adapter,
714
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
715
+ system_adapter: system_adapter,
716
+ io: spy)
717
+ opener.run
718
+ end
719
+ it "outputs correctly for python lab" do
720
+ allow(system_adapter)
721
+ .to receive_messages(
722
+ open_editor: :noop,
723
+ open_login_shell: :noop,
724
+ change_context_directory: :noop,
725
+ run_command: :noop,
726
+ )
727
+
728
+ io = StringIO.new
729
+ opener = LearnOpen::Opener.new("python_lab", "atom", false,
730
+ learn_web_client: learn_web_client,
731
+ git_adapter: git_adapter,
732
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
733
+ system_adapter: system_adapter,
734
+ io: io)
735
+ opener.run
736
+ io.rewind
737
+ expect(io.read).to eq(<<-EOF)
738
+ Looking for lesson...
739
+ Forking lesson...
740
+ Cloning lesson...
741
+ Opening lesson...
742
+ Installing pip dependencies...
743
+ Done.
744
+ EOF
745
+ end
746
+ it "runs npm install if lab is a node lab" do
747
+ expect(system_adapter)
748
+ .to receive(:open_editor)
749
+ .with("atom", path: ".")
750
+
751
+ expect(system_adapter)
752
+ .to receive(:open_login_shell)
753
+ .with("/usr/local/bin/fish")
754
+
755
+ expect(system_adapter)
756
+ .to receive(:change_context_directory)
757
+ .with("/home/bobby/Development/code/node_lab")
758
+
759
+ expect(system_adapter)
760
+ .to receive(:run_command)
761
+ .with("npm install")
762
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
763
+ learn_web_client: learn_web_client,
764
+ git_adapter: git_adapter,
765
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
766
+ system_adapter: system_adapter,
767
+ io: spy)
768
+ opener.run
769
+ end
770
+ it "outputs correctly for node lab" do
771
+ allow(system_adapter)
772
+ .to receive_messages(
773
+ open_editor: :noop,
774
+ open_login_shell: :noop,
775
+ change_context_directory: :noop,
776
+ run_command: :noop,
777
+ )
19
778
 
20
- it "returns false if directory for lab doesn't exists" do
21
- expect(opener).to receive(:repo_dir).and_return("js-rubber-duck-wrangling")
22
- expect(opener.repo_exists?).to be_falsy
779
+ io = StringIO.new
780
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
781
+ learn_web_client: learn_web_client,
782
+ git_adapter: git_adapter,
783
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
784
+ system_adapter: system_adapter,
785
+ io: io)
786
+ opener.run
787
+ io.rewind
788
+ expect(io.read).to eq(<<-EOF)
789
+ Looking for lesson...
790
+ Forking lesson...
791
+ Cloning lesson...
792
+ Opening lesson...
793
+ Installing npm dependencies...
794
+ Done.
795
+ EOF
796
+ end
797
+ end
798
+ end
23
799
  end
24
800
  end
25
- end