exercism 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjQ1Mjc5YTZmYzg2OGYyOTAzNGM5NzY2Y2YwMzNhMzAzYjZiYTExNw==
4
+ M2U0NDc4ZmQ5NmI4NjJjNGQzYjY3YjUyMWQxZGM5ZDE4NWUxOGJiMw==
5
5
  data.tar.gz: !binary |-
6
- ZmI1MjI3MzU5NjQ4N2YzZWYwNjVjYmEwYjU4NWIyNWZiOGYzM2YzNw==
6
+ ZDYwYTkxYzkyNGRlN2I0YjVmYzIwYmNlMGQwZTgzYTY2MDY5OWJlNQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MTk0NWFjOTkxOWY0ZTE0YmQ5ODliYTQ2NDhjMjZjNDk5ZGQ0YzNkNGU1Nzc5
10
- MjE2OTk0OTZjYmMzMWIxYTBjZGUxYTRmNGM0MTlmNmY5MzZlYThmN2JkZDdm
11
- YTViZDUzOThjZjE2MzllMWQ0YTIxODdjZWZlN2MyOWQzMjkxNGI=
9
+ M2UwY2VmMjNiZDI4N2Y2MjM0YTE1Y2U3YjNlOWMwZThkYTViMzZiMTkyZTZl
10
+ NGViZWVkMDk2ZjY5NDg1NjE3MGIzZTU2NjYxYzc4ODQzZTMyNDllNzc0MGUw
11
+ OWY3ODgyN2ZkNTU3YmNkY2FhYjk1NmVkZjczMTJlYWEwZGQzZDQ=
12
12
  data.tar.gz: !binary |-
13
- OTFiZjNlMmE5OWM5Yzg1OTdiNGU0NjU5ODNkN2I1MzNhZGQ5NGYxMGE0MDAy
14
- NDBlOWVlMjljNmFhNDAxYzUyZmFlNzVhNWYyYTI2ZDIyMDc2NGJmYzliYWJk
15
- MzE5ZTdhMGE5ZWRlMDg0OGQwMGIyYWYwZTc1ODBlMmE4ZTVhOTc=
13
+ Njg5NjM1Y2FkMGJkYjA1ZGM4ZWYwY2ZhNjhkNDdlOTQyYmZiOTVlZTJjZGU2
14
+ ZWUwZGM0MmQ2ZTViZWU2M2Y3OTZlMmJiYjBiODI3YWIwMjdkMjIxMTExN2Qw
15
+ NjU2YmI4OTFjOTNjNWY4YzkwOTQxZWQ0NTljZDRmYWY2MTYyNjQ=
data/lib/cli.rb CHANGED
@@ -7,14 +7,21 @@ class Exercism
7
7
  def fetch
8
8
  require 'exercism'
9
9
 
10
- Exercism::Api.fetch_for(Exercism.user)
10
+ assignments = Exercism::Api.fetch_for(Exercism.user, Exercism.project_dir)
11
+ if assignments.empty?
12
+ puts "No assignments fetched."
13
+ else
14
+ assignments.each do |assignment|
15
+ puts "Fetched #{File.join(assignment.assignment_dir)}"
16
+ end
17
+ end
11
18
  end
12
19
 
13
20
  desc "submit FILE", "Submit code to exercism.io on your current assignment"
14
21
  def submit(file)
15
22
  require 'exercism'
16
23
 
17
- Exercism::Api.submit(file, {for: Exercism.user})
24
+ Exercism::Api.submit(File.join(FileUtils.pwd, file), {for: Exercism.user})
18
25
  end
19
26
 
20
27
  desc "login", "Save exercism.io api credentials"
@@ -23,7 +30,12 @@ class Exercism
23
30
 
24
31
  username = ask("Your GitHub username:")
25
32
  key = ask("Your exercism.io API key:")
26
- Exercism.login(username, key)
33
+ default_path = FileUtils.pwd
34
+ path = ask("What is your exercism exercises project path? (#{default_path})")
35
+ if path.empty?
36
+ path = default_path
37
+ end
38
+ Exercism.login(username, key, path)
27
39
 
28
40
  say("Your credentials have been written to #{Exercism.config.file}")
29
41
  end
data/lib/exercism.rb CHANGED
@@ -23,8 +23,12 @@ class Exercism
23
23
  Dir.home(Etc.getlogin)
24
24
  end
25
25
 
26
- def self.login(github_username, key)
27
- data = {'github_username' => github_username, 'key' => key}
26
+ def self.login(github_username, key, dir)
27
+ data = {
28
+ 'github_username' => github_username,
29
+ 'key' => key,
30
+ 'project_dir' => dir
31
+ }
28
32
  Config.write(home, data)
29
33
  User.new(github_username, key)
30
34
  end
@@ -38,4 +42,8 @@ class Exercism
38
42
  User.new(c.github_username, c.key)
39
43
  end
40
44
 
45
+ def self.project_dir
46
+ config.project_dir
47
+ end
48
+
41
49
  end
data/lib/exercism/api.rb CHANGED
@@ -6,18 +6,18 @@ class Exercism
6
6
  end
7
7
  end
8
8
 
9
- def self.fetch_for(user)
9
+ def self.fetch_for(user, path)
10
10
  response = conn.get do |req|
11
11
  req.url '/api/v1/user/assignments/current'
12
12
  req.headers['User-Agent'] = "exercism-CLI v#{Exercism::VERSION}"
13
13
  req.params['key'] = user.key
14
14
  end
15
- Assignment.save(JSON.parse(response.body))
15
+ Assignment.save(JSON.parse(response.body), path)
16
16
  end
17
17
 
18
18
  def self.submit(filename, options)
19
19
  user = options[:for]
20
- path = File.join(FileUtils.pwd, filename)
20
+ path = File.join(filename)
21
21
  contents = File.read path
22
22
  response = conn.post do |req|
23
23
  req.url '/api/v1/user/assignments'
@@ -1,13 +1,15 @@
1
1
  class Exercism
2
2
  class Assignment
3
3
 
4
- def self.save(data)
4
+ def self.save(data, path)
5
+ assignments = []
5
6
  data['assignments'].each do |attributes|
6
- Assignment.new(attributes).save
7
+ assignments << Assignment.new(attributes.merge('project_dir' => path)).save
7
8
  end
9
+ assignments
8
10
  end
9
11
 
10
- attr_reader :track, :slug, :readme, :test_file, :tests
12
+ attr_reader :track, :slug, :readme, :test_file, :tests, :project_dir
11
13
 
12
14
  def initialize(attributes)
13
15
  @track = attributes['track']
@@ -15,6 +17,7 @@ class Exercism
15
17
  @readme = attributes['readme']
16
18
  @test_file = attributes['test_file']
17
19
  @tests = attributes['tests']
20
+ @project_dir = attributes['project_dir']
18
21
  end
19
22
 
20
23
  def save
@@ -23,6 +26,11 @@ class Exercism
23
26
  f.write readme
24
27
  end
25
28
  File.write tests_path, tests
29
+ self
30
+ end
31
+
32
+ def assignment_dir
33
+ @assignment_dir ||= File.join(project_dir, track, slug)
26
34
  end
27
35
 
28
36
  private
@@ -34,19 +42,6 @@ class Exercism
34
42
  def tests_path
35
43
  File.join(assignment_dir, test_file)
36
44
  end
37
-
38
- def assignment_dir
39
- File.join(project_dir, track, slug)
40
- end
41
-
42
- def project_dir
43
- dir = FileUtils.pwd
44
- if File.basename(dir) == track
45
- dir.gsub(/#{track}\z/, '')
46
- else
47
- dir
48
- end
49
- end
50
45
  end
51
46
  end
52
47
 
@@ -9,11 +9,12 @@ class Exercism
9
9
  config = new(path)
10
10
  config.github_username = data['github_username']
11
11
  config.key = data['key']
12
+ config.project_dir = data['project_dir']
12
13
  config.save
13
14
  end
14
15
 
15
16
  attr_reader :file
16
- attr_writer :github_username, :key
17
+ attr_writer :github_username, :key, :project_dir
17
18
 
18
19
  def initialize(path)
19
20
  @file = File.join(path, '.exercism')
@@ -27,9 +28,17 @@ class Exercism
27
28
  @key ||= from_yaml['key']
28
29
  end
29
30
 
31
+ def project_dir
32
+ @project_dir ||= from_yaml['project_dir']
33
+ end
34
+
30
35
  def save
31
36
  File.open file, 'w' do |f|
32
- data = {'github_username' => github_username, 'key' => key}
37
+ data = {
38
+ 'github_username' => github_username,
39
+ 'key' => key,
40
+ 'project_dir' => project_dir
41
+ }
33
42
  f.write data.to_yaml
34
43
  end
35
44
  self
@@ -1,3 +1,3 @@
1
1
  class Exercism
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -16,25 +16,27 @@ end
16
16
 
17
17
  class ApiTest < MiniTest::Unit::TestCase
18
18
 
19
- def setup
20
- @project_dir = FileUtils.pwd
19
+ def project_dir
20
+ '/tmp'
21
+ end
22
+
23
+ def home
24
+ 'test/fixtures/home'
21
25
  end
22
26
 
23
27
  def teardown
24
- FileUtils.cd @project_dir
25
- FileUtils.rm_rf File.join(@project_dir, 'test/fixtures/home/ruby')
26
- FileUtils.rm_rf File.join(@project_dir, 'test/fixtures/home/javascript')
28
+ FileUtils.rm_rf File.join(project_dir, 'ruby')
29
+ FileUtils.rm_rf File.join(project_dir, 'javascript')
27
30
  end
28
31
 
29
32
  def test_fetch_assignment_from_api
30
- home = File.join(@project_dir, 'test/fixtures/home')
31
- readme_path = File.join(home, 'ruby/bob/README.md')
32
- tests_path = File.join(home, 'ruby/bob/test.rb')
33
+ assignment_dir = File.join(project_dir, 'ruby', 'bob')
34
+ readme_path = File.join(assignment_dir, 'README.md')
35
+ tests_path = File.join(assignment_dir, 'test.rb')
33
36
 
34
37
  Exercism.stub(:home, home) do
35
- FileUtils.cd home
36
38
  VCR.use_cassette('alice-gets-bob') do
37
- Exercism::Api.fetch_for(Exercism.user)
39
+ Exercism::Api.fetch_for(Exercism.user, project_dir)
38
40
 
39
41
  Approvals.verify(File.read(readme_path), name: 'alice_gets_bob_readme')
40
42
  Approvals.verify(File.read(tests_path), name: 'alice_gets_bob_tests')
@@ -43,18 +45,16 @@ class ApiTest < MiniTest::Unit::TestCase
43
45
  end
44
46
 
45
47
  def test_send_assignment_to_api
46
- home = File.join(@project_dir, 'test/fixtures/home')
47
- assignment_path = File.join(home, 'ruby/bob')
48
- FileUtils.mkdir_p(assignment_path)
49
- submission = File.join(assignment_path, 'bob.rb')
48
+ assignment_dir = File.join(project_dir, 'ruby', 'bob')
49
+ FileUtils.mkdir_p(assignment_dir)
50
+ submission = File.join(assignment_dir, 'bob.rb')
50
51
  File.open(submission, 'w') do |f|
51
52
  f.write "puts 'hello world'"
52
53
  end
53
54
 
54
55
  Exercism.stub(:home, home) do
55
- FileUtils.cd assignment_path
56
56
  VCR.use_cassette('alice-submits-bob') do
57
- response = Exercism::Api.submit('bob.rb', {for: Exercism.user})
57
+ response = Exercism::Api.submit(submission, {for: Exercism.user})
58
58
  assert_equal 201, response.status
59
59
  end
60
60
  end
@@ -2,21 +2,20 @@ require './test/test_helper'
2
2
 
3
3
  class AssignmentTest < MiniTest::Unit::TestCase
4
4
 
5
- def setup
6
- @project_dir = FileUtils.pwd
5
+ def project_dir
6
+ '/tmp'
7
7
  end
8
8
 
9
9
  def teardown
10
- FileUtils.cd @project_dir
11
- FileUtils.rm_rf File.join(@project_dir, 'test/fixtures/ruby')
10
+ FileUtils.rm_rf File.join(project_dir, 'ruby')
12
11
  end
13
12
 
14
13
  def readme_path
15
- File.join(@project_dir, 'test/fixtures/ruby/queens/README.md')
14
+ File.join(project_dir, 'ruby', 'queens', 'README.md')
16
15
  end
17
16
 
18
17
  def tests_path
19
- File.join(@project_dir, 'test/fixtures/ruby/queens/test.rb')
18
+ File.join(project_dir, 'ruby', 'queens', 'test.rb')
20
19
  end
21
20
 
22
21
  def assignment_data
@@ -25,22 +24,12 @@ class AssignmentTest < MiniTest::Unit::TestCase
25
24
  'slug' => 'queens',
26
25
  'readme' => 'Do it',
27
26
  'test_file' => 'test.rb',
28
- 'tests' => 'assert true'
27
+ 'tests' => 'assert true',
28
+ 'project_dir' => project_dir
29
29
  }
30
30
  end
31
31
 
32
32
  def test_write_assignment_from_project_directory
33
- FileUtils.cd 'test/fixtures'
34
- assignment = Exercism::Assignment.new(assignment_data)
35
- assignment.save
36
-
37
- assert_equal "Do it", File.read(readme_path)
38
- assert_equal "assert true", File.read(tests_path)
39
- end
40
-
41
- def test_write_assignment_from_language_directory
42
- FileUtils.mkdir File.join(@project_dir, 'test/fixtures/ruby')
43
- FileUtils.cd 'test/fixtures/ruby'
44
33
  assignment = Exercism::Assignment.new(assignment_data)
45
34
  assignment.save
46
35
 
@@ -14,21 +14,31 @@ class ConfigTest < MiniTest::Unit::TestCase
14
14
  config = Exercism::Config.read(path)
15
15
  assert_equal 'alice', config.github_username
16
16
  assert_equal key, config.key
17
+ assert_equal '/tmp', config.project_dir
17
18
  end
18
19
 
19
20
  def test_write_config_file
20
21
  path = './test/fixtures'
21
22
  key = '7a7096c'
22
- data = {'github_username' => 'bob', 'key' => key}
23
+ data = {
24
+ 'github_username' => 'bob',
25
+ 'key' => key,
26
+ 'project_dir' => '/dev/null'
27
+ }
23
28
  config = Exercism::Config.write(path, data)
24
29
  assert_equal 'bob', config.github_username
25
30
  assert_equal key, config.key
31
+ assert_equal '/dev/null', config.project_dir
26
32
  end
27
33
 
28
34
  def test_delete_config_file
29
35
  path = './test/fixtures'
30
36
  key = '7a7096c'
31
- data = {'github_username' => 'bob', 'key' => key}
37
+ data = {
38
+ 'github_username' => 'bob',
39
+ 'key' => key,
40
+ 'project_dir' => '/tmp'
41
+ }
32
42
  config = Exercism::Config.write(path, data)
33
43
  filename = config.file
34
44
  config.delete
@@ -20,7 +20,7 @@ class ExercismTest < MiniTest::Unit::TestCase
20
20
  def test_login_gives_you_a_user
21
21
  Exercism.stub(:home, './test/fixtures') do
22
22
  key = '97e9975'
23
- user = Exercism.login('bob', key)
23
+ user = Exercism.login('bob', key, '/dev/null')
24
24
  assert_equal 'bob', user.github_username
25
25
  assert_equal key, user.key
26
26
  end
@@ -29,7 +29,7 @@ class ExercismTest < MiniTest::Unit::TestCase
29
29
  def test_login_writes_the_config_file
30
30
  Exercism.stub(:home, './test/fixtures') do
31
31
  key = '97e9975'
32
- Exercism.login('bob', key)
32
+ Exercism.login('bob', key, '/tmp')
33
33
  user = Exercism.user
34
34
  assert_equal 'bob', user.github_username
35
35
  assert_equal key, user.key
@@ -1,3 +1,4 @@
1
1
  ---
2
2
  github_username: alice
3
3
  key: 634abfb095ed621e1c793c9875fcd9fda455ea90
4
+ project_dir: /tmp
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exercism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen