{"action":"created","comment":{"url":"https://api.github.com/repos/osmlab/atlas/pulls/comments/243457093","pull_request_review_id":187233483,"id":243457093,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MzQ1NzA5Mw==","diff_hunk":"@@ -0,0 +1,256 @@\n+package org.openstreetmap.atlas.utilities.command.subcommands;\n+\n+import java.nio.file.Path;\n+import java.nio.file.Paths;\n+import java.util.ArrayList;\n+import java.util.List;\n+import java.util.Optional;\n+\n+import org.openstreetmap.atlas.geography.Location;\n+import org.openstreetmap.atlas.geography.PolyLine;\n+import org.openstreetmap.atlas.geography.converters.jts.JtsPointConverter;\n+import org.openstreetmap.atlas.geography.converters.jts.JtsPolyLineConverter;\n+import org.openstreetmap.atlas.geography.converters.jts.JtsPolygonConverter;\n+import org.openstreetmap.atlas.geography.sharding.Shard;\n+import org.openstreetmap.atlas.geography.sharding.Sharding;\n+import org.openstreetmap.atlas.streaming.resource.File;\n+import org.openstreetmap.atlas.streaming.resource.StringResource;\n+import org.openstreetmap.atlas.utilities.command.AtlasShellToolsException;\n+import org.openstreetmap.atlas.utilities.command.abstractcommand.AbstractAtlasShellToolsCommand;\n+import org.openstreetmap.atlas.utilities.command.abstractcommand.CommandOutputDelegate;\n+import org.openstreetmap.atlas.utilities.command.abstractcommand.OptionAndArgumentFetcher;\n+import org.openstreetmap.atlas.utilities.command.parsing.ArgumentArity;\n+import org.openstreetmap.atlas.utilities.command.parsing.ArgumentOptionality;\n+import org.openstreetmap.atlas.utilities.command.terminal.TTYAttribute;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import com.vividsolutions.jts.geom.Geometry;\n+import com.vividsolutions.jts.geom.LineString;\n+import com.vividsolutions.jts.geom.Point;\n+import com.vividsolutions.jts.geom.Polygon;\n+import com.vividsolutions.jts.io.ParseException;\n+import com.vividsolutions.jts.io.WKTReader;\n+\n+/**\n+ * @author lcram\n+ */\n+public class WKTShardCommand extends AbstractAtlasShellToolsCommand\n+{\n+    private static final Logger logger = LoggerFactory.getLogger(WKTShardCommand.class);\n+\n+    private static final String DESCRIPTION_SECTION = \"WKTShardCommandDescriptionSection.txt\";\n+    private static final String EXAMPLES_SECTION = \"WKTShardCommandExamplesSection.txt\";\n+\n+    private static final String TREE_OPTION_LONG = \"tree\";\n+    private static final String TREE_OPTION_DESCRIPTION = \"The path to the dynamic sharding tree file. E.g. /Users/example/path/to/tree.txt\";\n+    private static final String TREE_OPTION_HINT = \"path\";\n+\n+    private static final String SLIPPY_OPTION_LONG = \"slippy\";\n+    private static final String SLIPPY_OPTION_DESCRIPTION = \"The slippy tile zoom level for the sharding.\";\n+    private static final String SLIPPY_OPTION_HINT = \"zoom\";\n+\n+    private static final String INPUT_FILE_OPTION_LONG = \"input\";\n+    private static final String INPUT_FILE_OPTION_DESCRIPTION = \"An input file from which to source the WKT entities. See DESCRIPTION section for details.\";\n+    private static final String INPUT_FILE_OPTION_HINT = \"file\";\n+\n+    private static final Integer TREE_CONTEXT = 3;\n+    private static final Integer SLIPPY_CONTEXT = 4;\n+\n+    private static final String INPUT_WKT = \"wkt\";\n+\n+    private final OptionAndArgumentFetcher fetcher;\n+    private final CommandOutputDelegate output;\n+\n+    public static void main(final String[] args)\n+    {\n+        new WKTShardCommand().runSubcommandAndExit(args);\n+    }\n+\n+    public WKTShardCommand()\n+    {\n+        this.fetcher = this.getOptionAndArgumentFetcher();\n+        this.output = this.getCommandOutputDelegate();\n+    }\n+\n+    @Override\n+    public int execute()\n+    {\n+        final List<String> inputWKT = new ArrayList<>();\n+        if (this.fetcher.hasOption(INPUT_FILE_OPTION_LONG))\n+        {\n+            inputWKT.addAll(\n+                    readWKTFromFile(this.fetcher.getOptionArgument(INPUT_FILE_OPTION_LONG)));\n+        }\n+        inputWKT.addAll(this.fetcher.getVariadicArgument(INPUT_WKT));\n+\n+        if (inputWKT.isEmpty())\n+        {\n+            this.output.printlnWarnMessage(\"no input WKTs were found\");\n+            return 0;\n+        }\n+\n+        final Sharding sharding;\n+        if (this.fetcher.getParserContext() == TREE_CONTEXT)\n+        {\n+            if (this.fetcher.hasOption(TREE_OPTION_LONG))\n+            {\n+                sharding = Sharding\n+                        .forString(\"dynamic@\" + this.fetcher.getOptionArgument(TREE_OPTION_LONG)\n+                                .orElseThrow(AtlasShellToolsException::new));\n+            }\n+            else\n+            {\n+                this.output.printlnErrorMessage(\"either --\" + TREE_OPTION_LONG + \" or --\"\n+                        + SLIPPY_OPTION_LONG + \" is required\");\n+                return 1;\n+            }\n+        }\n+        else if (this.fetcher.getParserContext() == SLIPPY_CONTEXT\n+                && this.fetcher.hasOption(SLIPPY_OPTION_LONG))\n+        {\n+            sharding = Sharding\n+                    .forString(\"slippy@\" + this.fetcher.getOptionArgument(SLIPPY_OPTION_LONG)\n+                            .orElseThrow(AtlasShellToolsException::new));\n+        }\n+        else\n+        {\n+            throw new AtlasShellToolsException();\n+        }\n+\n+        for (int i = 0; i < inputWKT.size(); i++)\n+        {\n+            final String wkt = inputWKT.get(i);\n+            parseWKTAndPrintOutput(wkt, sharding);\n+\n+            // Only print a separating newline if there were multiple entries\n+            if (i < inputWKT.size() - 1)\n+            {\n+                this.output.printlnStdout(\"\");\n+            }\n+        }\n+\n+        return 0;\n+    }\n+\n+    @Override\n+    public String getCommandName()\n+    {\n+        return \"wkt-shard\";\n+    }\n+\n+    @Override\n+    public String getSimpleDescription()\n+    {\n+        return \"get the shards that intersect some given WKT(s)\";\n+    }\n+\n+    @Override\n+    public void registerManualPageSections()\n+    {\n+        addManualPageSection(\"DESCRIPTION\",\n+                WKTShardCommand.class.getResourceAsStream(DESCRIPTION_SECTION));\n+        addManualPageSection(\"EXAMPLES\",\n+                WKTShardCommand.class.getResourceAsStream(EXAMPLES_SECTION));\n+    }\n+\n+    @Override\n+    public void registerOptionsAndArguments()\n+    {\n+        registerArgument(INPUT_WKT, ArgumentArity.VARIADIC, ArgumentOptionality.OPTIONAL,\n+                TREE_CONTEXT, SLIPPY_CONTEXT);\n+        registerOptionWithRequiredArgument(INPUT_FILE_OPTION_LONG, INPUT_FILE_OPTION_DESCRIPTION,\n+                INPUT_FILE_OPTION_HINT, TREE_CONTEXT, SLIPPY_CONTEXT);\n+        registerOptionWithRequiredArgument(TREE_OPTION_LONG, TREE_OPTION_DESCRIPTION,\n+                TREE_OPTION_HINT, TREE_CONTEXT);\n+        registerOptionWithRequiredArgument(SLIPPY_OPTION_LONG, SLIPPY_OPTION_DESCRIPTION,\n+                SLIPPY_OPTION_HINT, SLIPPY_CONTEXT);\n+    }\n+\n+    private void parseWKTAndPrintOutput(final String wkt, final Sharding sharding)\n+    {\n+        final WKTReader reader = new WKTReader();\n+        Geometry geometry = null;\n+        try\n+        {\n+            geometry = reader.read(wkt);\n+        }\n+        catch (final ParseException exception)\n+        {\n+            logger.error(\"unable to parse {}\", wkt, exception);\n+        }\n+\n+        if (geometry instanceof Point)\n+        {\n+            this.output.printlnStdout(wkt + \" covered by:\", TTYAttribute.BOLD);\n+            final Location location = new JtsPointConverter().backwardConvert((Point) geometry);\n+            final Iterable<? extends Shard> shards = sharding.shardsCovering(location);\n+            for (final Shard shard : shards)\n+            {\n+                this.output.printlnStdout(shard.toString(), TTYAttribute.GREEN);\n+            }\n+        }\n+        else if (geometry instanceof LineString)\n+        {\n+            this.output.printlnStdout(wkt + \" intersects:\", TTYAttribute.BOLD);\n+            final PolyLine polyline = new JtsPolyLineConverter()\n+                    .backwardConvert((LineString) geometry);\n+            final Iterable<? extends Shard> shards = sharding.shardsIntersecting(polyline);\n+            for (final Shard shard : shards)\n+            {\n+                this.output.printlnStdout(shard.toString(), TTYAttribute.GREEN);\n+            }\n+        }\n+        else if (geometry instanceof Polygon)\n+        {\n+            this.output.printlnStdout(wkt + \" intersects:\", TTYAttribute.BOLD);\n+            final org.openstreetmap.atlas.geography.Polygon polygon = new JtsPolygonConverter()\n+                    .backwardConvert((Polygon) geometry);\n+            final Iterable<? extends Shard> shards = sharding.shards(polygon);\n+            for (final Shard shard : shards)\n+            {\n+                this.output.printlnStdout(shard.toString(), TTYAttribute.GREEN);\n+            }\n+        }\n+        // TODO handle more geometry types? e.g. MultiPoint, MultiLineString, and MultiPolygon?","path":"src/main/java/org/openstreetmap/atlas/utilities/command/subcommands/WKTShardCommand.java","position":215,"original_position":215,"commit_id":"b937387fb2d7bdc059899006f3362551e015d643","original_commit_id":"b937387fb2d7bdc059899006f3362551e015d643","user":{"login":"sonarcloud[bot]","id":39514782,"node_id":"MDM6Qm90Mzk1MTQ3ODI=","avatar_url":"https://avatars2.githubusercontent.com/in/12526?v=4","gravatar_id":"","url":"https://api.github.com/users/sonarcloud%5Bbot%5D","html_url":"https://github.com/apps/sonarcloud","followers_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/followers","following_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/repos","events_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/received_events","type":"Bot","site_admin":false},"body":"![Code Smell](https://sonarsource.github.io/sonar-github/code_smell.png 'Code Smell') Code Smell: Complete the task associated to this TODO comment. ([squid:S1135](https://sonarcloud.io/organizations/osmlab/rules#rule_key=squid%3AS1135))\n\n[See it in SonarCloud](https://sonarcloud.io/project/issues?id=org.openstreetmap.atlas%3Aatlas&pullRequest=310&issues=AWfOEiveP9uNp_grIL8x&open=AWfOEiveP9uNp_grIL8x)\n\n[ISSUE_KEY]: AWfOEiveP9uNp_grIL8x","created_at":"2018-12-21T00:10:44Z","updated_at":"2018-12-21T00:10:45Z","html_url":"https://github.com/osmlab/atlas/pull/310#discussion_r243457093","pull_request_url":"https://api.github.com/repos/osmlab/atlas/pulls/310","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/comments/243457093"},"html":{"href":"https://github.com/osmlab/atlas/pull/310#discussion_r243457093"},"pull_request":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/310"}}},"pull_request":{"url":"https://api.github.com/repos/osmlab/atlas/pulls/310","id":239675856,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM5Njc1ODU2","html_url":"https://github.com/osmlab/atlas/pull/310","diff_url":"https://github.com/osmlab/atlas/pull/310.diff","patch_url":"https://github.com/osmlab/atlas/pull/310.patch","issue_url":"https://api.github.com/repos/osmlab/atlas/issues/310","number":310,"state":"open","locked":false,"title":"Initial, alpha version of a new atlas command line interface","user":{"login":"lucaspcram","id":8269882,"node_id":"MDQ6VXNlcjgyNjk4ODI=","avatar_url":"https://avatars0.githubusercontent.com/u/8269882?v=4","gravatar_id":"","url":"https://api.github.com/users/lucaspcram","html_url":"https://github.com/lucaspcram","followers_url":"https://api.github.com/users/lucaspcram/followers","following_url":"https://api.github.com/users/lucaspcram/following{/other_user}","gists_url":"https://api.github.com/users/lucaspcram/gists{/gist_id}","starred_url":"https://api.github.com/users/lucaspcram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucaspcram/subscriptions","organizations_url":"https://api.github.com/users/lucaspcram/orgs","repos_url":"https://api.github.com/users/lucaspcram/repos","events_url":"https://api.github.com/users/lucaspcram/events{/privacy}","received_events_url":"https://api.github.com/users/lucaspcram/received_events","type":"User","site_admin":false},"body":"### Description:\r\n\r\nThis new `atlas` command line interface is intended to be a one-stop-shop tool for all commands defined in `atlas` and its downstream projects.\r\n\r\nIt provides a new Java command API which is easy to use (see `AtlasShellToolsDemoCommand` for a quick example). The Java API generates `man` style documentation automatically for all commands (and allows command authors to add supplemental doc sections as needed).\r\n\r\nThe CLI consists of two perl programs, namely `atlas` and `atlas-config`. `atlas` is the gateway to run all your commands, and `atlas-config` allows you to customize the installation, change the active module (which is just a shaded jar containing commands), configure the `log4j` settings, save option presets, manage repos, and more.\r\n\r\nIf you would like to install a dev version based on my `atlas` fork, please contact me for a special installation script. I am happy to answer any questions, as I understand there are a lot of new concepts here.\r\n\r\nAlso I apologize for the sheer size of this PR. In hindsight it would have been better for this to be more piecemeal. Please don't feel pressured to understand everything right away. This is only a pre-pre-alpha version, and I am sure we will find lots of bugs to fix and behaviours to tweak.\r\n\r\n### Quick Guide to Changes\r\n\r\nHere are some particularly important files to check out. Please search for them in the `Files Changed` section of this PR.\r\n\r\n1) `AbstractAtlasShellToolsCommand` - the main abstract class all commands should `extend`. This is analogous to the current `Command` class, or the `Flexible(Sub)Command` class/interface.\r\n2) `SimpleOptionAndArgumentParser(Test)` - the new option and argument parser, used by commands to get options and args from the command line. Its unit tests show how it works.\r\n3) `DocumentationFormatter` - this class generates the documentation for each command\r\n4) `AtlasShellToolsDemoCommand` - a command that demos the command API\r\n5) `PackedToTextAtlasCommand` - a command that converts a packed to text atlas\r\n6) `WKTShardCommand` - a command that takes a sharding and some WKT strings, and spits out the shards intersecting the given WKT\r\n7) `atlas-shell-tools/scripts/atlas` - the `perl` program that launches commands. Use the `--debug` option to see what it is actually doing under the hood\r\n8) `atlas-shell-tools/scripts/atlas-config` - the `perl` program to manage the `atlas-shell-tools` installation parameters\r\n9) `atlas-shell-tools/scripts/common/*` - perl modules that contain all the subsystem code used by `atlas` and `atlas-config`. Subsystems include the preset subsystem, the module subsystem, the repo subsystem, TTY interfacing, and the \\<TAB\\> auto-completion subsystem.\r\n\r\n### Potential Impact:\r\n\r\nNo impact. All current subcommand code is untouched. This is intended to supplement, and eventually replace, the current subcommand code.\r\n\r\n### Unit Test Approach:\r\n\r\nExtensive unit testing of the option parsing code has been included. For documentation formatting, testing consisted of lots of visual inspection, since the formatting depends on a given TTY environment. The perl infrastructure has also been tested heavily thru lots of usage.\r\n\r\n### Test Results:\r\n\r\nUnit tests are passing, and preliminary usage testing seems OK. However, I feel this is not enough. Ideas on how to test the full integration would be appreciated. It may be necessary to run installations in some kind of VM/container, and then assert that the VM filesystem is in a consistent, expected state after each test operation.\r\n\r\n------\r\n\r\nIn doubt: [Contributing Guidelines](CONTRIBUTING.md)","created_at":"2018-12-19T00:27:03Z","updated_at":"2018-12-21T00:10:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a4de82dde709c4ca836f1cc6c054822eef36eecf","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":664543820,"node_id":"MDU6TGFiZWw2NjQ1NDM4MjA=","url":"https://api.github.com/repos/osmlab/atlas/labels/New%20Feature","name":"New Feature","color":"128A0C","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/osmlab/atlas/pulls/310/commits","review_comments_url":"https://api.github.com/repos/osmlab/atlas/pulls/310/comments","review_comment_url":"https://api.github.com/repos/osmlab/atlas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/osmlab/atlas/issues/310/comments","statuses_url":"https://api.github.com/repos/osmlab/atlas/statuses/b937387fb2d7bdc059899006f3362551e015d643","head":{"label":"lucaspcram:ast","ref":"ast","sha":"b937387fb2d7bdc059899006f3362551e015d643","user":{"login":"lucaspcram","id":8269882,"node_id":"MDQ6VXNlcjgyNjk4ODI=","avatar_url":"https://avatars0.githubusercontent.com/u/8269882?v=4","gravatar_id":"","url":"https://api.github.com/users/lucaspcram","html_url":"https://github.com/lucaspcram","followers_url":"https://api.github.com/users/lucaspcram/followers","following_url":"https://api.github.com/users/lucaspcram/following{/other_user}","gists_url":"https://api.github.com/users/lucaspcram/gists{/gist_id}","starred_url":"https://api.github.com/users/lucaspcram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucaspcram/subscriptions","organizations_url":"https://api.github.com/users/lucaspcram/orgs","repos_url":"https://api.github.com/users/lucaspcram/repos","events_url":"https://api.github.com/users/lucaspcram/events{/privacy}","received_events_url":"https://api.github.com/users/lucaspcram/received_events","type":"User","site_admin":false},"repo":{"id":127447366,"node_id":"MDEwOlJlcG9zaXRvcnkxMjc0NDczNjY=","name":"atlas","full_name":"lucaspcram/atlas","private":false,"owner":{"login":"lucaspcram","id":8269882,"node_id":"MDQ6VXNlcjgyNjk4ODI=","avatar_url":"https://avatars0.githubusercontent.com/u/8269882?v=4","gravatar_id":"","url":"https://api.github.com/users/lucaspcram","html_url":"https://github.com/lucaspcram","followers_url":"https://api.github.com/users/lucaspcram/followers","following_url":"https://api.github.com/users/lucaspcram/following{/other_user}","gists_url":"https://api.github.com/users/lucaspcram/gists{/gist_id}","starred_url":"https://api.github.com/users/lucaspcram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lucaspcram/subscriptions","organizations_url":"https://api.github.com/users/lucaspcram/orgs","repos_url":"https://api.github.com/users/lucaspcram/repos","events_url":"https://api.github.com/users/lucaspcram/events{/privacy}","received_events_url":"https://api.github.com/users/lucaspcram/received_events","type":"User","site_admin":false},"html_url":"https://github.com/lucaspcram/atlas","description":"OSM in memory","fork":true,"url":"https://api.github.com/repos/lucaspcram/atlas","forks_url":"https://api.github.com/repos/lucaspcram/atlas/forks","keys_url":"https://api.github.com/repos/lucaspcram/atlas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lucaspcram/atlas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lucaspcram/atlas/teams","hooks_url":"https://api.github.com/repos/lucaspcram/atlas/hooks","issue_events_url":"https://api.github.com/repos/lucaspcram/atlas/issues/events{/number}","events_url":"https://api.github.com/repos/lucaspcram/atlas/events","assignees_url":"https://api.github.com/repos/lucaspcram/atlas/assignees{/user}","branches_url":"https://api.github.com/repos/lucaspcram/atlas/branches{/branch}","tags_url":"https://api.github.com/repos/lucaspcram/atlas/tags","blobs_url":"https://api.github.com/repos/lucaspcram/atlas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lucaspcram/atlas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lucaspcram/atlas/git/refs{/sha}","trees_url":"https://api.github.com/repos/lucaspcram/atlas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lucaspcram/atlas/statuses/{sha}","languages_url":"https://api.github.com/repos/lucaspcram/atlas/languages","stargazers_url":"https://api.github.com/repos/lucaspcram/atlas/stargazers","contributors_url":"https://api.github.com/repos/lucaspcram/atlas/contributors","subscribers_url":"https://api.github.com/repos/lucaspcram/atlas/subscribers","subscription_url":"https://api.github.com/repos/lucaspcram/atlas/subscription","commits_url":"https://api.github.com/repos/lucaspcram/atlas/commits{/sha}","git_commits_url":"https://api.github.com/repos/lucaspcram/atlas/git/commits{/sha}","comments_url":"https://api.github.com/repos/lucaspcram/atlas/comments{/number}","issue_comment_url":"https://api.github.com/repos/lucaspcram/atlas/issues/comments{/number}","contents_url":"https://api.github.com/repos/lucaspcram/atlas/contents/{+path}","compare_url":"https://api.github.com/repos/lucaspcram/atlas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lucaspcram/atlas/merges","archive_url":"https://api.github.com/repos/lucaspcram/atlas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lucaspcram/atlas/downloads","issues_url":"https://api.github.com/repos/lucaspcram/atlas/issues{/number}","pulls_url":"https://api.github.com/repos/lucaspcram/atlas/pulls{/number}","milestones_url":"https://api.github.com/repos/lucaspcram/atlas/milestones{/number}","notifications_url":"https://api.github.com/repos/lucaspcram/atlas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lucaspcram/atlas/labels{/name}","releases_url":"https://api.github.com/repos/lucaspcram/atlas/releases{/id}","deployments_url":"https://api.github.com/repos/lucaspcram/atlas/deployments","created_at":"2018-03-30T16:07:04Z","updated_at":"2018-12-12T21:51:53Z","pushed_at":"2018-12-21T00:01:54Z","git_url":"git://github.com/lucaspcram/atlas.git","ssh_url":"git@github.com:lucaspcram/atlas.git","clone_url":"https://github.com/lucaspcram/atlas.git","svn_url":"https://github.com/lucaspcram/atlas","homepage":null,"size":58383,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"osmlab:dev","ref":"dev","sha":"4fc21b5b68e1108675b78749c3b604d7e64c9068","user":{"login":"osmlab","id":3856374,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM4NTYzNzQ=","avatar_url":"https://avatars3.githubusercontent.com/u/3856374?v=4","gravatar_id":"","url":"https://api.github.com/users/osmlab","html_url":"https://github.com/osmlab","followers_url":"https://api.github.com/users/osmlab/followers","following_url":"https://api.github.com/users/osmlab/following{/other_user}","gists_url":"https://api.github.com/users/osmlab/gists{/gist_id}","starred_url":"https://api.github.com/users/osmlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/osmlab/subscriptions","organizations_url":"https://api.github.com/users/osmlab/orgs","repos_url":"https://api.github.com/users/osmlab/repos","events_url":"https://api.github.com/users/osmlab/events{/privacy}","received_events_url":"https://api.github.com/users/osmlab/received_events","type":"Organization","site_admin":false},"repo":{"id":99717758,"node_id":"MDEwOlJlcG9zaXRvcnk5OTcxNzc1OA==","name":"atlas","full_name":"osmlab/atlas","private":false,"owner":{"login":"osmlab","id":3856374,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM4NTYzNzQ=","avatar_url":"https://avatars3.githubusercontent.com/u/3856374?v=4","gravatar_id":"","url":"https://api.github.com/users/osmlab","html_url":"https://github.com/osmlab","followers_url":"https://api.github.com/users/osmlab/followers","following_url":"https://api.github.com/users/osmlab/following{/other_user}","gists_url":"https://api.github.com/users/osmlab/gists{/gist_id}","starred_url":"https://api.github.com/users/osmlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/osmlab/subscriptions","organizations_url":"https://api.github.com/users/osmlab/orgs","repos_url":"https://api.github.com/users/osmlab/repos","events_url":"https://api.github.com/users/osmlab/events{/privacy}","received_events_url":"https://api.github.com/users/osmlab/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/osmlab/atlas","description":"OSM in memory","fork":false,"url":"https://api.github.com/repos/osmlab/atlas","forks_url":"https://api.github.com/repos/osmlab/atlas/forks","keys_url":"https://api.github.com/repos/osmlab/atlas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/osmlab/atlas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/osmlab/atlas/teams","hooks_url":"https://api.github.com/repos/osmlab/atlas/hooks","issue_events_url":"https://api.github.com/repos/osmlab/atlas/issues/events{/number}","events_url":"https://api.github.com/repos/osmlab/atlas/events","assignees_url":"https://api.github.com/repos/osmlab/atlas/assignees{/user}","branches_url":"https://api.github.com/repos/osmlab/atlas/branches{/branch}","tags_url":"https://api.github.com/repos/osmlab/atlas/tags","blobs_url":"https://api.github.com/repos/osmlab/atlas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/osmlab/atlas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/osmlab/atlas/git/refs{/sha}","trees_url":"https://api.github.com/repos/osmlab/atlas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/osmlab/atlas/statuses/{sha}","languages_url":"https://api.github.com/repos/osmlab/atlas/languages","stargazers_url":"https://api.github.com/repos/osmlab/atlas/stargazers","contributors_url":"https://api.github.com/repos/osmlab/atlas/contributors","subscribers_url":"https://api.github.com/repos/osmlab/atlas/subscribers","subscription_url":"https://api.github.com/repos/osmlab/atlas/subscription","commits_url":"https://api.github.com/repos/osmlab/atlas/commits{/sha}","git_commits_url":"https://api.github.com/repos/osmlab/atlas/git/commits{/sha}","comments_url":"https://api.github.com/repos/osmlab/atlas/comments{/number}","issue_comment_url":"https://api.github.com/repos/osmlab/atlas/issues/comments{/number}","contents_url":"https://api.github.com/repos/osmlab/atlas/contents/{+path}","compare_url":"https://api.github.com/repos/osmlab/atlas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/osmlab/atlas/merges","archive_url":"https://api.github.com/repos/osmlab/atlas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/osmlab/atlas/downloads","issues_url":"https://api.github.com/repos/osmlab/atlas/issues{/number}","pulls_url":"https://api.github.com/repos/osmlab/atlas/pulls{/number}","milestones_url":"https://api.github.com/repos/osmlab/atlas/milestones{/number}","notifications_url":"https://api.github.com/repos/osmlab/atlas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/osmlab/atlas/labels{/name}","releases_url":"https://api.github.com/repos/osmlab/atlas/releases{/id}","deployments_url":"https://api.github.com/repos/osmlab/atlas/deployments","created_at":"2017-08-08T17:14:27Z","updated_at":"2018-12-19T22:52:28Z","pushed_at":"2018-12-21T00:01:56Z","git_url":"git://github.com/osmlab/atlas.git","ssh_url":"git@github.com:osmlab/atlas.git","clone_url":"https://github.com/osmlab/atlas.git","svn_url":"https://github.com/osmlab/atlas","homepage":null,"size":57929,"stargazers_count":96,"watchers_count":96,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":38,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":38,"open_issues":14,"watchers":96,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/310"},"html":{"href":"https://github.com/osmlab/atlas/pull/310"},"issue":{"href":"https://api.github.com/repos/osmlab/atlas/issues/310"},"comments":{"href":"https://api.github.com/repos/osmlab/atlas/issues/310/comments"},"review_comments":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/310/comments"},"review_comment":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/310/commits"},"statuses":{"href":"https://api.github.com/repos/osmlab/atlas/statuses/b937387fb2d7bdc059899006f3362551e015d643"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"sonarcloud"}}