codewars 0.2.1 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4f5e4e5fc5d3914c287de427edddb75aae6ceb5
4
- data.tar.gz: 9c311240e76d668cfaa22901db04bcddd147db19
3
+ metadata.gz: 2cd0746ec8b08a3b1b025438cb6e18a8889b03f8
4
+ data.tar.gz: 8ece0ca9d47fbd804bfa38f72a7a44fff36b7e9c
5
5
  SHA512:
6
- metadata.gz: f65727fe081d5e766eb370fb19d6b3be6a413d6a2ded9f765d3bd778052b5cb87a7266d877d517efed90dbe12b633641012f248355a715f04429fa44b70233ad
7
- data.tar.gz: 827374254b2bafee4bc1a871311af3c3c4487fc30d45cddf7462c61c6e99b5731709b1b5834f7f1853960e82336465e3359a57b27a4671533f69078d7535104b
6
+ metadata.gz: 4df508ffa205cdb6bc6b47b9002458df09d61fd2351c62260e330d0c971d97c3f0a2943c47cc527bcf9338c59eb5dfc83cf63facaacfb0febf0eafa5c8890ec9
7
+ data.tar.gz: 13e16751a845fbca0d8dcbfa03778ee6892b91e6c365b9cd0ce6dc157663b29a4e9ff3a33548cc529ac9282d9a809d9cf1dc3c8e0b7aedee91626f105b56f2fc
data/README.md CHANGED
@@ -2,44 +2,28 @@
2
2
 
3
3
  ## Installation
4
4
 
5
- Execute `gem install codewars`
5
+ 1. Make sure that Ruby is installed `ruby -v`
6
+ 2. Run `gem install codewars`
6
7
 
7
8
  ## Usage
8
9
 
9
- Execute `codewars help` to see all available commands.
10
+ Run `codewars help` to see all available commands.
10
11
 
11
- 1. Set an API ACCESS TOKEN from the codewars website (https://www.codewars.com/users/edit) `codewars config key your-secret-key`
12
- 2. Set a language you want to use `codewars config language ruby|javascript|etc`
13
- 3. Choose a kata which you want to solve `codewars train`
14
- 4. Start solving the kata `codewars train name-of-kata`
15
- 5. Go to created folder `cd name-of-kata/language/`
16
- 6. Look at description.md (use a Markdown viewer)
17
- 7. According to the description of the kata change or create tests using your favorite test framework
18
- 8. Change the solution.* file so the tests become green
19
- 9. Upload the solution and wait for a response of tests on the server `codewars attempt`
20
- 10. If there are no mistakes finalize the previously attempted solution `codewars finalize`
21
- 11. Look at results of other people, rest and pick up another kata or the same kata but using another language
12
+ 1. Set TOKEN from https://www.codewars.com/users/edit `codewars config key your-secret-key`
13
+ 2. Set a language `codewars config language ruby|javascript|etc`
14
+ 3. Choose a kata `codewars train`
15
+ 4. Start solving `codewars train name-of-kata`
16
+ 5. Open a folder `cd name-of-kata/language/`
17
+ 6. Create tests according on description.md
18
+ 7. Make the tests green
19
+ 8. Attempt the solution on the server `codewars attempt`
20
+ 9. Refactor your code
21
+ 10. Finalize `codewars finalize`
22
22
 
23
23
  ### Problems
24
24
 
25
25
  Not sure for purpose or not but API sometimes caches a request for the next kata. To solve the problem go to the link http://www.codewars.com/dashboard in your browser.
26
26
 
27
- ## Development
28
-
29
- ### TO-DO
30
-
31
- - [ ] Refactor anything you can
32
- - [ ] Add travis, coveralls, etc
33
- - [ ] After `codewars finalize` show a link with the language of submission
34
- - [ ] Change the name of commands: attempt and finalize (join them to one command?)
35
- - [ ] Rename 'config' command? Maybe to 'set'?
36
- - [ ] Add options to commands that can be added: --strategy=something, --language=something, etc.
37
- - [ ] Make 100% coverage in simplecov
38
- - [ ] Write RSpec module tests
39
- - [ ] Divide description.md to task.md + info.yml?
40
- - [ ] Refactor features so stubbing (mocking) become more obvious
41
- - [ ] Make a bug report "Author's name in an API response is yours name"
42
-
43
27
  ## Contributing
44
28
 
45
29
  Bug reports, pull requests and ideas are welcome!
@@ -20,11 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.10'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'webmock', '~> 1.21'
24
23
  spec.add_development_dependency 'aruba', '~> 0.11'
25
24
  spec.add_development_dependency 'pry-byebug'
26
25
  spec.add_development_dependency 'simplecov'
27
26
  spec.add_development_dependency 'rubocop'
27
+ spec.add_development_dependency 'rspec-mocks'
28
+ spec.add_development_dependency 'rspec-core'
28
29
 
29
30
  spec.add_dependency 'codewars_api', '~> 0.2'
30
31
  spec.add_dependency 'thor', '~> 0.19'
@@ -1,4 +1,4 @@
1
- CODEWARS_URL = 'http://www.codewars.com'
1
+ CODEWARS_URL = 'http://www.codewars.com'.freeze
2
2
 
3
3
  require 'codewars_api'
4
4
  require 'thor'
@@ -1,15 +1,14 @@
1
1
  module Codewars
2
2
  class Attempt < Thor
3
- def initialize
3
+ def initialize(client)
4
4
  api_key = Configuration.option('api_key')
5
- fail Thor::Error, 'You should set an api-key to use this command' unless api_key
5
+ raise Thor::Error, 'You should set an api-key to use this command' unless api_key
6
6
 
7
7
  desc = Description.new
8
8
  project_id = desc.take_value_from_file(/Project ID: (.+)/, 'Project ID')
9
9
  solution_id = desc.take_value_from_file(/Solution ID: (.+)/, 'Solution ID')
10
10
  solution = read_solution_file
11
11
 
12
- client = CodewarsApi::Client.new(api_key: api_key)
13
12
  attempt = client.attempt_solution(
14
13
  project_id: project_id,
15
14
  solution_id: solution_id,
@@ -28,7 +27,7 @@ module Codewars
28
27
  file_name = 'solution.*'
29
28
  solution_filename = Dir.glob(file_name).first
30
29
  unless solution_filename
31
- fail Thor::Error, "The file '#{file_name}' has not been found in the current directory."
30
+ raise Thor::Error, "The file '#{file_name}' has not been found in the current directory."
32
31
  end
33
32
  File.read File.expand_path(solution_filename)
34
33
  end
@@ -45,7 +44,7 @@ module Codewars
45
44
 
46
45
  def handle_deferred_response(deferred_response)
47
46
  if deferred_response.nil? || !deferred_response.success
48
- fail Thor::Error, "Can't get a result of tests on the server. Try it again."
47
+ raise Thor::Error, "Can't get a result of tests on the server. Try it again."
49
48
  end
50
49
 
51
50
  if deferred_response.valid
@@ -53,7 +52,7 @@ module Codewars
53
52
  say 'Type to finalize the solution: ' + set_color('codewars finalize', :blue, true)
54
53
  else
55
54
  error 'The solution has not passed tests on the server. Response:'
56
- fail Thor::Error, set_color(deferred_response.reason, :red)
55
+ raise Thor::Error, set_color(deferred_response.reason, :red)
57
56
  end
58
57
  end
59
58
  end
@@ -6,20 +6,32 @@ module Codewars
6
6
  desc 'train', 'Train a next kata'
7
7
  def train(id_or_slug = nil)
8
8
  if id_or_slug
9
- TrainSpecific.new(id_or_slug)
9
+ TrainSpecific.new(client, id_or_slug)
10
10
  else
11
- TrainNext.new
11
+ TrainNext.new(client)
12
12
  end
13
13
  end
14
14
 
15
15
  desc 'attempt', 'Send a solution and get a result'
16
16
  def attempt
17
- Attempt.new
17
+ Attempt.new(client)
18
18
  end
19
19
 
20
20
  desc 'finalize', 'Finalize the previously attempted solution'
21
21
  def finalize
22
- Finalize.new
22
+ Finalize.new(client)
23
+ end
24
+
25
+ private
26
+
27
+ def client
28
+ api_key = read_api_key
29
+ CodewarsApi::Client.new(api_key: api_key)
30
+ end
31
+
32
+ def read_api_key
33
+ api_key = Configuration.option('api_key')
34
+ api_key || raise(Thor::Error, 'You should set an api-key to use this command')
23
35
  end
24
36
  end
25
37
  end
@@ -2,7 +2,7 @@ require 'yaml'
2
2
 
3
3
  module Codewars
4
4
  class Configuration
5
- CONFIG_NAME = '.codewarsrc'
5
+ CONFIG_NAME = '.codewarsrc'.freeze
6
6
 
7
7
  def self.write_option_to_config(option, value)
8
8
  config_hash = config
@@ -1,13 +1,13 @@
1
1
  module Codewars
2
2
  class Description < Thor
3
- DESCRIPTION_FILE_NAME = 'description.md'
3
+ DESCRIPTION_FILE_NAME = 'description.md'.freeze
4
4
 
5
5
  no_commands do
6
6
  def take_value_from_file(regex_with_group, param_key)
7
7
  @data ||= read_file(DESCRIPTION_FILE_NAME)
8
8
  param = @data.match(regex_with_group)
9
9
  unless param
10
- fail Thor::Error, "'#{param_key}' has not been found in the 'description.md' file."
10
+ raise Thor::Error, "'#{param_key}' has not been found in the 'description.md' file."
11
11
  end
12
12
  param[1]
13
13
  end
@@ -29,7 +29,7 @@ module Codewars
29
29
  def read_file(file_name)
30
30
  desc_path = File.expand_path(file_name)
31
31
  unless File.exist? desc_path
32
- fail Thor::Error, "The file '#{file_name}' has not been found in the current directory."
32
+ raise Thor::Error, "The file '#{file_name}' has not been found in the current directory."
33
33
  end
34
34
  File.read(desc_path)
35
35
  end
@@ -1,15 +1,11 @@
1
1
  module Codewars
2
2
  class Finalize < Thor
3
- def initialize
4
- api_key = Configuration.option('api_key')
5
- fail Thor::Error, 'You should set an api-key to use this command' unless api_key
6
-
3
+ def initialize(client)
7
4
  desc = Description.new
8
5
  slug = desc.take_value_from_file(/Slug: (.+)/, 'Slug')
9
6
  project_id = desc.take_value_from_file(/Project ID: (.+)/, 'Project ID')
10
7
  solution_id = desc.take_value_from_file(/Solution ID: (.+)/, 'Solution ID')
11
8
 
12
- client = CodewarsApi::Client.new(api_key: api_key)
13
9
  result = client.finalize_solution(
14
10
  project_id: project_id,
15
11
  solution_id: solution_id
@@ -24,7 +20,7 @@ module Codewars
24
20
  say 'Your solution has been finalized.'
25
21
  say "Other solutions can be found here: #{CODEWARS_URL}/kata/#{slug}/solutions/"
26
22
  else
27
- fail Thor::Error, 'Something went wrong. Try to sumbit the solution again.'
23
+ raise Thor::Error, 'Something went wrong. Try to sumbit the solution again.'
28
24
  end
29
25
  end
30
26
  end
@@ -8,7 +8,7 @@ module Codewars
8
8
  'haskell' => 'hs',
9
9
  'csharp' => 'cs',
10
10
  'closure' => 'clj'
11
- }
11
+ }.freeze
12
12
 
13
13
  def self.get(language)
14
14
  extension = MAPPING[language]
@@ -1,7 +1,5 @@
1
1
  require 'codewars'
2
2
 
3
- # to use Webmock we need the Runner class
4
- # https://github.com/cucumber/aruba#testing-ruby-cli-programs-without-spawning-a-new-ruby-process
5
3
  module Codewars
6
4
  class Runner
7
5
  def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
@@ -1,14 +1,9 @@
1
1
  module Codewars
2
2
  class TrainNext < Thor
3
- def initialize
4
- message = []
5
- api_key = Configuration.option('api_key')
6
- message.push 'You should set an api-key to use this command' unless api_key
3
+ def initialize(client)
7
4
  language = Configuration.option('language')
8
- message.push 'You should set an default language to use this command' unless language
9
- fail Thor::Error, message.join("\n") unless message.empty?
5
+ raise Thor::Error, 'You should set an default language to use this command' unless language
10
6
 
11
- client = CodewarsApi::Client.new(api_key: api_key)
12
7
  kata = client.train_next_kata(
13
8
  language: language.split(',').first,
14
9
  peek: 'true',
@@ -21,7 +16,7 @@ module Codewars
21
16
 
22
17
  def handle_next_kata(kata)
23
18
  if !kata.success && (kata.reason.eql? 'unauthorized')
24
- fail Thor::Error, 'Wrong api key'
19
+ raise Thor::Error, 'Wrong api key'
25
20
  end
26
21
  Description.new.print_kata_desc(kata)
27
22
  end
@@ -3,21 +3,15 @@ require 'fileutils'
3
3
 
4
4
  module Codewars
5
5
  class TrainSpecific < Thor
6
- def initialize(id_or_slug)
7
- message = []
8
- api_key = Configuration.option('api_key')
9
- message.push 'You should set an api-key to use this command' unless api_key
10
- languages = Configuration.option('language')
11
- message.push 'You should set an default language to use this command' unless languages
12
- fail Thor::Error, message.join("\n") unless message.empty?
6
+ def initialize(client, id_or_slug)
7
+ language = Configuration.option('language')
8
+ raise Thor::Error, 'You should set an default language to use this command' unless language
13
9
 
10
+ language = language.split(',').sample # pick a random language
14
11
  say "Starting the '#{id_or_slug}' kata."
15
12
 
16
- client = CodewarsApi::Client.new(api_key: api_key)
17
- languages.split(',').each do |language|
18
- kata = client.train_specific_kata(language: language, id_or_slug: id_or_slug) rescue next
19
- handle_specific_kata(kata, language)
20
- end
13
+ kata = client.train_specific_kata(language: language, id_or_slug: id_or_slug)
14
+ handle_specific_kata(kata, language)
21
15
  end
22
16
 
23
17
  private
@@ -37,7 +31,7 @@ module Codewars
37
31
  FileUtils.mkdir_p "#{dir_to_write}/#{language}"
38
32
  file_path = File.expand_path("#{dir_to_write}/#{language}/#{file_name}")
39
33
  relative_path = "./#{slug}/#{language}/#{file_name}"
40
- fail Thor::Error, "'#{relative_path}' already exists." if File.exist? file_path
34
+ raise Thor::Error, "'#{relative_path}' already exists." if File.exist? file_path
41
35
 
42
36
  File.write(file_path, content)
43
37
  say "'#{relative_path}' has been created."
@@ -49,7 +43,7 @@ module Codewars
49
43
  b.local_variable_set(:language, language)
50
44
  b.local_variable_set(:codewars_url, CODEWARS_URL)
51
45
  template_path = File.expand_path("#{File.dirname(__FILE__)}/description_template.erb")
52
- ERB.new(File.read template_path).result(b)
46
+ ERB.new(File.read(template_path)).result(b)
53
47
  end
54
48
  end
55
49
  end
@@ -1,3 +1,3 @@
1
1
  module Codewars
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codewars
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evgeny Morozov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-27 00:00:00.000000000 Z
11
+ date: 2016-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,35 +39,35 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: webmock
42
+ name: aruba
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.21'
47
+ version: '0.11'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.21'
54
+ version: '0.11'
55
55
  - !ruby/object:Gem::Dependency
56
- name: aruba
56
+ name: pry-byebug
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.11'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0.11'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: pry-byebug
70
+ name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: simplecov
84
+ name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,21 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rubocop
98
+ name: rspec-mocks
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-core
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="