{"action":"created","comment":{"url":"https://api.github.com/repos/INRIA/spoon/pulls/comments/139625671","pull_request_review_id":63582051,"id":139625671,"diff_hunk":"@@ -0,0 +1,348 @@\n+/**\n+ * Copyright (C) 2006-2017 INRIA and contributors\n+ * Spoon - http://spoon.gforge.inria.fr/\n+ *\n+ * This software is governed by the CeCILL-C License under French law and\n+ * abiding by the rules of distribution of free software. You can use, modify\n+ * and/or redistribute the software under the terms of the CeCILL-C license as\n+ * circulated by CEA, CNRS and INRIA at http://www.cecill.info.\n+ *\n+ * This program is distributed in the hope that it will be useful, but WITHOUT\n+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n+ * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.\n+ *\n+ * The fact that you are presently reading this means that you have had\n+ * knowledge of the CeCILL-C license and that you accept its terms.\n+ */\n+package spoon;\n+\n+import org.apache.maven.model.Build;\n+import org.apache.maven.model.Dependency;\n+import org.apache.maven.model.Model;\n+import org.apache.maven.model.Parent;\n+import org.apache.maven.model.Plugin;\n+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;\n+import org.codehaus.plexus.util.xml.Xpp3Dom;\n+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;\n+\n+import java.io.File;\n+import java.io.FileReader;\n+import java.io.IOException;\n+import java.nio.file.Path;\n+import java.nio.file.Paths;\n+import java.util.ArrayList;\n+import java.util.HashSet;\n+import java.util.List;\n+import java.util.Set;\n+\n+/**\n+ * Create a Spoon launcher from a maven pom file\n+ */\n+public class MavenLauncher extends Launcher {\n+\tprivate String m2RepositoryPath;\n+\n+\t/**\n+\t * The type of source to consider in the model\n+\t */\n+\tpublic enum SOURCE_TYPE {\n+\t\t// only the main code of the application\n+\t\tAPP_SOURCE,\n+\t\t// only the tests of the application\n+\t\tTEST_SOURCE,\n+\t\t// all the sources\n+\t\tALL_SOURCE\n+\t}\n+\n+\tpublic MavenLauncher(String pomPatch, SOURCE_TYPE sourceType) {\n+\t\tthis(pomPatch, Paths.get(System.getProperty(\"user.home\"), \".m2\", \"repository\").toString(), sourceType);\n+\t}\n+\n+\t/**\n+\t *\n+\t * @param projectRoot the path to the root of the project (the folder that contains the pom)\n+\t * @param m2RepositoryPath the path to the m2repository\n+\t */\n+\tpublic MavenLauncher(String projectRoot, String m2RepositoryPath, SOURCE_TYPE sourceType) {\n+\t\tthis.m2RepositoryPath = m2RepositoryPath;\n+\n+\t\tif (!new File(projectRoot).isDirectory()) {\n+\t\t\tthrow new SpoonException(projectRoot + \" has to be the root folder of the project the folder that contains the pom).\");\n+\t\t}\n+\n+\t\tInheritanceModel model;\n+\t\ttry {\n+\t\t\tmodel = readPOM(projectRoot, null);\n+\t\t} catch (Exception e) {\n+\t\t\tthrow new SpoonException(\"Unable to read the pom\", e);\n+\t\t}\n+\t\tif (model == null) {\n+\t\t\tthrow new SpoonException(\"Unable to create the model, pom not found?\");\n+\t\t}\n+\n+\t\t// app source\n+\t\tif (SOURCE_TYPE.APP_SOURCE == sourceType || SOURCE_TYPE.ALL_SOURCE == sourceType) {\n+\t\t\tList<File> sourceDirectories = model.getSourceDirectories();\n+\t\t\tfor (File sourceDirectory : sourceDirectories) {\n+\t\t\t\tthis.addInputResource(sourceDirectory.getAbsolutePath());\n+\t\t\t}\n+\t\t}\n+\n+\t\t// test source\n+\t\tif (SOURCE_TYPE.TEST_SOURCE == sourceType || SOURCE_TYPE.ALL_SOURCE == sourceType) {\n+\t\t\tList<File> testSourceDirectories = model.getTestDirectories();\n+\t\t\tfor (File sourceDirectory : testSourceDirectories) {\n+\t\t\t\tthis.addInputResource(sourceDirectory.getAbsolutePath());\n+\t\t\t}\n+\t\t}\n+\n+\t\t// dependencies\n+\t\tList<File> dependencies = model.getDependencies();\n+\t\tString[] classpath = new String[dependencies.size()];\n+\t\tfor (int i = 0; i < dependencies.size(); i++) {\n+\t\t\tFile file = dependencies.get(i);\n+\t\t\tclasspath[i] = file.getAbsolutePath();\n+\t\t}\n+\t\tthis.getModelBuilder().setSourceClasspath(classpath);\n+\n+\t\t// compliance level\n+\t\tthis.getEnvironment().setComplianceLevel(model.getSourceVersion());\n+\t}\n+\n+\t/**\n+\t * Extract the information from the pom\n+\t * @param path the path to the pom\n+\t * @param parent the parent pom\n+\t * @return the extracted model\n+\t * @throws IOException when the file does not exist\n+\t * @throws XmlPullParserException when the file is corrupted\n+\t */\n+\tprivate InheritanceModel readPOM(String path, InheritanceModel parent) throws IOException, XmlPullParserException {\n+\t\tFile pomFile = Paths.get(path, \"pom.xml\").toFile();\n+\t\tif (!pomFile.exists()) {\n+\t\t\treturn null;\n+\t\t}\n+\t\tMavenXpp3Reader pomReader = new MavenXpp3Reader();\n+\t\tModel model = pomReader.read(new FileReader(pomFile));\n+\t\tInheritanceModel inheritanceModel = new InheritanceModel(model, parent, new File(path));\n+\t\tfor (String module : model.getModules()) {\n+\t\t\tinheritanceModel.addModule(readPOM(Paths.get(path, module).toString(), inheritanceModel));\n+\t\t}\n+\t\treturn inheritanceModel;\n+\t}\n+\n+\tclass InheritanceModel {\n+\t\tprivate List<InheritanceModel> modules = new ArrayList<>();\n+\t\tprivate Model model;\n+\t\tprivate InheritanceModel parent;\n+\t\tprivate File directory;\n+\n+\t\tInheritanceModel(Model model, InheritanceModel parent, File directory) {\n+\t\t\tthis.model = model;\n+\t\t\tthis.parent = parent;\n+\t\t\tthis.directory = directory;\n+\t\t}\n+\n+\t\tpublic void addModule(InheritanceModel module) {\n+\t\t\tmodules.add(module);\n+\t\t}\n+\n+\t\tpublic Model getModel() {\n+\t\t\treturn model;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the parent model\n+\t\t * @return the parent model\n+\t\t */\n+\t\tpublic InheritanceModel getParent() {\n+\t\t\treturn parent;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the list of source directories of the project\n+\t\t * @return the list of source directories\n+\t\t */\n+\t\tpublic List<File> getSourceDirectories() {\n+\t\t\tList<File> output = new ArrayList<>();\n+\t\t\tString sourcePath = null;\n+\n+\t\t\tBuild build = model.getBuild();\n+\t\t\tif (build != null) {\n+\t\t\t\tsourcePath = build.getSourceDirectory();\n+\t\t\t}\n+\t\t\tif (sourcePath == null) {\n+\t\t\t\tsourcePath = Paths.get(directory.getAbsolutePath(), \"src\", \"main\", \"java\").toString();\n+\t\t\t}\n+\t\t\tFile source = new File(sourcePath);\n+\t\t\tif (source.exists()) {\n+\t\t\t\toutput.add(source);\n+\t\t\t}\n+\t\t\tFile generatedSource = Paths.get(directory.getAbsolutePath(), \"target\", \"generated-sources\").toFile();\n+\t\t\tif (generatedSource.exists()) {\n+\t\t\t\toutput.add(generatedSource);\n+\t\t\t}\n+\t\t\tfor (InheritanceModel module : modules) {\n+\t\t\t\toutput.addAll(module.getSourceDirectories());\n+\t\t\t}\n+\t\t\treturn output;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the list of test directories of the project\n+\t\t * @return the list of test directories\n+\t\t */\n+\t\tpublic List<File> getTestDirectories() {\n+\t\t\tList<File> output = new ArrayList<>();\n+\t\t\tString sourcePath = null;\n+\n+\t\t\tBuild build = model.getBuild();\n+\t\t\tif (build != null) {\n+\t\t\t\tsourcePath = build.getTestSourceDirectory();\n+\t\t\t}\n+\t\t\tif (sourcePath == null) {\n+\t\t\t\tsourcePath = Paths.get(directory.getAbsolutePath(), \"src\", \"test\", \"java\").toString();\n+\t\t\t}\n+\t\t\tFile source = new File(sourcePath);\n+\t\t\tif (source.exists()) {\n+\t\t\t\toutput.add(source);\n+\t\t\t}\n+\t\t\tFile generatedSource = Paths.get(directory.getAbsolutePath(), \"target\", \"generated-test-sources\").toFile();\n+\t\t\tif (generatedSource.exists()) {\n+\t\t\t\toutput.add(generatedSource);\n+\t\t\t}\n+\t\t\tfor (InheritanceModel module : modules) {\n+\t\t\t\toutput.addAll(module.getTestDirectories());\n+\t\t\t}\n+\t\t\treturn output;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Extract the variable from a string\n+\t\t */\n+\t\tprivate String extractVariable(String value) {\n+\t\t\tif (value.startsWith(\"$\")) {\n+\t\t\t\tvalue = getProperty(value.substring(2, value.length() - 1));\n+\t\t\t}\n+\t\t\treturn value;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the list of dependencies available in the local maven repository\n+\t\t * @return the list of  dependencies\n+\t\t */\n+\t\tpublic List<File> getDependencies() {\n+\t\t\tSet<File> output = new HashSet<>();\n+\n+\t\t\t// add the parent has a dependency\n+\t\t\tParent parent = model.getParent();\n+\t\t\tif (parent != null) {\n+\t\t\t\tString groupId = parent.getGroupId().replace(\".\", \"/\");\n+\t\t\t\tString version = extractVariable(parent.getVersion());\n+\t\t\t\tString fileName = parent.getArtifactId() + \"-\" + version + \".jar\";\n+\t\t\t\tPath depPath = Paths.get(m2RepositoryPath, groupId, parent.getArtifactId(), version, fileName);\n+\t\t\t\tFile jar = depPath.toFile();\n+\t\t\t\tif (jar.exists()) {\n+\t\t\t\t\toutput.add(jar);\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tList<Dependency> dependencies = model.getDependencies();\n+\t\t\tfor (Dependency dependency : dependencies) {\n+\t\t\t\tString groupId = dependency.getGroupId().replace(\".\", \"/\");\n+\t\t\t\tString version = extractVariable(dependency.getVersion());\n+\t\t\t\tString fileName = dependency.getArtifactId() + \"-\" + version + \".jar\";\n+\t\t\t\t// TODO: Check the scope of the dependency (local dependency is not handled)\n+\t\t\t\tPath depPath = Paths.get(m2RepositoryPath, groupId, dependency.getArtifactId(), version, fileName);\n+\t\t\t\tFile jar = depPath.toFile();\n+\t\t\t\tif (jar.exists()) {\n+\t\t\t\t\toutput.add(jar);\n+\t\t\t\t} else {\n+\t\t\t\t\t// if the a dependency is not found, uses the no classpath mode\n+\t\t\t\t\tgetEnvironment().setNoClasspath(true);\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tfor (InheritanceModel module : modules) {\n+\t\t\t\toutput.addAll(module.getDependencies());\n+\t\t\t}\n+\t\t\treturn new ArrayList<>(output);\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the value of a property\n+\t\t * @param key the key of the property\n+\t\t * @return the property value if key exists or null\n+\t\t */\n+\t\tprivate String getProperty(String key) {\n+\t\t\tif (\"project.version\".equals(key)) {\n+\t\t\t\tif (model.getVersion() != null) {\n+\t\t\t\t\treturn model.getVersion();\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tString value = model.getProperties().getProperty(key);\n+\t\t\tif (value == null) {\n+\t\t\t\tif (parent == null) {\n+\t\t\t\t\treturn null;\n+\t\t\t\t}\n+\t\t\t\treturn parent.getProperty(key);\n+\t\t\t}\n+\t\t\treturn value;\n+\t\t}\n+\n+\t\t/**\n+\t\t * Get the source version of the project (default 7)","path":"src/main/java/spoon/MavenLauncher.java","position":292,"original_position":292,"commit_id":"b0badf885b3cf17b25674a906c72e52b1dbdb51f","original_commit_id":"f3a15395c3c2fdc11b4bbd1783fd585a449d5f82","user":{"login":"surli","id":1478232,"avatar_url":"https://avatars2.githubusercontent.com/u/1478232?v=4","gravatar_id":"","url":"https://api.github.com/users/surli","html_url":"https://github.com/surli","followers_url":"https://api.github.com/users/surli/followers","following_url":"https://api.github.com/users/surli/following{/other_user}","gists_url":"https://api.github.com/users/surli/gists{/gist_id}","starred_url":"https://api.github.com/users/surli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/surli/subscriptions","organizations_url":"https://api.github.com/users/surli/orgs","repos_url":"https://api.github.com/users/surli/repos","events_url":"https://api.github.com/users/surli/events{/privacy}","received_events_url":"https://api.github.com/users/surli/received_events","type":"User","site_admin":false},"body":"And then do we have a constant value for this default compliance level? ","created_at":"2017-09-19T08:22:10Z","updated_at":"2017-09-19T08:22:10Z","html_url":"https://github.com/INRIA/spoon/pull/1533#discussion_r139625671","pull_request_url":"https://api.github.com/repos/INRIA/spoon/pulls/1533","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/comments/139625671"},"html":{"href":"https://github.com/INRIA/spoon/pull/1533#discussion_r139625671"},"pull_request":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/1533"}},"in_reply_to_id":139623743},"pull_request":{"url":"https://api.github.com/repos/INRIA/spoon/pulls/1533","id":141274594,"html_url":"https://github.com/INRIA/spoon/pull/1533","diff_url":"https://github.com/INRIA/spoon/pull/1533.diff","patch_url":"https://github.com/INRIA/spoon/pull/1533.patch","issue_url":"https://api.github.com/repos/INRIA/spoon/issues/1533","number":1533,"state":"open","locked":false,"title":"feat(maven): create a launcher from a maven pom","user":{"login":"tdurieux","id":5577568,"avatar_url":"https://avatars2.githubusercontent.com/u/5577568?v=4","gravatar_id":"","url":"https://api.github.com/users/tdurieux","html_url":"https://github.com/tdurieux","followers_url":"https://api.github.com/users/tdurieux/followers","following_url":"https://api.github.com/users/tdurieux/following{/other_user}","gists_url":"https://api.github.com/users/tdurieux/gists{/gist_id}","starred_url":"https://api.github.com/users/tdurieux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdurieux/subscriptions","organizations_url":"https://api.github.com/users/tdurieux/orgs","repos_url":"https://api.github.com/users/tdurieux/repos","events_url":"https://api.github.com/users/tdurieux/events{/privacy}","received_events_url":"https://api.github.com/users/tdurieux/received_events","type":"User","site_admin":false},"body":"fix #1396","created_at":"2017-09-15T10:06:54Z","updated_at":"2017-09-19T08:22:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d9900b604ea2e54aad0f95ffc1021b1e59848c5c","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/INRIA/spoon/pulls/1533/commits","review_comments_url":"https://api.github.com/repos/INRIA/spoon/pulls/1533/comments","review_comment_url":"https://api.github.com/repos/INRIA/spoon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/INRIA/spoon/issues/1533/comments","statuses_url":"https://api.github.com/repos/INRIA/spoon/statuses/b0badf885b3cf17b25674a906c72e52b1dbdb51f","head":{"label":"tdurieux:feat_maven_launcher","ref":"feat_maven_launcher","sha":"b0badf885b3cf17b25674a906c72e52b1dbdb51f","user":{"login":"tdurieux","id":5577568,"avatar_url":"https://avatars2.githubusercontent.com/u/5577568?v=4","gravatar_id":"","url":"https://api.github.com/users/tdurieux","html_url":"https://github.com/tdurieux","followers_url":"https://api.github.com/users/tdurieux/followers","following_url":"https://api.github.com/users/tdurieux/following{/other_user}","gists_url":"https://api.github.com/users/tdurieux/gists{/gist_id}","starred_url":"https://api.github.com/users/tdurieux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdurieux/subscriptions","organizations_url":"https://api.github.com/users/tdurieux/orgs","repos_url":"https://api.github.com/users/tdurieux/repos","events_url":"https://api.github.com/users/tdurieux/events{/privacy}","received_events_url":"https://api.github.com/users/tdurieux/received_events","type":"User","site_admin":false},"repo":{"id":42295680,"name":"spoon","full_name":"tdurieux/spoon","owner":{"login":"tdurieux","id":5577568,"avatar_url":"https://avatars2.githubusercontent.com/u/5577568?v=4","gravatar_id":"","url":"https://api.github.com/users/tdurieux","html_url":"https://github.com/tdurieux","followers_url":"https://api.github.com/users/tdurieux/followers","following_url":"https://api.github.com/users/tdurieux/following{/other_user}","gists_url":"https://api.github.com/users/tdurieux/gists{/gist_id}","starred_url":"https://api.github.com/users/tdurieux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdurieux/subscriptions","organizations_url":"https://api.github.com/users/tdurieux/orgs","repos_url":"https://api.github.com/users/tdurieux/repos","events_url":"https://api.github.com/users/tdurieux/events{/privacy}","received_events_url":"https://api.github.com/users/tdurieux/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tdurieux/spoon","description":"Spoon is a library for analyzing and transforming Java source code.","fork":true,"url":"https://api.github.com/repos/tdurieux/spoon","forks_url":"https://api.github.com/repos/tdurieux/spoon/forks","keys_url":"https://api.github.com/repos/tdurieux/spoon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tdurieux/spoon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tdurieux/spoon/teams","hooks_url":"https://api.github.com/repos/tdurieux/spoon/hooks","issue_events_url":"https://api.github.com/repos/tdurieux/spoon/issues/events{/number}","events_url":"https://api.github.com/repos/tdurieux/spoon/events","assignees_url":"https://api.github.com/repos/tdurieux/spoon/assignees{/user}","branches_url":"https://api.github.com/repos/tdurieux/spoon/branches{/branch}","tags_url":"https://api.github.com/repos/tdurieux/spoon/tags","blobs_url":"https://api.github.com/repos/tdurieux/spoon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tdurieux/spoon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tdurieux/spoon/git/refs{/sha}","trees_url":"https://api.github.com/repos/tdurieux/spoon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tdurieux/spoon/statuses/{sha}","languages_url":"https://api.github.com/repos/tdurieux/spoon/languages","stargazers_url":"https://api.github.com/repos/tdurieux/spoon/stargazers","contributors_url":"https://api.github.com/repos/tdurieux/spoon/contributors","subscribers_url":"https://api.github.com/repos/tdurieux/spoon/subscribers","subscription_url":"https://api.github.com/repos/tdurieux/spoon/subscription","commits_url":"https://api.github.com/repos/tdurieux/spoon/commits{/sha}","git_commits_url":"https://api.github.com/repos/tdurieux/spoon/git/commits{/sha}","comments_url":"https://api.github.com/repos/tdurieux/spoon/comments{/number}","issue_comment_url":"https://api.github.com/repos/tdurieux/spoon/issues/comments{/number}","contents_url":"https://api.github.com/repos/tdurieux/spoon/contents/{+path}","compare_url":"https://api.github.com/repos/tdurieux/spoon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tdurieux/spoon/merges","archive_url":"https://api.github.com/repos/tdurieux/spoon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tdurieux/spoon/downloads","issues_url":"https://api.github.com/repos/tdurieux/spoon/issues{/number}","pulls_url":"https://api.github.com/repos/tdurieux/spoon/pulls{/number}","milestones_url":"https://api.github.com/repos/tdurieux/spoon/milestones{/number}","notifications_url":"https://api.github.com/repos/tdurieux/spoon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tdurieux/spoon/labels{/name}","releases_url":"https://api.github.com/repos/tdurieux/spoon/releases{/id}","deployments_url":"https://api.github.com/repos/tdurieux/spoon/deployments","created_at":"2015-09-11T08:01:22Z","updated_at":"2016-01-25T12:33:11Z","pushed_at":"2017-09-19T08:20:29Z","git_url":"git://github.com/tdurieux/spoon.git","ssh_url":"git@github.com:tdurieux/spoon.git","clone_url":"https://github.com/tdurieux/spoon.git","svn_url":"https://github.com/tdurieux/spoon","homepage":"http://spoon.gforge.inria.fr/","size":19438,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"INRIA:master","ref":"master","sha":"77d0531ac106c53d38b15143700f621af2d6e7a9","user":{"login":"INRIA","id":2951919,"avatar_url":"https://avatars2.githubusercontent.com/u/2951919?v=4","gravatar_id":"","url":"https://api.github.com/users/INRIA","html_url":"https://github.com/INRIA","followers_url":"https://api.github.com/users/INRIA/followers","following_url":"https://api.github.com/users/INRIA/following{/other_user}","gists_url":"https://api.github.com/users/INRIA/gists{/gist_id}","starred_url":"https://api.github.com/users/INRIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/INRIA/subscriptions","organizations_url":"https://api.github.com/users/INRIA/orgs","repos_url":"https://api.github.com/users/INRIA/repos","events_url":"https://api.github.com/users/INRIA/events{/privacy}","received_events_url":"https://api.github.com/users/INRIA/received_events","type":"Organization","site_admin":false},"repo":{"id":14176513,"name":"spoon","full_name":"INRIA/spoon","owner":{"login":"INRIA","id":2951919,"avatar_url":"https://avatars2.githubusercontent.com/u/2951919?v=4","gravatar_id":"","url":"https://api.github.com/users/INRIA","html_url":"https://github.com/INRIA","followers_url":"https://api.github.com/users/INRIA/followers","following_url":"https://api.github.com/users/INRIA/following{/other_user}","gists_url":"https://api.github.com/users/INRIA/gists{/gist_id}","starred_url":"https://api.github.com/users/INRIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/INRIA/subscriptions","organizations_url":"https://api.github.com/users/INRIA/orgs","repos_url":"https://api.github.com/users/INRIA/repos","events_url":"https://api.github.com/users/INRIA/events{/privacy}","received_events_url":"https://api.github.com/users/INRIA/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/INRIA/spoon","description":"Spoon is a library to analyze, transform, rewrite, transpile Java source code (incl Java 8). It parses source files to build a well-designed AST with powerful analysis and transformation API. Made at Inria with :heart:, :beers: and :sparkles:.","fork":false,"url":"https://api.github.com/repos/INRIA/spoon","forks_url":"https://api.github.com/repos/INRIA/spoon/forks","keys_url":"https://api.github.com/repos/INRIA/spoon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/INRIA/spoon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/INRIA/spoon/teams","hooks_url":"https://api.github.com/repos/INRIA/spoon/hooks","issue_events_url":"https://api.github.com/repos/INRIA/spoon/issues/events{/number}","events_url":"https://api.github.com/repos/INRIA/spoon/events","assignees_url":"https://api.github.com/repos/INRIA/spoon/assignees{/user}","branches_url":"https://api.github.com/repos/INRIA/spoon/branches{/branch}","tags_url":"https://api.github.com/repos/INRIA/spoon/tags","blobs_url":"https://api.github.com/repos/INRIA/spoon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/INRIA/spoon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/INRIA/spoon/git/refs{/sha}","trees_url":"https://api.github.com/repos/INRIA/spoon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/INRIA/spoon/statuses/{sha}","languages_url":"https://api.github.com/repos/INRIA/spoon/languages","stargazers_url":"https://api.github.com/repos/INRIA/spoon/stargazers","contributors_url":"https://api.github.com/repos/INRIA/spoon/contributors","subscribers_url":"https://api.github.com/repos/INRIA/spoon/subscribers","subscription_url":"https://api.github.com/repos/INRIA/spoon/subscription","commits_url":"https://api.github.com/repos/INRIA/spoon/commits{/sha}","git_commits_url":"https://api.github.com/repos/INRIA/spoon/git/commits{/sha}","comments_url":"https://api.github.com/repos/INRIA/spoon/comments{/number}","issue_comment_url":"https://api.github.com/repos/INRIA/spoon/issues/comments{/number}","contents_url":"https://api.github.com/repos/INRIA/spoon/contents/{+path}","compare_url":"https://api.github.com/repos/INRIA/spoon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/INRIA/spoon/merges","archive_url":"https://api.github.com/repos/INRIA/spoon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/INRIA/spoon/downloads","issues_url":"https://api.github.com/repos/INRIA/spoon/issues{/number}","pulls_url":"https://api.github.com/repos/INRIA/spoon/pulls{/number}","milestones_url":"https://api.github.com/repos/INRIA/spoon/milestones{/number}","notifications_url":"https://api.github.com/repos/INRIA/spoon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/INRIA/spoon/labels{/name}","releases_url":"https://api.github.com/repos/INRIA/spoon/releases{/id}","deployments_url":"https://api.github.com/repos/INRIA/spoon/deployments","created_at":"2013-11-06T15:29:59Z","updated_at":"2017-09-19T03:58:31Z","pushed_at":"2017-09-19T08:20:31Z","git_url":"git://github.com/INRIA/spoon.git","ssh_url":"git@github.com:INRIA/spoon.git","clone_url":"https://github.com/INRIA/spoon.git","svn_url":"https://github.com/INRIA/spoon","homepage":"http://spoon.gforge.inria.fr/","size":19092,"stargazers_count":384,"watchers_count":384,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":82,"mirror_url":null,"open_issues_count":55,"forks":82,"open_issues":55,"watchers":384,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/1533"},"html":{"href":"https://github.com/INRIA/spoon/pull/1533"},"issue":{"href":"https://api.github.com/repos/INRIA/spoon/issues/1533"},"comments":{"href":"https://api.github.com/repos/INRIA/spoon/issues/1533/comments"},"review_comments":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/1533/comments"},"review_comment":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/INRIA/spoon/pulls/1533/commits"},"statuses":{"href":"https://api.github.com/repos/INRIA/spoon/statuses/b0badf885b3cf17b25674a906c72e52b1dbdb51f"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"surli"}}