{"action":"created","comment":{"url":"https://api.github.com/repos/inaka/Jayme/pulls/comments/65188207","id":65188207,"diff_hunk":"@@ -0,0 +1,384 @@\n+![Logo](https://raw.githubusercontent.com/inaka/Jayme/master/Assets/logo.png)\n+\n+***The abstraction layer that eases RESTful interconnections in Swift***\n+\n+------\n+\n+[![Build Status](https://api.travis-ci.org/inaka/Jayme.svg)](https://travis-ci.org/inaka/Jayme) [![Codecov](https://codecov.io/gh/inaka/jayme/branch/master/graph/badge.svg)](https://codecov.io/gh/inaka/jayme) [![Cocoapods](https://img.shields.io/cocoapods/v/Jayme.svg)](http://cocoadocs.org/docsets/Jayme) [![Twitter](https://img.shields.io/badge/twitter-@inaka-blue.svg?style=flat)](http://twitter.com/inaka)\n+\n+\n+## Overview\n+\n+What's the best place to put your *entities business logic* code? What's the best place to put your *networking* code?\n+\n+Jayme answers those two existencial questions by defining a straightforward and extendable architecture based on **Repositories** and **Backends**.\n+\n+It provides a neat API for dealing with REST communication, leaving your `ViewControllers` out of that business by abstracting all that logic, thereby allowing them to focus on what they should do rather on how they should connect to services.\n+\n+![Jayme's Architecture In A Nutshell](https://raw.githubusercontent.com/inaka/Jayme/master/Assets/architecture-diagram-1.png)\n+\n+## Migration Guides\n+\n+- [Jayme 2.0 Migration Guide](https://github.com/inaka/Jayme/blob/master/Documentation/Jayme%202.0%20Migration%20Guide.md)\n+\n+##Features\n+\n+- **Protocol-Oriented**\n+  - Jayme has been built following the concepts of [protocol-oriented programming](https://developer.apple.com/videos/play/wwdc2015/408/), encouraging composition over inheritance whenever possible.\n+- **Generics**\n+  - In order to provide high flexibility, generics and associated types are present almost everywhere in the library.\n+- **Error Handling**\n+  - Jayme comes with a default list of discrete errors, which are defined in an enumeration named `JaymeError`.\n+  - Any `case` in `JaymeError` turns out to be useful from the `ViewController` layer point of view. Cases represent possible different and meaningful UI scenarios. For instance: a `5xx` server status code is represented by a `case ServerError(statusCode: Int)`.\n+  - If you need different error definitions, Jayme allows you to use your own Error types, with the aid of associated types.\n+- **Futures / Results**\n+  - From experience, we've found out that the [Future Pattern](https://realm.io/news/swift-summit-javier-soto-futures/) is a very convenient way for layouting asynchronous code. In consequence, we decided to develop Jayme around that pattern.\n+  - `Future` and `Result` are two key structures in the library. You need to be familiar with them, since they are exposed on its public interfaces.\n+- **Logs**\n+  - Jayme includes a practical logging mechanism that can be quickly enabled or disabled. It also allows you to set a custom logging function to use, which results very convenient if your project uses third party logging libraries, like [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack).\n+- **Unit Tests**\n+  - Jayme is 100% unit-tested.\n+  - Unit tests are easy to implement, and encouraged, for testing your repositories business logic and your entities parsing.\n+- **No Dependencies**\n+  - Jayme does not leverage any external dependency.\n+  - However, you can integrate JSON parsing libraries (like [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)) and plug them in easily within `DictionaryInitializable` and `DictionaryRepresentable` protocol functions implementations in your entities.\n+\n+\n+\n+\n+\n+## Architecture\n+\n+Jayme works around the **Repository Pattern**. There are some key concepts that you need to become familiar with before using the library. These concepts can be outlined differently depending on how the pattern is implemented, as there are several ways of working with it.\n+\n+Below are brief descriptions of these concepts, based on how Jayme in particular implements the pattern:\n+\n+- A **Repository** is a collection that holds entities of a certain kind, and which is capable of filtering and returning entities back based on the needs of your application. \n+  - Your *business logic code* will usually live in **repositories**.\n+- A **Backend** is a middleman that receives concrete requests as input (e.g. a `DELETE` to `/users/123`) and is in charge of performing networking operations to satisfy those requests, giving results back.\n+  - Your *networking code* will usually live in **backends**.\n+- An **Entity** represents a *thing* that is meaningful in your application and you need to take care of.\n+  - Examples of entities are: `User`, `Post`, `Comment`, and so on.\n+\n+There are other relevant concepts that deserve further explanation, which are described below:\n+\n+###EntityType\n+\n+Actually, you will find no definition of `Entity` in the library. Repositories use entities as an associated type (`EntityType`); the only restriction is that any entity you create should conform to these three protocols:\n+\n+- `Identifiable`\n+  - To allow the entity to be unequivocally identified via an `id` field.\n+- `DictionaryInitializable`\n+  - To allow the entity to be initialized from a dictionary (parsed in).\n+- `DictionaryRepresentable`\n+  - To allow the entity to be represented through a dictionary (parsed out).\n+\n+\n+\n+### Identifiers\n+\n+Jayme takes a flexible approach regarding identifiers. As of Jayme 2.0, identifiers are not tied to any concrete type; it's up to you to define which kind of identifier each of your entity types will use. \n+\n+You could have entities having `Int` ids, other entities having `String`, or all of your them having the same identifier type. \n+\n+You can also use your own identifier types. This is particularly useful when you have to face complex scenarios. For instance, you might need to deal with *local identifiers* vs. *server identifiers*, and you might encounter several approaches for doing so. It's recommendable then that you take a look at the example project to see a complex identifier implementation (check out `PostIdentifier`).\n+\n+\n+### Jayme Default Core\n+\n+Whereas `Repository` and `Backend` definitions are only contracts, Jayme includes some structures based on them, which include default implementations (hence behaviors) that are based on conventions and standards that we normally follow at [Inaka](http://inaka.net/).\n+\n+These structures are:\n+\n+- `NSURLSessionBackend`: A *class* that connects to a server using `NSURLSession` mechanisms.\n+- `CRUDRepository`: A *protocol* that provides elemental CRUD functionality.\n+- `PagedRepository`: A *protocol* that provides read functionality with pagination.\n+\n+Normally you will use these. However, if you need, you can ignore them and implement your own common behaviors by conforming directly to the base `Repository` and `Backend` contracts, as shown below:\n+\n+![Jayme's Customization](https://raw.githubusercontent.com/inaka/Jayme/master/Assets/architecture-diagram-2.png)\n+\n+Next, there's a detailed description of each item mentioned above:\n+\n+#### NSURLSessionBackend\n+\n+- This class provides a backend that connects to a server using HTTP REST requests via `NSURLSession`.\n+\n+\n+- By default, it connects to `localhost:8080`, but you can change the base URL path by passing in a custom `NSURLSessionBackendConfiguration` object to its initializer. \n+- You can also set custom HTTP headers to be used in the requests when initilizing your own `NSURLSessionBackendConfiguration` instance.\n+- You can also customize the `NSURLSession` and `HTTPResponseParser` objects that are asked upon `NSURLSessionBackend` initialization. However, doing so is discouraged; these last two parameters have been purely added there for unit-testing purposes.\n+- This layer returns a `Future` that will hold a result containing either:\n+  - A *tuple* with:\n+    - An `NSData?` object, containing relevant data relative to the response.\n+    - A `PageInfo?` object containing pagination-related data (if there is any).\n+  - Or, a `JaymeError` indicating which error was produced when performing the request.\n+\n+#### *CRUDRepository*\n+\n+- This protocol provides convenient CRUD-like functions that are already implemented and ready to be used in any Repository that conforms to it. They are:\n+  - `findAll()` for fetching all the entities from the repository.\n+    - Hits `/:name` using the `GET` verb.\n+  - `findByID(id)` for fetching a specific entity matching a given `id`. \n+    - Hits `/:name/:id` using the `GET` verb.\n+  - `create(entity)` for creating a new entity in the repository.\n+    - Hits `/:name` with entity's `dictionaryValue` as parameters, using the `POST` verb.\n+  - `update(entity)` for updating an existing entity with its new values.\n+    - Hits `/:name/:id` with entity's `dictionaryValue` as parameters, using the `PUT` verb.\n+  - `delete(entity)` for deleting an existing entity from the repository.\n+    - Hits `/:name/:id` using the `DELETE` verb.\n+\n+![CRUDRepository Diagram](https://raw.githubusercontent.com/inaka/Jayme/master/Assets/crud-repository-diagram.png)\n+\n+- Any repository conforming to `CRUDRepository` will get these default CRUD operations for free. Besides, it can override any of these default implementations, or add his own custom functions based on business rules, as shown in this example:\n+\n+![PostRepository Diagram](https://raw.githubusercontent.com/inaka/Jayme/master/Assets/post-repository-diagram.png)\n+\n+#### *PagedRepository*\n+\n+- This protocol provides convenient functionality for reading entities in a paginated manner. Any of your repositories can conform to it and get this function for free:\n+  - `findByPage(pageNumber)` for fetching a fixed amount of entities from the repository, corresponding to a certain page number. The amount of entities fetched per page is configured in your concrete repository by providing a `pageSize` property. Besides the array containing entities, you get a `PageInfo` related object as well in return.\n+- The followed pagination conventions have been based on [Grape standards](https://github.com/davidcelis/api-pagination).\n+\n+\n+\n+## Example\n+\n+#### Creating your first Repository\n+\n+Let's pretend we want to create a repository that holds users, with basic CRUD functionality.\n+\n+First, let's create our `User` struct and make it conform to `Identifiable`, `DictionaryInitializable` and `DictionaryRepresentable` to match the generic `EntityType` that the `Repository` contract ask for.\n+\n+Here you can see how this entity conforms to all these protocols:\n+\n+```swift\n+// User.swift\n+\n+import Foundation\n+import SwiftyJSON\n+\n+struct User: Identifiable {\n+    let id: String\n+    let name: String\n+    let email: String\n+}\n+\n+extension User: DictionaryInitializable, DictionaryRepresentable {\n+    \n+    init(dictionary: [String: AnyObject]) throws {\n+        let json = JSON(dictionary)\n+        guard let\n+            id = json[\"id\"].string,\n+            name = json[\"name\"].string,\n+            email = json[\"email\"].string\n+            else { throw JaymeError.ParsingError }\n+        self.id = id\n+        self.name = name\n+        self.email = email\n+    }\n+    \n+    var dictionaryValue: [String: AnyObject] {\n+        return [\n+            \"id\": self.id,\n+            \"name\": self.name,\n+            \"email\": self.email\n+        ]\n+    }\n+    \n+}\n+```\n+\n+In this example, we used [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON) in purpose to expose how it can be used in cooperation with Jayme and your app to facilitate JSON structure conversions and casts.\n+\n+Then, let's define the `UserRepository`:\n+\n+```swift\n+// UserRepository.swift\n+\n+import Foundation\n+\n+class UserRepository: CRUDRepository {\n+\n+    typealias EntityType = User\n+    let backend = NSURLSessionBackend()\n+    let name = \"users\"\n+    \n+}\n+```\n+\n+Notice three things here:\n+\n+- A `typealias` is used for tying the generic `EntityType` to a concrete type (our `User`), hence letting the repository know which kind of entity it works with.\n+- `BackendType` is tied to `NSURLSessionBackend` in the `CRUDRepository` definition. However, since the latter is a protocol, you need to *instantiate* a `NSURLSessionBackend` in your concrete repository.\n+- The `name` that we provided represents, usually, the name that is given for a group of these kind of entities. That name is going to be used for composing a `path` which, at a later stage, the backend is going to hit for basic CRUD operations (e.g. `localhost:8080/users/[:id]`).\n+\n+**That's it!**\n+\n+With this basic configuration you're all set to perform CRUD asynchronous operations with your users from anywhere in your app.\n+\n+```swift\n+// UsersViewController.swift\n+\n+class UsersViewController: UIViewController {\n+\n+\t// Fetch users example\n+\t\n+\tfunc loadUsers() {\n+        let future = UserRepository().findAll()\n+        future.start() { result in\n+            switch result {\n+            case .Success(let users):\n+                // You've got your users fetched in this array!\n+                self.users = users\n+                self.tableView.reloadData()\n+            case .Failure(let error):\n+                // You've got a discrete JaymeError indicating what happened\n+                self.showAlertControllerForError(error)\n+            }\n+        }\n+    }\n+    \n+    // ...\n+}\n+```\n+\n+Do you see how simple and neat the code ended up being in your `ViewController` layer? Well, **that's the main purpose of Jayme.**\n+\n+\n+\n+#### Adding a bit of condiment to your first Repository\n+\n+Of course, not all the repositories are as trivial as the one we've just created. Jayme will make your life really easy when it comes to such basic repository configurations. But, what if we needed more complex stuff?\n+\n+Let's suppose that now we go a step further and we pretend to add a `Post` entity in our app. We also want to add support such that we can fetch all the posts that were created by a certain user.\n+\n+So, in order to do this, you first need to define your `Post` entity, as following:\n+\n+```swift\n+// Post.swift\n+\n+import Foundation\n+import SwifyJSON\n+\n+struct Post: Identifiable {\n+    let id: String\n+    let authorID: String\n+    let content: String\n+}\n+\n+extension Post: DictionaryInitializable, DictionaryRepresentable {\n+    \n+    init(dictionary: [String: AnyObject]) throws {\n+        let json = JSON(dictionary)\n+        guard let\n+            id = json[\"id\"].string,\n+            authorID = json[\"author_id\"].string,\n+            content = json[\"content\"].string\n+            else { throw JaymeError.ParsingError }\n+        self.id = id\n+        self.authorID = authorID\n+        self.content = content\n+    }\n+    \n+    var dictionaryValue: [String: AnyObject] {\n+        return [\n+            \"id\": self.id,\n+            \"author_id\": self.authorID,\n+            \"content\": self.content\n+        ]\n+    }\n+    \n+}\n+```\n+\n+And then, define your `PostRepository`, which is similar to your basic existent `UserRepository`, but adding an extra function which adds the *condiment* that you need:\n+\n+```swift\n+class PostRepository: CRUDRepository {\n+    \n+    typealias EntityType = Post\n+    let backend = NSURLSessionBackend()\n+    let name = \"posts\"\n+    \n+    func findPostsHavingAuthorID(authorID: String) -> Future<[Post], JaymeError> {\n+        // Considering that server-side documentation states that Posts by AuthorID are found in the \"/posts/:authorID\" path, we can do this:\n+        let path = \"\\(self.name)/\\(authorID)\"\n+        return self.backend.futureForPath(path, method: .GET, parameters: nil)\n+            .andThen { DataParser().dictionariesFromData($0.0) }\n+            .andThen { EntityParser().entitiesFromDictionaries($0) }\n+    }\n+    \n+}\n+```\n+\n+Notice here:\n+\n+- This function implementation has been pretty much based on the `findAll()` function implemented in an extension of `CRUDRepository`, which you would want to take a look at.\n+\n+\n+- You could consider several ways of approaching this functionality. For example:\n+  - Passing the whole `User` as a parameter instead of just its `id`\n+  - Fetching all the posts and then performing a `filter` over the result, instead of hitting a compound path (as shown in the example).\n+  - Defining, instead, a `findPostsForUser()` method in your `UserRepository`.\n+  - How you perform your solutions is actually up to you.\n+\n+\n+- See the usage of `DataParser` and `EntityParser` classes. They include parsing functions that will be often required in your repositories (e.g. converting `NSData` into an array of dictionaries, array of dictionaries into entities, etc.).\n+\n+\n+\n+\n+#### Setting up a custom logging function\n+\n+If you're relying on third party libraries to manage your logs, or if you have your own custom logging implementations, you can inject them so that Jayme uses it for its internal logging.\n+\n+Doing so is quite simple: You only have to set a different `loggingFunction` in the `Logger.sharedLogger` instance (which by default, uses the native `print`).\n+\n+Here you have a code sample demonstrating quickly how you can achieve that:\n+\n+```swift\n+Jayme.Logger.sharedLogger.loggingFunction = { (items: Any..., separator: String, terminator: String) -> () in\n+\tCustomDebugLog(\"\\(items)\")\n+}\n+```\n+\n+\n+\n+\n+#### That's pretty much it! \n+\n+We are sure you will have to develop more complex scenarios and have bigger challenges by yourself. So, have fun! We encourage you to share anything interesting that can aport more robustness and flexibility to the library.","path":"README-for-review.md","position":351,"original_position":351,"commit_id":"6e71c57e872a216b5a18d781521fab93c5fbde59","original_commit_id":"6e71c57e872a216b5a18d781521fab93c5fbde59","user":{"login":"mativ10","id":12645887,"avatar_url":"https://avatars.githubusercontent.com/u/12645887?v=3","gravatar_id":"","url":"https://api.github.com/users/mativ10","html_url":"https://github.com/mativ10","followers_url":"https://api.github.com/users/mativ10/followers","following_url":"https://api.github.com/users/mativ10/following{/other_user}","gists_url":"https://api.github.com/users/mativ10/gists{/gist_id}","starred_url":"https://api.github.com/users/mativ10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mativ10/subscriptions","organizations_url":"https://api.github.com/users/mativ10/orgs","repos_url":"https://api.github.com/users/mativ10/repos","events_url":"https://api.github.com/users/mativ10/events{/privacy}","received_events_url":"https://api.github.com/users/mativ10/received_events","type":"User","site_admin":false},"body":"and face bigger challenges by yourself. ","created_at":"2016-05-31T14:09:54Z","updated_at":"2016-05-31T14:09:54Z","html_url":"https://github.com/inaka/Jayme/pull/48#discussion_r65188207","pull_request_url":"https://api.github.com/repos/inaka/Jayme/pulls/48","_links":{"self":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/comments/65188207"},"html":{"href":"https://github.com/inaka/Jayme/pull/48#discussion_r65188207"},"pull_request":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/48"}}},"pull_request":{"url":"https://api.github.com/repos/inaka/Jayme/pulls/48","id":71910444,"html_url":"https://github.com/inaka/Jayme/pull/48","diff_url":"https://github.com/inaka/Jayme/pull/48.diff","patch_url":"https://github.com/inaka/Jayme/pull/48.patch","issue_url":"https://api.github.com/repos/inaka/Jayme/issues/48","number":48,"state":"open","locked":false,"title":"Polished README.","user":{"login":"pablolvillar","id":5367133,"avatar_url":"https://avatars.githubusercontent.com/u/5367133?v=3","gravatar_id":"","url":"https://api.github.com/users/pablolvillar","html_url":"https://github.com/pablolvillar","followers_url":"https://api.github.com/users/pablolvillar/followers","following_url":"https://api.github.com/users/pablolvillar/following{/other_user}","gists_url":"https://api.github.com/users/pablolvillar/gists{/gist_id}","starred_url":"https://api.github.com/users/pablolvillar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pablolvillar/subscriptions","organizations_url":"https://api.github.com/users/pablolvillar/orgs","repos_url":"https://api.github.com/users/pablolvillar/repos","events_url":"https://api.github.com/users/pablolvillar/events{/privacy}","received_events_url":"https://api.github.com/users/pablolvillar/received_events","type":"User","site_admin":false},"body":"- Enhanced README so that it's more concise.\r\n- Ready for spelling & grammar revision.","created_at":"2016-05-30T14:42:08Z","updated_at":"2016-05-31T14:09:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3e23cf6f350a72c508b2d0346636f1ddd4cbb90e","assignee":{"login":"mativ10","id":12645887,"avatar_url":"https://avatars.githubusercontent.com/u/12645887?v=3","gravatar_id":"","url":"https://api.github.com/users/mativ10","html_url":"https://github.com/mativ10","followers_url":"https://api.github.com/users/mativ10/followers","following_url":"https://api.github.com/users/mativ10/following{/other_user}","gists_url":"https://api.github.com/users/mativ10/gists{/gist_id}","starred_url":"https://api.github.com/users/mativ10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mativ10/subscriptions","organizations_url":"https://api.github.com/users/mativ10/orgs","repos_url":"https://api.github.com/users/mativ10/repos","events_url":"https://api.github.com/users/mativ10/events{/privacy}","received_events_url":"https://api.github.com/users/mativ10/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/inaka/Jayme/pulls/48/commits","review_comments_url":"https://api.github.com/repos/inaka/Jayme/pulls/48/comments","review_comment_url":"https://api.github.com/repos/inaka/Jayme/pulls/comments{/number}","comments_url":"https://api.github.com/repos/inaka/Jayme/issues/48/comments","statuses_url":"https://api.github.com/repos/inaka/Jayme/statuses/6e71c57e872a216b5a18d781521fab93c5fbde59","head":{"label":"inaka:pablo.README","ref":"pablo.README","sha":"6e71c57e872a216b5a18d781521fab93c5fbde59","user":{"login":"inaka","id":867053,"avatar_url":"https://avatars.githubusercontent.com/u/867053?v=3","gravatar_id":"","url":"https://api.github.com/users/inaka","html_url":"https://github.com/inaka","followers_url":"https://api.github.com/users/inaka/followers","following_url":"https://api.github.com/users/inaka/following{/other_user}","gists_url":"https://api.github.com/users/inaka/gists{/gist_id}","starred_url":"https://api.github.com/users/inaka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inaka/subscriptions","organizations_url":"https://api.github.com/users/inaka/orgs","repos_url":"https://api.github.com/users/inaka/repos","events_url":"https://api.github.com/users/inaka/events{/privacy}","received_events_url":"https://api.github.com/users/inaka/received_events","type":"Organization","site_admin":false},"repo":{"id":57896405,"name":"Jayme","full_name":"inaka/Jayme","owner":{"login":"inaka","id":867053,"avatar_url":"https://avatars.githubusercontent.com/u/867053?v=3","gravatar_id":"","url":"https://api.github.com/users/inaka","html_url":"https://github.com/inaka","followers_url":"https://api.github.com/users/inaka/followers","following_url":"https://api.github.com/users/inaka/following{/other_user}","gists_url":"https://api.github.com/users/inaka/gists{/gist_id}","starred_url":"https://api.github.com/users/inaka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inaka/subscriptions","organizations_url":"https://api.github.com/users/inaka/orgs","repos_url":"https://api.github.com/users/inaka/repos","events_url":"https://api.github.com/users/inaka/events{/privacy}","received_events_url":"https://api.github.com/users/inaka/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/inaka/Jayme","description":"Abstraction layer that eases RESTful interconnections in Swift","fork":false,"url":"https://api.github.com/repos/inaka/Jayme","forks_url":"https://api.github.com/repos/inaka/Jayme/forks","keys_url":"https://api.github.com/repos/inaka/Jayme/keys{/key_id}","collaborators_url":"https://api.github.com/repos/inaka/Jayme/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/inaka/Jayme/teams","hooks_url":"https://api.github.com/repos/inaka/Jayme/hooks","issue_events_url":"https://api.github.com/repos/inaka/Jayme/issues/events{/number}","events_url":"https://api.github.com/repos/inaka/Jayme/events","assignees_url":"https://api.github.com/repos/inaka/Jayme/assignees{/user}","branches_url":"https://api.github.com/repos/inaka/Jayme/branches{/branch}","tags_url":"https://api.github.com/repos/inaka/Jayme/tags","blobs_url":"https://api.github.com/repos/inaka/Jayme/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/inaka/Jayme/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/inaka/Jayme/git/refs{/sha}","trees_url":"https://api.github.com/repos/inaka/Jayme/git/trees{/sha}","statuses_url":"https://api.github.com/repos/inaka/Jayme/statuses/{sha}","languages_url":"https://api.github.com/repos/inaka/Jayme/languages","stargazers_url":"https://api.github.com/repos/inaka/Jayme/stargazers","contributors_url":"https://api.github.com/repos/inaka/Jayme/contributors","subscribers_url":"https://api.github.com/repos/inaka/Jayme/subscribers","subscription_url":"https://api.github.com/repos/inaka/Jayme/subscription","commits_url":"https://api.github.com/repos/inaka/Jayme/commits{/sha}","git_commits_url":"https://api.github.com/repos/inaka/Jayme/git/commits{/sha}","comments_url":"https://api.github.com/repos/inaka/Jayme/comments{/number}","issue_comment_url":"https://api.github.com/repos/inaka/Jayme/issues/comments{/number}","contents_url":"https://api.github.com/repos/inaka/Jayme/contents/{+path}","compare_url":"https://api.github.com/repos/inaka/Jayme/compare/{base}...{head}","merges_url":"https://api.github.com/repos/inaka/Jayme/merges","archive_url":"https://api.github.com/repos/inaka/Jayme/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/inaka/Jayme/downloads","issues_url":"https://api.github.com/repos/inaka/Jayme/issues{/number}","pulls_url":"https://api.github.com/repos/inaka/Jayme/pulls{/number}","milestones_url":"https://api.github.com/repos/inaka/Jayme/milestones{/number}","notifications_url":"https://api.github.com/repos/inaka/Jayme/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/inaka/Jayme/labels{/name}","releases_url":"https://api.github.com/repos/inaka/Jayme/releases{/id}","deployments_url":"https://api.github.com/repos/inaka/Jayme/deployments","created_at":"2016-05-02T14:35:38Z","updated_at":"2016-05-26T21:46:20Z","pushed_at":"2016-05-30T19:02:57Z","git_url":"git://github.com/inaka/Jayme.git","ssh_url":"git@github.com:inaka/Jayme.git","clone_url":"https://github.com/inaka/Jayme.git","svn_url":"https://github.com/inaka/Jayme","homepage":"http://inaka.net/blog/2016/05/09/meet-jayme/","size":1493,"stargazers_count":22,"watchers_count":22,"language":"Swift","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":22,"default_branch":"master"}},"base":{"label":"inaka:v2","ref":"v2","sha":"fd77289ae8b3a8b8c388db506f8c05c81e1d3cb5","user":{"login":"inaka","id":867053,"avatar_url":"https://avatars.githubusercontent.com/u/867053?v=3","gravatar_id":"","url":"https://api.github.com/users/inaka","html_url":"https://github.com/inaka","followers_url":"https://api.github.com/users/inaka/followers","following_url":"https://api.github.com/users/inaka/following{/other_user}","gists_url":"https://api.github.com/users/inaka/gists{/gist_id}","starred_url":"https://api.github.com/users/inaka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inaka/subscriptions","organizations_url":"https://api.github.com/users/inaka/orgs","repos_url":"https://api.github.com/users/inaka/repos","events_url":"https://api.github.com/users/inaka/events{/privacy}","received_events_url":"https://api.github.com/users/inaka/received_events","type":"Organization","site_admin":false},"repo":{"id":57896405,"name":"Jayme","full_name":"inaka/Jayme","owner":{"login":"inaka","id":867053,"avatar_url":"https://avatars.githubusercontent.com/u/867053?v=3","gravatar_id":"","url":"https://api.github.com/users/inaka","html_url":"https://github.com/inaka","followers_url":"https://api.github.com/users/inaka/followers","following_url":"https://api.github.com/users/inaka/following{/other_user}","gists_url":"https://api.github.com/users/inaka/gists{/gist_id}","starred_url":"https://api.github.com/users/inaka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inaka/subscriptions","organizations_url":"https://api.github.com/users/inaka/orgs","repos_url":"https://api.github.com/users/inaka/repos","events_url":"https://api.github.com/users/inaka/events{/privacy}","received_events_url":"https://api.github.com/users/inaka/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/inaka/Jayme","description":"Abstraction layer that eases RESTful interconnections in Swift","fork":false,"url":"https://api.github.com/repos/inaka/Jayme","forks_url":"https://api.github.com/repos/inaka/Jayme/forks","keys_url":"https://api.github.com/repos/inaka/Jayme/keys{/key_id}","collaborators_url":"https://api.github.com/repos/inaka/Jayme/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/inaka/Jayme/teams","hooks_url":"https://api.github.com/repos/inaka/Jayme/hooks","issue_events_url":"https://api.github.com/repos/inaka/Jayme/issues/events{/number}","events_url":"https://api.github.com/repos/inaka/Jayme/events","assignees_url":"https://api.github.com/repos/inaka/Jayme/assignees{/user}","branches_url":"https://api.github.com/repos/inaka/Jayme/branches{/branch}","tags_url":"https://api.github.com/repos/inaka/Jayme/tags","blobs_url":"https://api.github.com/repos/inaka/Jayme/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/inaka/Jayme/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/inaka/Jayme/git/refs{/sha}","trees_url":"https://api.github.com/repos/inaka/Jayme/git/trees{/sha}","statuses_url":"https://api.github.com/repos/inaka/Jayme/statuses/{sha}","languages_url":"https://api.github.com/repos/inaka/Jayme/languages","stargazers_url":"https://api.github.com/repos/inaka/Jayme/stargazers","contributors_url":"https://api.github.com/repos/inaka/Jayme/contributors","subscribers_url":"https://api.github.com/repos/inaka/Jayme/subscribers","subscription_url":"https://api.github.com/repos/inaka/Jayme/subscription","commits_url":"https://api.github.com/repos/inaka/Jayme/commits{/sha}","git_commits_url":"https://api.github.com/repos/inaka/Jayme/git/commits{/sha}","comments_url":"https://api.github.com/repos/inaka/Jayme/comments{/number}","issue_comment_url":"https://api.github.com/repos/inaka/Jayme/issues/comments{/number}","contents_url":"https://api.github.com/repos/inaka/Jayme/contents/{+path}","compare_url":"https://api.github.com/repos/inaka/Jayme/compare/{base}...{head}","merges_url":"https://api.github.com/repos/inaka/Jayme/merges","archive_url":"https://api.github.com/repos/inaka/Jayme/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/inaka/Jayme/downloads","issues_url":"https://api.github.com/repos/inaka/Jayme/issues{/number}","pulls_url":"https://api.github.com/repos/inaka/Jayme/pulls{/number}","milestones_url":"https://api.github.com/repos/inaka/Jayme/milestones{/number}","notifications_url":"https://api.github.com/repos/inaka/Jayme/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/inaka/Jayme/labels{/name}","releases_url":"https://api.github.com/repos/inaka/Jayme/releases{/id}","deployments_url":"https://api.github.com/repos/inaka/Jayme/deployments","created_at":"2016-05-02T14:35:38Z","updated_at":"2016-05-26T21:46:20Z","pushed_at":"2016-05-30T19:02:57Z","git_url":"git://github.com/inaka/Jayme.git","ssh_url":"git@github.com:inaka/Jayme.git","clone_url":"https://github.com/inaka/Jayme.git","svn_url":"https://github.com/inaka/Jayme","homepage":"http://inaka.net/blog/2016/05/09/meet-jayme/","size":1493,"stargazers_count":22,"watchers_count":22,"language":"Swift","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":22,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/48"},"html":{"href":"https://github.com/inaka/Jayme/pull/48"},"issue":{"href":"https://api.github.com/repos/inaka/Jayme/issues/48"},"comments":{"href":"https://api.github.com/repos/inaka/Jayme/issues/48/comments"},"review_comments":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/48/comments"},"review_comment":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/inaka/Jayme/pulls/48/commits"},"statuses":{"href":"https://api.github.com/repos/inaka/Jayme/statuses/6e71c57e872a216b5a18d781521fab93c5fbde59"}}}}
{"actor":{"display_login":"mativ10"}}