{"action":"created","comment":{"url":"https://api.github.com/repos/CanalTP/navitia/pulls/comments/109713972","pull_request_review_id":30824851,"id":109713972,"diff_hunk":"@@ -595,172 +51,97 @@ def call_kraken(self, request_type, request, instance, krakens_call):\n         logger = logging.getLogger(__name__)\n         logger.debug('datetime: %s', request['datetime'])\n \n-        # odt_stop_points is a set of stop_point.uri with is_zonal = true used to manage tad_zonal\n-        odt_stop_points = set()\n-\n-        # crowfly_stop_points is a set of stop_point.uri used to create a crowfly section.\n-        crowfly_stop_points = set()\n+        requested_dep_modes = {mode for mode, _ in krakens_call}\n+        requested_arr_modes = {mode for _, mode in krakens_call}\n+        res = []\n \n-        if not g.requested_origin:\n-            g.requested_origin = instance.georef.place(request['origin'])\n-            if not g.requested_origin:\n-                r = self._make_error_response(\"The entry point: {} is not valid\".format(request['origin']),\n-                                              response_pb2.Error.unknown_object)\n-                return [r]\n+        logger.debug('requesting from by uri: %s', request['origin'])\n+        logger.debug('requesting to by uri: %s', request['destination'])\n \n-        if not g.requested_destination:\n-            g.requested_destination = instance.georef.place(request['destination'])\n-            if not g.requested_destination:\n-                r = self._make_error_response(\"The entry point: {} is not valid\".format(request['destination']),\n-                                              response_pb2.Error.unknown_object)\n-                return [r]\n+        requested_orig = PlaceByUri(instance, request['origin'])\n+        requested_dest = PlaceByUri(instance, request['destination'])\n \n-        worker = AsyncWorker(instance, krakens_call, request)\n+        requested_orig_obj = requested_orig.wait_and_get()\n+        requested_dest_obj = requested_dest.wait_and_get()\n+        check_entry_point_or_raise(requested_orig_obj, request['origin'])\n+        check_entry_point_or_raise(requested_dest_obj, request['destination'])\n \n-        resp = []\n \n-        # Now we compute the direct path with all requested departure\n-        # mode their time will be used to initialized our PT calls and\n-        # to bound the fallback duration of the first section.\n+        direct_path_pool = DirectPathPool(instance)\n         direct_path_type = DirectPathType.DIRECT_NO_PT\n         fallback_extremity = PeriodExtremity(request['datetime'], request['clockwise'])\n-        futures = worker.get_direct_path_futures(g.fallback_direct_path_pool,\n-                                                 g.requested_origin,\n-                                                 g.requested_destination,\n-                                                 fallback_extremity,\n-                                                 direct_path_type,\n-                                                 {mode for mode, _ in krakens_call})\n-        for future in gevent.iwait(futures):\n-            resp_key, resp_direct_path = future.get()\n-            g.fallback_direct_path_pool[resp_key] = resp_direct_path\n-            if resp_direct_path.journeys:\n-                resp_direct_path.journeys[0].internal_id = str(generate_id())\n-                resp.append(resp_direct_path)\n-\n-        if request.get('max_duration', 0):\n-            direct_path_duration_by_mode = make_direct_path_duration_by_mode(g.fallback_direct_path_pool)\n-\n-            # Get all stop_points around the requested origin within a crowfly range\n-            # Calls on origins and destinations are asynchronous\n-            orig_futures, dest_futures = worker.get_crowfly_futures(g.requested_origin,\n-                                                                    g.requested_destination,\n-                                                                    direct_path_duration_by_mode)\n-            gevent.joinall(orig_futures + dest_futures)\n-            for future in orig_futures:\n-                g.origins_places_crowfly.update(future.get())\n-            for future in dest_futures:\n-                g.destinations_places_crowfly.update(future.get())\n-\n-            # Once we get crow fly stop points with origins and destinations, we start\n-            # the computation NM: the fallback matrix which contains the arrival duration for crowfly stop_points\n-            # from origin/destination\n-            # Ex:\n-            #                    stop_point1   stop_point2  stop_point3\n-            # request_origin_1     86400(s)      43200(s)     21600(s)\n-            # As a side note this won't work the day when our ETA will be impacted by the datetime of the journey,\n-            # at least for the arrival when doing a \"departure after\" request.\n-            orig_futures, dest_futures = worker.get_routing_matrix_futures(g.requested_origin,\n-                                                                           g.requested_destination,\n-                                                                           g.origins_places_crowfly,\n-                                                                           g.destinations_places_crowfly,\n-                                                                           direct_path_duration_by_mode)\n-            gevent.joinall(orig_futures + dest_futures)\n-            for future in orig_futures:\n-                g.origins_fallback.update(future.get())\n-            for future in dest_futures:\n-                g.destinations_fallback.update(future.get())\n-\n-            # In Some special cases, like \"odt\" or \"departure(arrive) from(to) a stop_area\",\n-            # the first(last) section should be treated differently\n-            orig_futures, dest_futures = worker.get_update_crowfly_duration_futures()\n-            gevent.joinall(orig_futures + dest_futures)\n-\n-            def _updater(_futures, fb, crowfly_stop_points, odt_stop_points):\n-                for f in _futures:\n-                    crowfly_res, odt_res, fb_res = f.get()\n-                    crowfly_stop_points |= crowfly_res\n-                    odt_stop_points |= odt_res\n-                    for mode in (mode for mode in fb_res if mode in fb):\n-                        fb.merge_reached_values(mode, fb_res[mode])\n-\n-            _updater(orig_futures, g.origins_fallback, crowfly_stop_points, odt_stop_points)\n-            _updater(dest_futures, g.destinations_fallback, crowfly_stop_points, odt_stop_points)\n \n-            # We update the fallback duration matrix if the requested origin/destination is also\n-            # present in the fallback duration matrix, which means from stop_point_1 to itself, it takes 0 second\n-            # Ex:\n-            #                stop_point1   stop_point2  stop_point3\n-            # stop_point_1         0(s)       ...          ...\n-            for dep_mode, arr_mode in krakens_call:\n-                g.origins_fallback.reset_if_exist(dep_mode, g.requested_origin.uri)\n-                g.destinations_fallback.reset_if_exist(arr_mode, g.requested_destination.uri)\n-\n-        # Here starts the computation for pt journey\n-        journey_parameters = create_parameters(request)\n-        futures = worker.get_pt_journey_futures(g.requested_origin, g.requested_destination,\n-                                                g.fallback_direct_path_pool, g.origins_fallback,\n-                                                g.destinations_fallback, journey_parameters)\n-\n-        response_tuples = []\n-        for future in gevent.iwait(futures):\n-            dep_mode, arr_mode, local_resp = future.get()\n-            if local_resp is None:\n-                continue\n-            direct_path_type = DirectPathType.DIRECT_NO_PT\n-            fallback_extremity = PeriodExtremity(request['datetime'], request['clockwise'])\n-            dp_key = make_direct_path_key(dep_mode, g.requested_origin.uri, g.requested_destination.uri,\n-                                          direct_path_type, fallback_extremity)\n-            direct_path = g.fallback_direct_path_pool.get(dp_key)\n-\n-            if local_resp.HasField(b\"error\") and local_resp.error.id == response_pb2.Error.error_id.Value('no_solution') \\\n-                    and direct_path.journeys:\n-                local_resp.ClearField(b\"error\")\n-            if local_resp.HasField(b\"error\"):\n-                #Here needs to modify error message of no_solution\n-                if len(g.origins_fallback[dep_mode]) == 0:\n-                    self.update_error_message(local_resp, response_pb2.Error.no_origin, \"no origin point\")\n-                elif len(g.destinations_fallback[arr_mode]) == 0:\n-                    self.update_error_message(local_resp, response_pb2.Error.no_destination, \"no destination point\")\n-\n-                return [local_resp]\n-\n-            # for log purpose we put and id in each journeys\n-            for j in local_resp.journeys:\n-                j.internal_id = str(generate_id())\n-                response_tuples.append((dep_mode, arr_mode, j))\n-            resp.append(local_resp)\n-\n-        # Once the pt journey is found, we need to reconstruct the whole journey with fallback regarding the mode\n-\n-        # For the sake of performance, we compute at first all fallback direct path asynchronously\n-        # then we update the pool of direct paths\n-        futures = worker.get_fallback_direct_path_futures(response_tuples, crowfly_stop_points, odt_stop_points)\n-        for future in gevent.iwait(futures):\n-            resp_key, resp_direct_path = future.get()\n-            g.fallback_direct_path_pool[resp_key] = resp_direct_path\n-\n-        # Now we construct the whole journey by concatenating the fallback direct path with the pt journey\n-        worker.build_journeys(response_tuples, crowfly_stop_points, odt_stop_points)\n-\n-        #If resp doesn't contain any response we have to add an error message\n-        if len(resp) == 0:\n-            if len(g.origins_fallback[dep_mode]) == 0 and len(g.destinations_fallback[arr_mode]) == 0:\n-                resp.append(self._make_error_response(\"no origin point nor destination point\",\n-                                                      response_pb2.Error.no_origin_nor_destination))\n-            elif len(g.origins_fallback[dep_mode]) == 0:\n-                resp.append(self._make_error_response(\"no origin point\", response_pb2.Error.no_origin))\n-            elif len(g.destinations_fallback[arr_mode]) == 0:\n-                resp.append(self._make_error_response(\"no destination point\", response_pb2.Error.no_destination))\n-            return resp\n-        for r in resp:\n+        #\n+        for mode in requested_dep_modes:\n+            direct_path_pool.add_async_request(requested_orig_obj, requested_dest_obj, mode,\n+                                               fallback_extremity, request, direct_path_type)\n+\n+        # if max_duration(time to pass in pt) is zero, there is no need to continue,\n+        # we return all direct path without pt\n+        if not request.get('max_duration', 0):\n+            for mode in requested_dep_modes:\n+                dp = direct_path_pool.wait_and_get(requested_orig_obj, requested_dest_obj, mode,\n+                                                   fallback_extremity, direct_path_type)\n+                res.append(dp)\n+            return res\n+\n+        orig_proximities_by_crowfly = ProximitiesByCrowflyPool(instance, requested_orig_obj, requested_dep_modes,","path":"source/jormungandr/jormungandr/scenarios/experimental.py","position":757,"original_position":757,"commit_id":"b4749680e25827d2bb8b75741200ba716f5411cd","original_commit_id":"b4749680e25827d2bb8b75741200ba716f5411cd","user":{"login":"pbougue","id":12812530,"avatar_url":"https://avatars2.githubusercontent.com/u/12812530?v=3","gravatar_id":"","url":"https://api.github.com/users/pbougue","html_url":"https://github.com/pbougue","followers_url":"https://api.github.com/users/pbougue/followers","following_url":"https://api.github.com/users/pbougue/following{/other_user}","gists_url":"https://api.github.com/users/pbougue/gists{/gist_id}","starred_url":"https://api.github.com/users/pbougue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pbougue/subscriptions","organizations_url":"https://api.github.com/users/pbougue/orgs","repos_url":"https://api.github.com/users/pbougue/repos","events_url":"https://api.github.com/users/pbougue/events{/privacy}","received_events_url":"https://api.github.com/users/pbougue/received_events","type":"User","site_admin":false},"body":":+1: nice naming (`proximities` is clearer than `isochrone` I had in mine before)","created_at":"2017-04-04T16:36:55Z","updated_at":"2017-04-04T16:44:16Z","html_url":"https://github.com/CanalTP/navitia/pull/2046#discussion_r109713972","pull_request_url":"https://api.github.com/repos/CanalTP/navitia/pulls/2046","_links":{"self":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/comments/109713972"},"html":{"href":"https://github.com/CanalTP/navitia/pull/2046#discussion_r109713972"},"pull_request":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/2046"}}},"pull_request":{"url":"https://api.github.com/repos/CanalTP/navitia/pulls/2046","id":114105495,"html_url":"https://github.com/CanalTP/navitia/pull/2046","diff_url":"https://github.com/CanalTP/navitia/pull/2046.diff","patch_url":"https://github.com/CanalTP/navitia/pull/2046.patch","issue_url":"https://api.github.com/repos/CanalTP/navitia/issues/2046","number":2046,"state":"open","locked":false,"title":"refacto experimental","user":{"login":"xlqian","id":6093486,"avatar_url":"https://avatars1.githubusercontent.com/u/6093486?v=3","gravatar_id":"","url":"https://api.github.com/users/xlqian","html_url":"https://github.com/xlqian","followers_url":"https://api.github.com/users/xlqian/followers","following_url":"https://api.github.com/users/xlqian/following{/other_user}","gists_url":"https://api.github.com/users/xlqian/gists{/gist_id}","starred_url":"https://api.github.com/users/xlqian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xlqian/subscriptions","organizations_url":"https://api.github.com/users/xlqian/orgs","repos_url":"https://api.github.com/users/xlqian/repos","events_url":"https://api.github.com/users/xlqian/events{/privacy}","received_events_url":"https://api.github.com/users/xlqian/received_events","type":"User","site_admin":false},"body":"Some suggestions for reviewers:\r\n\r\n* Start the review from [experimental.py](https://github.com/CanalTP/navitia/compare/dev...xlqian:refacto_experimental_2?expand=1#diff-d3158ff643c4c09574794a38d50aab98R31), this file is re-written entirely. I'm particularly interested in if this interface is understandable \r\n*  A [Future.py](https://github.com/CanalTP/navitia/compare/dev...xlqian:refacto_experimental_2?expand=1#diff-2b18eb68eb43c17c23184bbaad5ce1f3R1) is created to encapsulate the implementation of future\r\n* Performance benchmark is on route","created_at":"2017-04-04T09:30:25Z","updated_at":"2017-04-04T16:44:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4e9001890d22e8dfaee463d839659b6be688f5f7","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/CanalTP/navitia/pulls/2046/commits","review_comments_url":"https://api.github.com/repos/CanalTP/navitia/pulls/2046/comments","review_comment_url":"https://api.github.com/repos/CanalTP/navitia/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CanalTP/navitia/issues/2046/comments","statuses_url":"https://api.github.com/repos/CanalTP/navitia/statuses/b4749680e25827d2bb8b75741200ba716f5411cd","head":{"label":"xlqian:refacto_experimental_2","ref":"refacto_experimental_2","sha":"b4749680e25827d2bb8b75741200ba716f5411cd","user":{"login":"xlqian","id":6093486,"avatar_url":"https://avatars1.githubusercontent.com/u/6093486?v=3","gravatar_id":"","url":"https://api.github.com/users/xlqian","html_url":"https://github.com/xlqian","followers_url":"https://api.github.com/users/xlqian/followers","following_url":"https://api.github.com/users/xlqian/following{/other_user}","gists_url":"https://api.github.com/users/xlqian/gists{/gist_id}","starred_url":"https://api.github.com/users/xlqian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xlqian/subscriptions","organizations_url":"https://api.github.com/users/xlqian/orgs","repos_url":"https://api.github.com/users/xlqian/repos","events_url":"https://api.github.com/users/xlqian/events{/privacy}","received_events_url":"https://api.github.com/users/xlqian/received_events","type":"User","site_admin":false},"repo":{"id":38739156,"name":"navitia","full_name":"xlqian/navitia","owner":{"login":"xlqian","id":6093486,"avatar_url":"https://avatars1.githubusercontent.com/u/6093486?v=3","gravatar_id":"","url":"https://api.github.com/users/xlqian","html_url":"https://github.com/xlqian","followers_url":"https://api.github.com/users/xlqian/followers","following_url":"https://api.github.com/users/xlqian/following{/other_user}","gists_url":"https://api.github.com/users/xlqian/gists{/gist_id}","starred_url":"https://api.github.com/users/xlqian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xlqian/subscriptions","organizations_url":"https://api.github.com/users/xlqian/orgs","repos_url":"https://api.github.com/users/xlqian/repos","events_url":"https://api.github.com/users/xlqian/events{/privacy}","received_events_url":"https://api.github.com/users/xlqian/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xlqian/navitia","description":"The REST API to build cool stuff with public transport","fork":true,"url":"https://api.github.com/repos/xlqian/navitia","forks_url":"https://api.github.com/repos/xlqian/navitia/forks","keys_url":"https://api.github.com/repos/xlqian/navitia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xlqian/navitia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xlqian/navitia/teams","hooks_url":"https://api.github.com/repos/xlqian/navitia/hooks","issue_events_url":"https://api.github.com/repos/xlqian/navitia/issues/events{/number}","events_url":"https://api.github.com/repos/xlqian/navitia/events","assignees_url":"https://api.github.com/repos/xlqian/navitia/assignees{/user}","branches_url":"https://api.github.com/repos/xlqian/navitia/branches{/branch}","tags_url":"https://api.github.com/repos/xlqian/navitia/tags","blobs_url":"https://api.github.com/repos/xlqian/navitia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xlqian/navitia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xlqian/navitia/git/refs{/sha}","trees_url":"https://api.github.com/repos/xlqian/navitia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xlqian/navitia/statuses/{sha}","languages_url":"https://api.github.com/repos/xlqian/navitia/languages","stargazers_url":"https://api.github.com/repos/xlqian/navitia/stargazers","contributors_url":"https://api.github.com/repos/xlqian/navitia/contributors","subscribers_url":"https://api.github.com/repos/xlqian/navitia/subscribers","subscription_url":"https://api.github.com/repos/xlqian/navitia/subscription","commits_url":"https://api.github.com/repos/xlqian/navitia/commits{/sha}","git_commits_url":"https://api.github.com/repos/xlqian/navitia/git/commits{/sha}","comments_url":"https://api.github.com/repos/xlqian/navitia/comments{/number}","issue_comment_url":"https://api.github.com/repos/xlqian/navitia/issues/comments{/number}","contents_url":"https://api.github.com/repos/xlqian/navitia/contents/{+path}","compare_url":"https://api.github.com/repos/xlqian/navitia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xlqian/navitia/merges","archive_url":"https://api.github.com/repos/xlqian/navitia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xlqian/navitia/downloads","issues_url":"https://api.github.com/repos/xlqian/navitia/issues{/number}","pulls_url":"https://api.github.com/repos/xlqian/navitia/pulls{/number}","milestones_url":"https://api.github.com/repos/xlqian/navitia/milestones{/number}","notifications_url":"https://api.github.com/repos/xlqian/navitia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xlqian/navitia/labels{/name}","releases_url":"https://api.github.com/repos/xlqian/navitia/releases{/id}","deployments_url":"https://api.github.com/repos/xlqian/navitia/deployments","created_at":"2015-07-08T07:34:43Z","updated_at":"2016-01-12T14:11:40Z","pushed_at":"2017-04-04T14:22:05Z","git_url":"git://github.com/xlqian/navitia.git","ssh_url":"git@github.com:xlqian/navitia.git","clone_url":"https://github.com/xlqian/navitia.git","svn_url":"https://github.com/xlqian/navitia","homepage":"http://www.navitia.io","size":35596,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"CanalTP:dev","ref":"dev","sha":"2508581b88d55400c525bfce391051cc7f378958","user":{"login":"CanalTP","id":2743985,"avatar_url":"https://avatars1.githubusercontent.com/u/2743985?v=3","gravatar_id":"","url":"https://api.github.com/users/CanalTP","html_url":"https://github.com/CanalTP","followers_url":"https://api.github.com/users/CanalTP/followers","following_url":"https://api.github.com/users/CanalTP/following{/other_user}","gists_url":"https://api.github.com/users/CanalTP/gists{/gist_id}","starred_url":"https://api.github.com/users/CanalTP/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CanalTP/subscriptions","organizations_url":"https://api.github.com/users/CanalTP/orgs","repos_url":"https://api.github.com/users/CanalTP/repos","events_url":"https://api.github.com/users/CanalTP/events{/privacy}","received_events_url":"https://api.github.com/users/CanalTP/received_events","type":"Organization","site_admin":false},"repo":{"id":10797333,"name":"navitia","full_name":"CanalTP/navitia","owner":{"login":"CanalTP","id":2743985,"avatar_url":"https://avatars1.githubusercontent.com/u/2743985?v=3","gravatar_id":"","url":"https://api.github.com/users/CanalTP","html_url":"https://github.com/CanalTP","followers_url":"https://api.github.com/users/CanalTP/followers","following_url":"https://api.github.com/users/CanalTP/following{/other_user}","gists_url":"https://api.github.com/users/CanalTP/gists{/gist_id}","starred_url":"https://api.github.com/users/CanalTP/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CanalTP/subscriptions","organizations_url":"https://api.github.com/users/CanalTP/orgs","repos_url":"https://api.github.com/users/CanalTP/repos","events_url":"https://api.github.com/users/CanalTP/events{/privacy}","received_events_url":"https://api.github.com/users/CanalTP/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CanalTP/navitia","description":"The open source software to build cool stuff with locomotion","fork":false,"url":"https://api.github.com/repos/CanalTP/navitia","forks_url":"https://api.github.com/repos/CanalTP/navitia/forks","keys_url":"https://api.github.com/repos/CanalTP/navitia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CanalTP/navitia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CanalTP/navitia/teams","hooks_url":"https://api.github.com/repos/CanalTP/navitia/hooks","issue_events_url":"https://api.github.com/repos/CanalTP/navitia/issues/events{/number}","events_url":"https://api.github.com/repos/CanalTP/navitia/events","assignees_url":"https://api.github.com/repos/CanalTP/navitia/assignees{/user}","branches_url":"https://api.github.com/repos/CanalTP/navitia/branches{/branch}","tags_url":"https://api.github.com/repos/CanalTP/navitia/tags","blobs_url":"https://api.github.com/repos/CanalTP/navitia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CanalTP/navitia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CanalTP/navitia/git/refs{/sha}","trees_url":"https://api.github.com/repos/CanalTP/navitia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CanalTP/navitia/statuses/{sha}","languages_url":"https://api.github.com/repos/CanalTP/navitia/languages","stargazers_url":"https://api.github.com/repos/CanalTP/navitia/stargazers","contributors_url":"https://api.github.com/repos/CanalTP/navitia/contributors","subscribers_url":"https://api.github.com/repos/CanalTP/navitia/subscribers","subscription_url":"https://api.github.com/repos/CanalTP/navitia/subscription","commits_url":"https://api.github.com/repos/CanalTP/navitia/commits{/sha}","git_commits_url":"https://api.github.com/repos/CanalTP/navitia/git/commits{/sha}","comments_url":"https://api.github.com/repos/CanalTP/navitia/comments{/number}","issue_comment_url":"https://api.github.com/repos/CanalTP/navitia/issues/comments{/number}","contents_url":"https://api.github.com/repos/CanalTP/navitia/contents/{+path}","compare_url":"https://api.github.com/repos/CanalTP/navitia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CanalTP/navitia/merges","archive_url":"https://api.github.com/repos/CanalTP/navitia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CanalTP/navitia/downloads","issues_url":"https://api.github.com/repos/CanalTP/navitia/issues{/number}","pulls_url":"https://api.github.com/repos/CanalTP/navitia/pulls{/number}","milestones_url":"https://api.github.com/repos/CanalTP/navitia/milestones{/number}","notifications_url":"https://api.github.com/repos/CanalTP/navitia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CanalTP/navitia/labels{/name}","releases_url":"https://api.github.com/repos/CanalTP/navitia/releases{/id}","deployments_url":"https://api.github.com/repos/CanalTP/navitia/deployments","created_at":"2013-06-19T15:34:30Z","updated_at":"2017-04-04T01:00:47Z","pushed_at":"2017-04-04T14:22:07Z","git_url":"git://github.com/CanalTP/navitia.git","ssh_url":"git@github.com:CanalTP/navitia.git","clone_url":"https://github.com/CanalTP/navitia.git","svn_url":"https://github.com/CanalTP/navitia","homepage":"http://www.navitia.io","size":36349,"stargazers_count":206,"watchers_count":206,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":73,"mirror_url":null,"open_issues_count":32,"forks":73,"open_issues":32,"watchers":206,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/2046"},"html":{"href":"https://github.com/CanalTP/navitia/pull/2046"},"issue":{"href":"https://api.github.com/repos/CanalTP/navitia/issues/2046"},"comments":{"href":"https://api.github.com/repos/CanalTP/navitia/issues/2046/comments"},"review_comments":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/2046/comments"},"review_comment":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CanalTP/navitia/pulls/2046/commits"},"statuses":{"href":"https://api.github.com/repos/CanalTP/navitia/statuses/b4749680e25827d2bb8b75741200ba716f5411cd"}}}}
{"actor":{"display_login":"pbougue"}}