{"action":"created","comment":{"url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/comments/75819954","id":75819954,"diff_hunk":"@@ -0,0 +1,298 @@\n+---\n+date: \"2016-07-20\"\n+title: Votre première app React Native\n+tags:\n+  - javascript\n+  - react-native\n+  - reactjs\n+authors:\n+  - zoontek\n+---\n+\n+Cela fait déjà plus d'un an que Facebook a publié la première version React Native.\n+Longtemps considéré comme une expérimentation sympathique (après tout, il est né lors d'un hackathon), un cycle de release soutenu d'une version majeure toutes les 2 semaines a fait qu'aujourd'hui l'écosystème est suffisemment riche et stable pour déployer une app iOS et android en production.\n+\n+## Quels problèmes avec les solutions hybrides ?\n+\n+Des solutions pour développer une application mobile multiplateforme en JS existent déjà: je pense notamment à [Cordova](https://cordova.apache.org/) ou à son superset [Ionic](http://ionicframework.com/). Conçu autour d'une webview système (un navigateur embedded - Safari sur iOS, Chrome sur android) affiché en plein écran, vous utilisez des technologies web classiques: HTML, CSS, JS. Il est possible d'installer des plugins afin d'enrichir le moteur JavaScript avec de nouvelles APIs en plus des APIs navigateur.\n+Ainsi, `cordova-plugin-contacts` permet d'accéder au carnet d'adresses du smartphone, `cordova-plugin-vibration` permet de faire vibrer celui-ci, etc.\n+\n+Le problème, c'est que si l'utilisation de plugins permet de faire pont avec le code natif (un message est envoyé de la partie JS à la partie Objective-C / Java, qui l'exécute de son côté et renvoit le résultat au JS), l'UI de l'application n'utilise elle pas du tout le layout natif des OS mobiles. Les performances et le look'n'feel de celle-ci seront donc équivalente à une app web, et non une app mobile.\n+\n+Avec React Native, point de navigateur embedded, de HTML ou de CSS: vous devez composer vos interfaces à l'aide de composants React qui font appel au layout natif de la plateforme. Un exemple simple: `<View>` (qui est l'équivalent d'une `<div>` HTML) communique via un pont JS <-> Objective-C / Java pour contrôler une UIView (sur iOS) ou une android.view. Les performances de l'UI sont donc quasi similaires aux performances natives.\n+\n+## Découverte de l'environnement de dev\n+\n+Fatigués par JavaScript et son tooling un peu trop fourni ? Rassurez-vous: vous n'avez strictement rien à configurer pour commencer à utiliser React Native. Vous disposez out-of-the-box d'un packager Babel et d'un [preset custom](https://github.com/facebook/react-native/tree/master/babel-preset) qui intègre les fonctionnalités de ES2015, mais également le support de React / JSX (encore heureux), de [Flow](https://flowtype.org/) et d'autres helpers bienvenus telles que `async / await`.\n+\n+En bons passionnés de bière, nous allons réaliser ensemble une app qui requête la [PunkAPI](https://punkapi.com/) (faites la demande d'une clé API via le formulaire prévu à cet effet).\n+\n+Je vous renvoie à la [documentation officielle](https://facebook.github.io/react-native/docs/getting-started.html) pour ce qui est de l'installation des dépendances (celles-ci variant selon votre OS et l'OS cible).\n+Xcode / Android studio, node et watchman étant installés, ouvrez un terminal et initiez le projet:\n+```\n+npm install -g react-native-cli\n+react-native init PutainDeBiere\n+```\n+\n+Une fois le projet initialisé, le CLI vous informe de la façon dont lancer votre application: faites le dans la foulée. En ce qui me concerne, je développe pour iOS.\n+\n+```bash\n+react-native run-ios\n+```\n+\n+Selon votre plateforme cible, ouvrez `index.ios.js` ou `index.android.js` dans votre éditeur préféré. Modifiez quelque peu le texte et rafraichissez votre app via `Command⌘ + R`, deux pressions sur la touche `R` (emulateur android).\n+\n+```javascript\n+/* @flow */\n+\n+import React, { Component } from 'react'\n+import {\n+  AppRegistry,\n+  StyleSheet,\n+  Text,\n+  View\n+} from 'react-native'\n+\n+class App extends Component {\n+  render() {\n+    return (\n+      <View style={styles.container}>\n+        <Text style={styles.welcome}>\n+          Welcome to PutainDeBiere!\n+        </Text>\n+      </View>\n+    )\n+  }\n+}\n+\n+const styles = StyleSheet.create({\n+  container: {\n+    flex: 1,\n+    justifyContent: 'center',\n+    alignItems: 'center',\n+    backgroundColor: '#F5FCFF',\n+  },\n+  welcome: {\n+    fontSize: 20,\n+    textAlign: 'center',\n+    margin: 10,\n+  },\n+})\n+\n+AppRegistry.registerComponent('PutainDeBiere', () => App)\n+```\n+\n+<figure>\n+  <img src=\"welcome.png\" alt=\"welcome PutainDeBiere preview\" />\n+  <figcaption>Une bien jolie première étape</figcaption>\n+</figure>\n+\n+## Récupération des données\n+\n+Afin de requêter notre API, React Native nous offre plusieurs plusieurs solutions: `fetch()` ou `XMLHttpRequest`. Tenez vous en **uniquement** à l'utilisation de la première, la deuxième n'étant présente que pour assurer une compatibilité avec des librairies tierces.\n+\n+*/!\\ Notre clé API doit être encodé en base64. La function `btoa()` n'étant pas disponible en React Native, il est nécessaire d'installer une dépendance.*\n+\n+```bash\n+npm install --save base-64\n+```\n+\n+Histoire de séparer notre logique API de nos composants React, nous allons créer un fichier nommé `punkapi.js` à la racine de notre projet.\n+\n+```javascript\n+import base64 from 'base-64' // importez la dépendance tout juste installée\n+\n+const rootEndpoint = 'https://punkapi.com/api/v1'\n+// pour simplifier la compréhension de ce tuto, nous renseignons la clé API \"en dur\"\n+// ne faites jamais cela au sein de vos projets (voir http://12factor.net/fr/config)\n+const punkApiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n+const password = '' // la punk API n'utilise aucun mot de passe\n+const authBase64 = base64.encode(`${punkApiKey}:${password}`)\n+\n+const headers = {\n+  'Content-Type': 'application/json',\n+  'Accept': 'application/json',\n+  'Authorization': `Basic ${authBase64}` // HTTP basic auth\n+}\n+\n+// retourne une recette de bière au hasard\n+export const getRandomBrewdog = () =>\n+  fetch(`${rootEndpoint}/beers/random`, { headers })\n+    .then(response => response.json()) // on parse la réponse en JSON\n+```\n+\n+Nous allons maintenant modifier notre composant `<App>` afin de faire une requête simple d'une bière au hasard juste avant le montage de celui-ci.\n+\n+```javascript\n+import { getRandomBrewdog } from './punkapi'\n+\n+class App extends Component {\n+  componentWillMount() {\n+    getRandomBrewdog() // fetch() retourne une Promise\n+      .then(json => console.log(json))\n+      .catch(error => console.error(error))\n+  }\n+\n+  …\n+}\n+```\n+\n+Vous apercevez la présence d'un appel à `console.log()`. Pour y accéder, rien de plus simple: pressez `Command⌘ + D` au sein de l'émulateur iOS, ou appuyez sur le bouton `Menu` de l'émulateur android. Celui-ci contient de multiples choses que je vous laisse expérimenter par la suite; ce qui nous intéresse ici c'est le bouton `Debug JS Remotely`, qui va ouvrir un nouvel onglet dans Chrome ou sera exécuté notre code JS.\n+\n+Il devient donc possible d'ouvrir les Chrome Devtools (dont la console) afin de débuguer notre app.\n+\n+<figure>\n+  <img src=\"devmenu.png\" alt=\"devmenu + chrome devtools\" />\n+  <figcaption>Jusqu'ici tout va bien</figcaption>\n+</figure>\n+\n+## Présentation des données\n+\n+Afin d'afficher les informations que nous venons de récupérer, nous allons avoir besoin de plusieurs (heureusement fournis), à savoir de quoi encapsuler d'autres composants (une `<View>` ~= une `<div>` HTML), de quoi rendre du texte (`<Text>` ~= `<span>`), d'un bouton (nous allons utiliser `<TouchableOpacity>`, une zone dont l'opacité est modifiée lors d'un `onTouch`) et enfin d'un spinner pour indiquer qu'une requête est en cours (`<ActivityIndicator>`).\n+\n+Nous allons également rendre notre unique composant statefull afin de stocker quelques informations retournées par l'API.\n+\n+```javascript\n+import React, { Component } from 'react'\n+import {\n+  AppRegistry,\n+  StyleSheet,\n+  ActivityIndicator, // import des composants\n+  TouchableOpacity,\n+  Text,\n+  View,\n+} from 'react-native'\n+\n+import { getRandomBrewdog } from './punkapi'\n+\n+class App extends Component {\n+  constructor(props) {\n+    super(props)\n+\n+    // la state de notre composant est utilisé pour\n+    // stocker quelques infos renvoyées par l'API\n+    this.state = {\n+      name: '', // nom de la bière\n+      description: '', // sa description\n+      isLoading: false // la requête API est-elle en cours ?\n+    }\n+  }\n+\n+  // nous externalisons cette fonction afin de\n+  // pouvoir l'appeler lorsqu'on le souhaite\n+  _getRandomBrewdogWithFeedback = () => {\n+    this.setState({ isLoading: true })\n+\n+    getRandomBrewdog()\n+      .then(json => this.setState({\n+        name: json.name,\n+        description: json.description,\n+        isLoading: false // la requête est terminée\n+      }))\n+      .catch(error => console.error(error))","path":"content/fr/articles/js/react/react-native-introduction/index.md","position":192,"original_position":192,"commit_id":"b21c592ad17c60ebb94c9947dc9a8c963e158d2b","original_commit_id":"b21c592ad17c60ebb94c9947dc9a8c963e158d2b","user":{"login":"zoontek","id":1902323,"avatar_url":"https://avatars.githubusercontent.com/u/1902323?v=3","gravatar_id":"","url":"https://api.github.com/users/zoontek","html_url":"https://github.com/zoontek","followers_url":"https://api.github.com/users/zoontek/followers","following_url":"https://api.github.com/users/zoontek/following{/other_user}","gists_url":"https://api.github.com/users/zoontek/gists{/gist_id}","starred_url":"https://api.github.com/users/zoontek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zoontek/subscriptions","organizations_url":"https://api.github.com/users/zoontek/orgs","repos_url":"https://api.github.com/users/zoontek/repos","events_url":"https://api.github.com/users/zoontek/events{/privacy}","received_events_url":"https://api.github.com/users/zoontek/received_events","type":"User","site_admin":false},"body":"Du coup image?","created_at":"2016-08-23T08:16:42Z","updated_at":"2016-08-23T08:16:42Z","html_url":"https://github.com/putaindecode/putaindecode.io/pull/681#discussion_r75819954","pull_request_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681","_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/comments/75819954"},"html":{"href":"https://github.com/putaindecode/putaindecode.io/pull/681#discussion_r75819954"},"pull_request":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681"}}},"pull_request":{"url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681","id":78119170,"html_url":"https://github.com/putaindecode/putaindecode.io/pull/681","diff_url":"https://github.com/putaindecode/putaindecode.io/pull/681.diff","patch_url":"https://github.com/putaindecode/putaindecode.io/pull/681.patch","issue_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/681","number":681,"state":"open","locked":false,"title":"Post.react native intro","user":{"login":"zoontek","id":1902323,"avatar_url":"https://avatars.githubusercontent.com/u/1902323?v=3","gravatar_id":"","url":"https://api.github.com/users/zoontek","html_url":"https://github.com/zoontek","followers_url":"https://api.github.com/users/zoontek/followers","following_url":"https://api.github.com/users/zoontek/following{/other_user}","gists_url":"https://api.github.com/users/zoontek/gists{/gist_id}","starred_url":"https://api.github.com/users/zoontek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zoontek/subscriptions","organizations_url":"https://api.github.com/users/zoontek/orgs","repos_url":"https://api.github.com/users/zoontek/repos","events_url":"https://api.github.com/users/zoontek/events{/privacy}","received_events_url":"https://api.github.com/users/zoontek/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-07-20T09:57:42Z","updated_at":"2016-08-23T08:16:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f69a4fc64a37ba72cfa34e8794400ccb380da826","assignee":{"login":"zoontek","id":1902323,"avatar_url":"https://avatars.githubusercontent.com/u/1902323?v=3","gravatar_id":"","url":"https://api.github.com/users/zoontek","html_url":"https://github.com/zoontek","followers_url":"https://api.github.com/users/zoontek/followers","following_url":"https://api.github.com/users/zoontek/following{/other_user}","gists_url":"https://api.github.com/users/zoontek/gists{/gist_id}","starred_url":"https://api.github.com/users/zoontek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zoontek/subscriptions","organizations_url":"https://api.github.com/users/zoontek/orgs","repos_url":"https://api.github.com/users/zoontek/repos","events_url":"https://api.github.com/users/zoontek/events{/privacy}","received_events_url":"https://api.github.com/users/zoontek/received_events","type":"User","site_admin":false},"assignees":[{"login":"zoontek","id":1902323,"avatar_url":"https://avatars.githubusercontent.com/u/1902323?v=3","gravatar_id":"","url":"https://api.github.com/users/zoontek","html_url":"https://github.com/zoontek","followers_url":"https://api.github.com/users/zoontek/followers","following_url":"https://api.github.com/users/zoontek/following{/other_user}","gists_url":"https://api.github.com/users/zoontek/gists{/gist_id}","starred_url":"https://api.github.com/users/zoontek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zoontek/subscriptions","organizations_url":"https://api.github.com/users/zoontek/orgs","repos_url":"https://api.github.com/users/zoontek/repos","events_url":"https://api.github.com/users/zoontek/events{/privacy}","received_events_url":"https://api.github.com/users/zoontek/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681/commits","review_comments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681/comments","review_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/681/comments","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.io/statuses/b21c592ad17c60ebb94c9947dc9a8c963e158d2b","head":{"label":"putaindecode:post.react-native-intro","ref":"post.react-native-intro","sha":"b21c592ad17c60ebb94c9947dc9a8c963e158d2b","user":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"repo":{"id":10319056,"name":"putaindecode.io","full_name":"putaindecode/putaindecode.io","owner":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/putaindecode/putaindecode.io","description":" :ok_hand: Putain de code ! is a place where you can read (and write) about best coding practices.  High quality content, reviewed by the community.","fork":false,"url":"https://api.github.com/repos/putaindecode/putaindecode.io","forks_url":"https://api.github.com/repos/putaindecode/putaindecode.io/forks","keys_url":"https://api.github.com/repos/putaindecode/putaindecode.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/putaindecode/putaindecode.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/putaindecode/putaindecode.io/teams","hooks_url":"https://api.github.com/repos/putaindecode/putaindecode.io/hooks","issue_events_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/events{/number}","events_url":"https://api.github.com/repos/putaindecode/putaindecode.io/events","assignees_url":"https://api.github.com/repos/putaindecode/putaindecode.io/assignees{/user}","branches_url":"https://api.github.com/repos/putaindecode/putaindecode.io/branches{/branch}","tags_url":"https://api.github.com/repos/putaindecode/putaindecode.io/tags","blobs_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.io/statuses/{sha}","languages_url":"https://api.github.com/repos/putaindecode/putaindecode.io/languages","stargazers_url":"https://api.github.com/repos/putaindecode/putaindecode.io/stargazers","contributors_url":"https://api.github.com/repos/putaindecode/putaindecode.io/contributors","subscribers_url":"https://api.github.com/repos/putaindecode/putaindecode.io/subscribers","subscription_url":"https://api.github.com/repos/putaindecode/putaindecode.io/subscription","commits_url":"https://api.github.com/repos/putaindecode/putaindecode.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/putaindecode/putaindecode.io/contents/{+path}","compare_url":"https://api.github.com/repos/putaindecode/putaindecode.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/putaindecode/putaindecode.io/merges","archive_url":"https://api.github.com/repos/putaindecode/putaindecode.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/putaindecode/putaindecode.io/downloads","issues_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues{/number}","pulls_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls{/number}","milestones_url":"https://api.github.com/repos/putaindecode/putaindecode.io/milestones{/number}","notifications_url":"https://api.github.com/repos/putaindecode/putaindecode.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/putaindecode/putaindecode.io/labels{/name}","releases_url":"https://api.github.com/repos/putaindecode/putaindecode.io/releases{/id}","deployments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/deployments","created_at":"2013-05-27T17:08:41Z","updated_at":"2016-08-14T14:43:17Z","pushed_at":"2016-08-22T22:44:18Z","git_url":"git://github.com/putaindecode/putaindecode.io.git","ssh_url":"git@github.com:putaindecode/putaindecode.io.git","clone_url":"https://github.com/putaindecode/putaindecode.io.git","svn_url":"https://github.com/putaindecode/putaindecode.io","homepage":"http://putaindecode.io/","size":26191,"stargazers_count":137,"watchers_count":137,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":84,"mirror_url":null,"open_issues_count":63,"forks":84,"open_issues":63,"watchers":137,"default_branch":"master"}},"base":{"label":"putaindecode:master","ref":"master","sha":"9fcc0f93c10e27c7b2c1d7c66efd664a90d95e3f","user":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"repo":{"id":10319056,"name":"putaindecode.io","full_name":"putaindecode/putaindecode.io","owner":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/putaindecode/putaindecode.io","description":" :ok_hand: Putain de code ! is a place where you can read (and write) about best coding practices.  High quality content, reviewed by the community.","fork":false,"url":"https://api.github.com/repos/putaindecode/putaindecode.io","forks_url":"https://api.github.com/repos/putaindecode/putaindecode.io/forks","keys_url":"https://api.github.com/repos/putaindecode/putaindecode.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/putaindecode/putaindecode.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/putaindecode/putaindecode.io/teams","hooks_url":"https://api.github.com/repos/putaindecode/putaindecode.io/hooks","issue_events_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/events{/number}","events_url":"https://api.github.com/repos/putaindecode/putaindecode.io/events","assignees_url":"https://api.github.com/repos/putaindecode/putaindecode.io/assignees{/user}","branches_url":"https://api.github.com/repos/putaindecode/putaindecode.io/branches{/branch}","tags_url":"https://api.github.com/repos/putaindecode/putaindecode.io/tags","blobs_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.io/statuses/{sha}","languages_url":"https://api.github.com/repos/putaindecode/putaindecode.io/languages","stargazers_url":"https://api.github.com/repos/putaindecode/putaindecode.io/stargazers","contributors_url":"https://api.github.com/repos/putaindecode/putaindecode.io/contributors","subscribers_url":"https://api.github.com/repos/putaindecode/putaindecode.io/subscribers","subscription_url":"https://api.github.com/repos/putaindecode/putaindecode.io/subscription","commits_url":"https://api.github.com/repos/putaindecode/putaindecode.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/putaindecode/putaindecode.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/putaindecode/putaindecode.io/contents/{+path}","compare_url":"https://api.github.com/repos/putaindecode/putaindecode.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/putaindecode/putaindecode.io/merges","archive_url":"https://api.github.com/repos/putaindecode/putaindecode.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/putaindecode/putaindecode.io/downloads","issues_url":"https://api.github.com/repos/putaindecode/putaindecode.io/issues{/number}","pulls_url":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls{/number}","milestones_url":"https://api.github.com/repos/putaindecode/putaindecode.io/milestones{/number}","notifications_url":"https://api.github.com/repos/putaindecode/putaindecode.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/putaindecode/putaindecode.io/labels{/name}","releases_url":"https://api.github.com/repos/putaindecode/putaindecode.io/releases{/id}","deployments_url":"https://api.github.com/repos/putaindecode/putaindecode.io/deployments","created_at":"2013-05-27T17:08:41Z","updated_at":"2016-08-14T14:43:17Z","pushed_at":"2016-08-22T22:44:18Z","git_url":"git://github.com/putaindecode/putaindecode.io.git","ssh_url":"git@github.com:putaindecode/putaindecode.io.git","clone_url":"https://github.com/putaindecode/putaindecode.io.git","svn_url":"https://github.com/putaindecode/putaindecode.io","homepage":"http://putaindecode.io/","size":26191,"stargazers_count":137,"watchers_count":137,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":84,"mirror_url":null,"open_issues_count":63,"forks":84,"open_issues":63,"watchers":137,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681"},"html":{"href":"https://github.com/putaindecode/putaindecode.io/pull/681"},"issue":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/681"},"comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/issues/681/comments"},"review_comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681/comments"},"review_comment":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/pulls/681/commits"},"statuses":{"href":"https://api.github.com/repos/putaindecode/putaindecode.io/statuses/b21c592ad17c60ebb94c9947dc9a8c963e158d2b"}}}}
{"actor":{"display_login":"zoontek"}}