{"action":"created","comment":{"url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/comments/241571204","pull_request_review_id":184881280,"id":241571204,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTU3MTIwNA==","diff_hunk":"@@ -1,194 +1,156 @@\n package org.wycliffeassociates.otter.common.domain.resourcecontainer\n \n-import io.reactivex.Completable\n import io.reactivex.Single\n import io.reactivex.schedulers.Schedulers\n import org.wycliffeassociates.otter.common.collections.tree.Tree\n-import org.wycliffeassociates.otter.common.collections.tree.TreeNode\n-import org.wycliffeassociates.otter.common.data.model.Content\n import org.wycliffeassociates.otter.common.data.model.Collection\n-import org.wycliffeassociates.otter.common.domain.usfm.ParseUsfm\n import org.wycliffeassociates.otter.common.persistence.IDirectoryProvider\n-import org.wycliffeassociates.otter.common.persistence.repositories.IContentRepository\n import org.wycliffeassociates.otter.common.persistence.repositories.ICollectionRepository\n-import org.wycliffeassociates.otter.common.persistence.repositories.ILanguageRepository\n-import org.wycliffeassociates.otter.common.persistence.repositories.IResourceMetadataRepository\n import org.wycliffeassociates.resourcecontainer.ResourceContainer\n-import org.wycliffeassociates.resourcecontainer.entity.Manifest\n import org.wycliffeassociates.resourcecontainer.entity.Project\n-import org.wycliffeassociates.resourcecontainer.errors.RCException\n import java.io.File\n import java.io.IOException\n \n-\n class ImportResourceContainer(\n         private val collectionRepository: ICollectionRepository,\n         directoryProvider: IDirectoryProvider\n ) {\n+    enum class Result {\n+        SUCCESS,\n+        INVALID_RC,\n+        INVALID_CONTENT,\n+        UNSUPPORTED_CONTENT,\n+        IMPORT_ERROR,\n+        LOAD_RC_ERROR,\n+        UNKNOWN_ERROR\n+    }\n \n     private val rcDirectory = File(directoryProvider.getAppDataDirectory(), \"rc\")\n \n-    fun import(file: File): Completable {\n+    fun import(file: File): Single<Result> {\n         return when {\n-            file.isDirectory -> importDirectory(file)\n-            else -> Completable.complete()\n-        }\n-    }\n-\n-    private fun importDirectory(dir: File): Completable {\n-        if (validateResourceContainer(dir)) {\n-            if (dir.parentFile?.absolutePath != rcDirectory.absolutePath) {\n-                val success = dir.copyRecursively(File(rcDirectory, dir.name), true)\n-                if (!success) {\n-                    throw IOException(\"Could not copy resource container ${dir.name} to resource container directory\")\n-                }\n-            }\n-            return importResourceContainer(File(rcDirectory, dir.name))\n-        } else {\n-            return Completable.error(RCException(\"Missing manifest.yaml\"))\n+            file.isDirectory -> importContainerDirectory(file)\n+            else -> Single.just(Result.INVALID_RC)\n         }\n     }\n \n-    private fun validateResourceContainer(dir: File): Boolean {\n-        val names = dir.listFiles().map { it.name }\n-        return names.contains(\"manifest.yaml\")\n-    }\n+    private fun importContainerDirectory(directory: File) =\n+        Single\n+                .just(directory)\n+                .flatMap { containerDir ->\n+                    // Is this a valid resource container\n+                    if (!validateResourceContainer(containerDir)) return@flatMap Single.just(Result.INVALID_RC)\n+\n+                    // Copy to the internal directory\n+                    val newDirectory = copyToInternalDirectory(containerDir)\n+\n+                    // Load\n+                    val container = try {\n+                         ResourceContainer.load(newDirectory, OtterResourceContainerConfig())\n+                    } catch (e: Exception) {\n+                        return@flatMap cleanUp(newDirectory, Result.LOAD_RC_ERROR)\n+                    }\n \n-    private fun importResourceContainer(container: File): Completable {\n-        return Single.fromCallable {\n-            val rc = ResourceContainer.load(container, OtterResourceContainerConfig())\n-            val dc = rc.manifest.dublinCore\n-            if (dc.type == \"bundle\" && dc.format == \"text/usfm\") {\n-                expandResourceContainerBundle(rc)\n-            }\n-            return@fromCallable Triple(constructContainerTree(rc), rc, dc)\n-        }.flatMapCompletable { (tree, rc, dc) ->\n-            collectionRepository.importResourceContainer(rc, tree, dc.language.identifier)\n-        }.subscribeOn(Schedulers.io())\n-    }\n+                    val (constructResult, tree) = constructContainerTree(container)\n+                    if (constructResult != Result.SUCCESS) return@flatMap cleanUp(newDirectory, constructResult)\n \n-    private fun constructContainerTree(rc: ResourceContainer): Tree {\n-        val root = constructRoot(rc)\n-        val categories = getCategories(rc)\n-        val nodes = categories\n-                .map { category ->\n-                    val categoryTree = Tree(category)\n-                    categoryTree.addAll(\n-                            getProjectsInCategory(rc.manifest, category.slug)\n-                                    .map {\n-                                        constructProjectTree(rc.dir, it, \"project\")\n-                                    }\n-                    )\n-                    return@map categoryTree\n+                    return@flatMap collectionRepository\n+                            .importResourceContainer(container, tree, container.manifest.dublinCore.language.identifier)\n+                            .toSingle { Result.SUCCESS }\n+                            .onErrorResumeNext(cleanUp(newDirectory, Result.IMPORT_ERROR))\n                 }\n-                .plus(\n-                        getProjectsNotInCategories(rc.manifest, categories.map { it.slug })\n-                                .map {\n-                                    constructProjectTree(rc.dir, it, \"project\")\n-                                }\n-                )\n-        root.addAll(nodes)\n-        return root\n+                .onErrorReturn { Result.UNKNOWN_ERROR }\n+                .subscribeOn(Schedulers.io())\n+\n+    private fun cleanUp(containerDir: File, result: Result): Single<Result> = Single.fromCallable {\n+        containerDir.deleteRecursively()\n+        return@fromCallable result\n     }\n \n-    private fun constructProjectTree(containerDir: File, project: Project, type: String): Tree {\n-        val projectDir = File(containerDir, project.path)\n-        val files = projectDir.listFiles()\n-        val book = Tree(Collection(project.sort, project.identifier, type, project.title, null))\n-        val chapters = arrayListOf<Tree>()\n-        for (file in files) {\n-            val doc = ParseUsfm(file).parse()\n-            for (chapter in doc.chapters) {\n-                val slug = \"${project.identifier}_${chapter.key}\"\n-                val col = Collection(chapter.key, slug, \"chapter\", chapter.key.toString(), null)\n-                val tree = Tree(col)\n-                // create a chunk for the whole chapter\n-                val chapChunk = Content(0, \"chapter\",\n-                        chapter.value.values.first().number,\n-                        chapter.value.values.last().number, null)\n-                tree.addChild(TreeNode(chapChunk))\n-                for (verse in chapter.value.values) {\n-                    val con = Content(verse.number, \"verse\", verse.number, verse.number, null)\n-                    tree.addChild(TreeNode(con))\n-                }\n-                chapters.add(tree)\n+    private fun validateResourceContainer(dir: File): Boolean = dir.listFiles().map { it.name }.contains(\"manifest.yaml\")","path":"src/main/kotlin/org/wycliffeassociates/otter/common/domain/resourcecontainer/ImportResourceContainer.kt","position":155,"original_position":155,"commit_id":"7633d3fd3d70c5a463862b582a2cf1e19c5205a3","original_commit_id":"7633d3fd3d70c5a463862b582a2cf1e19c5205a3","user":{"login":"mbr4477","id":19411736,"node_id":"MDQ6VXNlcjE5NDExNzM2","avatar_url":"https://avatars1.githubusercontent.com/u/19411736?v=4","gravatar_id":"","url":"https://api.github.com/users/mbr4477","html_url":"https://github.com/mbr4477","followers_url":"https://api.github.com/users/mbr4477/followers","following_url":"https://api.github.com/users/mbr4477/following{/other_user}","gists_url":"https://api.github.com/users/mbr4477/gists{/gist_id}","starred_url":"https://api.github.com/users/mbr4477/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbr4477/subscriptions","organizations_url":"https://api.github.com/users/mbr4477/orgs","repos_url":"https://api.github.com/users/mbr4477/repos","events_url":"https://api.github.com/users/mbr4477/events{/privacy}","received_events_url":"https://api.github.com/users/mbr4477/received_events","type":"User","site_admin":false},"body":"yes, but I think it's quicker to do the check here, especially since we just want to check that a manifest exists before copying to internal?","created_at":"2018-12-13T21:40:43Z","updated_at":"2018-12-13T21:40:43Z","html_url":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76#discussion_r241571204","pull_request_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/comments/241571204"},"html":{"href":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76#discussion_r241571204"},"pull_request":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76"}},"in_reply_to_id":241564248},"pull_request":{"url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76","id":236908011,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM2OTA4MDEx","html_url":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76","diff_url":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76.diff","patch_url":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76.patch","issue_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/76","number":76,"state":"open","locked":false,"title":"Refactor import rc use case","user":{"login":"mbr4477","id":19411736,"node_id":"MDQ6VXNlcjE5NDExNzM2","avatar_url":"https://avatars1.githubusercontent.com/u/19411736?v=4","gravatar_id":"","url":"https://api.github.com/users/mbr4477","html_url":"https://github.com/mbr4477","followers_url":"https://api.github.com/users/mbr4477/followers","following_url":"https://api.github.com/users/mbr4477/following{/other_user}","gists_url":"https://api.github.com/users/mbr4477/gists{/gist_id}","starred_url":"https://api.github.com/users/mbr4477/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbr4477/subscriptions","organizations_url":"https://api.github.com/users/mbr4477/orgs","repos_url":"https://api.github.com/users/mbr4477/repos","events_url":"https://api.github.com/users/mbr4477/events{/privacy}","received_events_url":"https://api.github.com/users/mbr4477/received_events","type":"User","site_admin":false},"body":"- includes USFM parsing updates","created_at":"2018-12-07T15:41:03Z","updated_at":"2018-12-13T21:40:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d978e0a94e66474442b910814927d7c0e226465d","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76/commits","review_comments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76/comments","review_comment_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/comments{/number}","comments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/76/comments","statuses_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/statuses/7633d3fd3d70c5a463862b582a2cf1e19c5205a3","head":{"label":"WycliffeAssociates:mr-import-rc-refactor","ref":"mr-import-rc-refactor","sha":"7633d3fd3d70c5a463862b582a2cf1e19c5205a3","user":{"login":"WycliffeAssociates","id":8556804,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NTY4MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/8556804?v=4","gravatar_id":"","url":"https://api.github.com/users/WycliffeAssociates","html_url":"https://github.com/WycliffeAssociates","followers_url":"https://api.github.com/users/WycliffeAssociates/followers","following_url":"https://api.github.com/users/WycliffeAssociates/following{/other_user}","gists_url":"https://api.github.com/users/WycliffeAssociates/gists{/gist_id}","starred_url":"https://api.github.com/users/WycliffeAssociates/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WycliffeAssociates/subscriptions","organizations_url":"https://api.github.com/users/WycliffeAssociates/orgs","repos_url":"https://api.github.com/users/WycliffeAssociates/repos","events_url":"https://api.github.com/users/WycliffeAssociates/events{/privacy}","received_events_url":"https://api.github.com/users/WycliffeAssociates/received_events","type":"Organization","site_admin":false},"repo":{"id":136932227,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY5MzIyMjc=","name":"8woc2018-common","full_name":"WycliffeAssociates/8woc2018-common","private":false,"owner":{"login":"WycliffeAssociates","id":8556804,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NTY4MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/8556804?v=4","gravatar_id":"","url":"https://api.github.com/users/WycliffeAssociates","html_url":"https://github.com/WycliffeAssociates","followers_url":"https://api.github.com/users/WycliffeAssociates/followers","following_url":"https://api.github.com/users/WycliffeAssociates/following{/other_user}","gists_url":"https://api.github.com/users/WycliffeAssociates/gists{/gist_id}","starred_url":"https://api.github.com/users/WycliffeAssociates/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WycliffeAssociates/subscriptions","organizations_url":"https://api.github.com/users/WycliffeAssociates/orgs","repos_url":"https://api.github.com/users/WycliffeAssociates/repos","events_url":"https://api.github.com/users/WycliffeAssociates/events{/privacy}","received_events_url":"https://api.github.com/users/WycliffeAssociates/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/WycliffeAssociates/8woc2018-common","description":"Platform agnostic shared library for 8woc108","fork":false,"url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common","forks_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/forks","keys_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/teams","hooks_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/hooks","issue_events_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/events{/number}","events_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/events","assignees_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/assignees{/user}","branches_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/branches{/branch}","tags_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/tags","blobs_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/statuses/{sha}","languages_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/languages","stargazers_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/stargazers","contributors_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/contributors","subscribers_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/subscribers","subscription_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/subscription","commits_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/contents/{+path}","compare_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/merges","archive_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/downloads","issues_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues{/number}","pulls_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls{/number}","milestones_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/milestones{/number}","notifications_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/labels{/name}","releases_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/releases{/id}","deployments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/deployments","created_at":"2018-06-11T13:44:39Z","updated_at":"2018-12-03T14:42:36Z","pushed_at":"2018-12-13T16:33:11Z","git_url":"git://github.com/WycliffeAssociates/8woc2018-common.git","ssh_url":"git@github.com:WycliffeAssociates/8woc2018-common.git","clone_url":"https://github.com/WycliffeAssociates/8woc2018-common.git","svn_url":"https://github.com/WycliffeAssociates/8woc2018-common","homepage":null,"size":228,"stargazers_count":3,"watchers_count":3,"language":"Kotlin","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":19,"watchers":3,"default_branch":"dev"}},"base":{"label":"WycliffeAssociates:dev","ref":"dev","sha":"839578b2d7d6f42ad415ee785e97cf0dc93aa46e","user":{"login":"WycliffeAssociates","id":8556804,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NTY4MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/8556804?v=4","gravatar_id":"","url":"https://api.github.com/users/WycliffeAssociates","html_url":"https://github.com/WycliffeAssociates","followers_url":"https://api.github.com/users/WycliffeAssociates/followers","following_url":"https://api.github.com/users/WycliffeAssociates/following{/other_user}","gists_url":"https://api.github.com/users/WycliffeAssociates/gists{/gist_id}","starred_url":"https://api.github.com/users/WycliffeAssociates/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WycliffeAssociates/subscriptions","organizations_url":"https://api.github.com/users/WycliffeAssociates/orgs","repos_url":"https://api.github.com/users/WycliffeAssociates/repos","events_url":"https://api.github.com/users/WycliffeAssociates/events{/privacy}","received_events_url":"https://api.github.com/users/WycliffeAssociates/received_events","type":"Organization","site_admin":false},"repo":{"id":136932227,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY5MzIyMjc=","name":"8woc2018-common","full_name":"WycliffeAssociates/8woc2018-common","private":false,"owner":{"login":"WycliffeAssociates","id":8556804,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NTY4MDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/8556804?v=4","gravatar_id":"","url":"https://api.github.com/users/WycliffeAssociates","html_url":"https://github.com/WycliffeAssociates","followers_url":"https://api.github.com/users/WycliffeAssociates/followers","following_url":"https://api.github.com/users/WycliffeAssociates/following{/other_user}","gists_url":"https://api.github.com/users/WycliffeAssociates/gists{/gist_id}","starred_url":"https://api.github.com/users/WycliffeAssociates/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WycliffeAssociates/subscriptions","organizations_url":"https://api.github.com/users/WycliffeAssociates/orgs","repos_url":"https://api.github.com/users/WycliffeAssociates/repos","events_url":"https://api.github.com/users/WycliffeAssociates/events{/privacy}","received_events_url":"https://api.github.com/users/WycliffeAssociates/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/WycliffeAssociates/8woc2018-common","description":"Platform agnostic shared library for 8woc108","fork":false,"url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common","forks_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/forks","keys_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/teams","hooks_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/hooks","issue_events_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/events{/number}","events_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/events","assignees_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/assignees{/user}","branches_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/branches{/branch}","tags_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/tags","blobs_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/statuses/{sha}","languages_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/languages","stargazers_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/stargazers","contributors_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/contributors","subscribers_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/subscribers","subscription_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/subscription","commits_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/contents/{+path}","compare_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/merges","archive_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/downloads","issues_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues{/number}","pulls_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls{/number}","milestones_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/milestones{/number}","notifications_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/labels{/name}","releases_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/releases{/id}","deployments_url":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/deployments","created_at":"2018-06-11T13:44:39Z","updated_at":"2018-12-03T14:42:36Z","pushed_at":"2018-12-13T16:33:11Z","git_url":"git://github.com/WycliffeAssociates/8woc2018-common.git","ssh_url":"git@github.com:WycliffeAssociates/8woc2018-common.git","clone_url":"https://github.com/WycliffeAssociates/8woc2018-common.git","svn_url":"https://github.com/WycliffeAssociates/8woc2018-common","homepage":null,"size":228,"stargazers_count":3,"watchers_count":3,"language":"Kotlin","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":19,"watchers":3,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76"},"html":{"href":"https://github.com/WycliffeAssociates/8woc2018-common/pull/76"},"issue":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/76"},"comments":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/issues/76/comments"},"review_comments":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76/comments"},"review_comment":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/pulls/76/commits"},"statuses":{"href":"https://api.github.com/repos/WycliffeAssociates/8woc2018-common/statuses/7633d3fd3d70c5a463862b582a2cf1e19c5205a3"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"mbr4477"}}