CodewarsClient

Simple Wrapper for the Codewars site, where you can improve your coding skills by completing Katas.

Installation

Add this line to your application's Gemfile:

gem 'codewars_client'

And then execute:

$ bundle

Or install it yourself as:

$ gem install codewars_client

Configuration

To use this gem you have to have an account with Codewars.

Then get the Api key from the profile settings and added to the gem.

There are to ways of configuration.

1- Block

  CodewarsClient.configure do |config|
      config.api_key = API_KEY
  end

2- Inline

CodewarsClient.api_key = API_KEY

Endpoints

User

CodewarsClient.user(username_or_id: USERNAME_OR_ID)

It will return a CodewarsClient::User object with all the information of the user.

{
    "username": "some_user",
    "name": "Some Person",
    "honor": 544,
    "clan": "some clan",
    "leaderboardPosition": 134,
    "skills": [
        "ruby",
        "c#",
        ".net",
        "javascript",
        "coffeescript",
        "nodejs",
        "rails"
    ],
    "ranks": {
        "overall": {
            "rank": -3,
            "name": "3 kyu",
            "color": "blue",
            "score": 2116
        },
        "languages": {
            "javascript": {
                "rank": -3,
                "name": "3 kyu",
                "color": "blue",
                "score": 1819
            },
            "ruby": {
                "rank": -4,
                "name": "4 kyu",
                "color": "blue",
                "score": 1005
            },
            "coffeescript": {
                "rank": -4,
                "name": "4 kyu",
                "color": "blue",
                "score": 870
            }
        }
    },
    "codeChallenges": {
        "totalAuthored": 3,
        "totalCompleted": 230
    }
}

Next Kata

CodewarsClient.next_kata(language: LANGUAGE)

Valid languages

clojure
coffescript
c
haskell
java
javascript
python
ruby

It accept language as symbol and string

It will return a CodewarsClient::NextKata object with all the information of the kata and start a new training session.

{
   "success":true,
   "name":"Anything to integer",
   "slug":"anything-to-integer",
   "description":"Your task is to program a function which converts any input to an integer.\n\nDo not perform rounding, the fractional part should simply be discarded.\n\nIf converting the input to an integer does not make sense (with an object, for instance), the function should return 0 (zero).\n\nAlso, Math.floor(), parseInt() and parseFloat() are disabled for your unconvenience.\n\nOnegaishimasu!",
   "author":"Jake Hoffner",
   "rank":-6,
   "averageCompletion":125.4,
   "tags":[
      "Fundamentals",
      "Integers",
      "Data Types",
      "Numbers"
   ],
   "session":{
       "projectId":"523f66fba0de5d94410001cb",
       "solutionId":"53bc968d35fd2feefd000013",
       "setup":"function toInteger(n) {\n  \n}",
       "exampleFixture":"Test.expect(toInteger(\"4.55\") === 4)",
       "code":null
   }
}

Attemp Solution

CodewarsClient.attempt_solution(kata: NEXT_KATA_OBJECT , code: YOUR_CODE)

The NEXT_KATA_OBJECT could be any kind of object at least it has te respond to solution_id and project_id and return valid data related with the kata.

Will submit a solution to be validated, this will return a deferred message id (dmid) which will be use to poll for the response.

{
   "success":true,
   "dmid":"4rsdaDf8d"
}

Deferred Response

CodewarsClient.deferred_response(dmid: DMID)

This is use for polling the response from the server. It will return a CodewarsClient::DeferredResponse object with al the information.

{
   "success":true,
   "dmid":"4rsdaDf8d",
   "valid": false,
   "reason":"-e: Value is not what was expected (Test::Error)\n",
   "output":[
      "<div class='console-failed'>Value is not what was expected</div>"
   ],
   "wall_time":45
}

Finalize Solution

CodewarsClient.finalize(kata: NEXT_KATA_OBJECT)

The NEXT_KATA_OBJECT could be any kind of object at least it has te respond to solution_id and project_id and return valid data related with the kata.

This endpoint is used to finalize the previously submitted solution. This endpoint will only return a success message if there has been a previously successful solution.

{
   "success":true
}

Practical Example

CodewarsClient.api_key = 'fake_api_key'

def client
  CodewarsClient
end

kata = client.next_kata(language: :ruby)

# Read the kata information and complete it with some code !!!

code = File.read('./solution.rb')

attempt_solution = client.attempt_solution(kata: kata, code: code)

10.times do
  deferred_response = client.deferred_response(dmid: attempt_solution.dmid)
  break if deferred_response.success
end

if deferred_response.valid
  client.finalize_solution(kata: kata)
else
  warn deferred_response.reason
end

Development

After checking out the repo, run bin/setup to install dependencies.

To been able to run the test or to use the api with the interactive prompt you will have to create a secrest.yml file inside the config folder and store a valid api_key. api_key: VALID_API_KEY

Then, run rake spec to run the tests. Run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/GustavoCaso/codewars_client. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.