{"action":"created","comment":{"url":"https://api.github.com/repos/CommBank/maestro/pulls/comments/27442686","id":27442686,"diff_hunk":"@@ -75,100 +77,207 @@ case class UploadConfig(\n   tablename: String,\n   filePattern: String = \"{table}?{yyyyMMdd}*\",\n   controlPattern: Regex = ControlPattern.default\n-)\n+ ){\n+  def printUploadConfig=\n+    s\"\"\"TableName        = ${tablename},\n+       |filePattern      = ${filePattern},\n+       |controlPattern   = ${controlPattern},\n+       |localIngestPath  = ${localIngestPath},\n+       |localArchivePath = ${localArchivePath},\n+       |hdfsArchivePath  = ${hdfsArchivePath},\n+       |hdfsLandingPath  = ${hdfsLandingPath}\n+       |\"\"\".stripMargin\n+}\n+\n \n /**\n-  * Push source files to HDFS using [[upload]] and archive them.\n-  *\n-  * See the example at `au.com.cba.omnia.maestro.example.CustomerExecution`.\n-  *\n-  * In order to run map-reduce jobs, we first need to get our data onto HDFS.\n-  * [[upload]] copies data files from the local machine onto HDFS and archives\n-  * the files.\n-  */\n+ * Push source files to HDFS using [[upload]] and archive them.\n+ *\n+ * See the example at `au.com.cba.omnia.maestro.example.CustomerExecution`.\n+ *\n+ * In order to run map-reduce jobs, we first need to get our data onto HDFS.\n+ * [[upload]] copies data files from the local machine onto HDFS and archives\n+ * the files.\n+ */\n trait UploadExecution {\n   /**\n-    * Pushes source files onto HDFS and archives them locally.\n-    *\n-    * `upload` expects data files intended for HDFS to be placed in the local\n-    * ingestion path. `upload` processes all data files that match a given file\n-    * pattern. The file pattern format is explained below.\n-    *\n-    * Each data file will be copied into the HDFS landing path. Data files are\n-    * also compressed and archived on the local machine and on HDFS.\n-    *\n-    * Some files placed on the local machine are control files. These files\n-    * are not intended for HDFS and are ignored by `upload`. `upload` will log\n-    * a message whenever it ignores a control file.\n-    *\n-    * When an error occurs, `upload` stops copying files immediately. Once the\n-    * cause of the error has been addressed, `upload` can be run again to copy\n-    * any remaining files to HDFS. `upload` will refuse to copy a file if that\n-    * file or it's control flags are already present in HDFS. If you\n-    * need to overwrite a file that already exists in HDFS, you will need to\n-    * delete the file and it's control flags before `upload` will replace it.\n-    *\n-    * The file pattern is a string containing the following elements:\n-    *  - Literals:\n-    *    - Any character other than `{`, `}`, `*`, `?`, or `\\` represents itself.\n-    *    - `\\{`, `\\}`, `\\*`, `\\?`, or `\\\\` represents `{`, `}`, `*`, `?`, and `\\`, respectively.\n-    *    - The string `{table}` represents the table name.\n-    *  - Wildcards:\n-    *    - The character `*` represents an arbitrary number of arbitrary characters.\n-    *    - The character `?` represents one arbitrary character.\n-    *  - Date times:\n-    *    - The string `{<timestamp-pattern>}` represents a JodaTime timestamp pattern.\n-    *    - `upload` only supports certain date time fields:\n-    *      - year (y),\n-    *      - month of year (M),\n-    *      - day of month (d),\n-    *      - hour of day (H),\n-    *      - minute of hour (m), and\n-    *      - second of minute (s).\n-    *\n-    * Some example file patterns:\n-    *  - `{table}{yyyyMMdd}.DAT`\n-    *  - `{table}_{yyyyMMdd_HHss}.TXT.*.{yyyyMMddHHss}`\n-    *  - `??_{table}-{ddMMyy}*`\n-    *\n-    * @param config: The upload configuration: [[UploadConfig]].\n-    *\n-    * @return The list of copied hdfs files.\n-    */\n-  def upload(config: UploadConfig): Execution[UploadInfo] =\n-    UploadEx.execution(config)\n+   * Pushes source files onto HDFS and archives them locally.\n+   *\n+   * `upload` expects data files intended for HDFS to be placed in the local\n+   * ingestion path. `upload` processes all data files that match a given file\n+   * pattern. The file pattern format is explained below.\n+   *\n+   * Each data file will be copied into the HDFS landing path. Data files are\n+   * also compressed and archived on the local machine and on HDFS.\n+   *\n+   * Some files placed on the local machine are control files. These files\n+   * are not intended for HDFS and are ignored by `upload`. `upload` will log\n+   * a message whenever it ignores a control file.\n+   *\n+   * When an error occurs, `upload` stops copying files immediately. Once the\n+   * cause of the error has been addressed, `upload` can be run again to copy\n+   * any remaining files to HDFS. `upload` will refuse to copy a file if that\n+   * file or it's control flags are already present in HDFS. If you\n+   * need to overwrite a file that already exists in HDFS, you will need to\n+   * delete the file and it's control flags before `upload` will replace it.\n+   *\n+   * The file pattern is a string containing the following elements:\n+   *  - Literals:\n+   *    - Any character other than `{`, `}`, `*`, `?`, or `\\` represents itself.\n+   *    - `\\{`, `\\}`, `\\*`, `\\?`, or `\\\\` represents `{`, `}`, `*`, `?`, and `\\`, respectively.\n+   *    - The string `{table}` represents the table name.\n+   *  - Wildcards:\n+   *    - The character `*` represents an arbitrary number of arbitrary characters.\n+   *    - The character `?` represents one arbitrary character.\n+   *  - Date times:\n+   *    - The string `{<timestamp-pattern>}` represents a JodaTime timestamp pattern.\n+   *    - `upload` only supports certain date time fields:\n+   *      - year (y),\n+   *      - month of year (M),\n+   *      - day of month (d),\n+   *      - hour of day (H),\n+   *      - minute of hour (m), and\n+   *      - second of minute (s).\n+   *\n+   * Some example file patterns:\n+   *  - `{table}{yyyyMMdd}.DAT`\n+   *  - `{table}_{yyyyMMdd_HHss}.TXT.*.{yyyyMMddHHss}`\n+   *  - `??_{table}-{ddMMyy}*`\n+   *\n+   * @param config: The upload configuration: [[UploadConfig]].\n+   *\n+   * @return UploadInfo: Returns a non-emtpy list of sources if we should continue the load\n+   */\n+  def upload(config: UploadConfig): Execution[UploadInfo] = {\n+    UploadEx.matcher(config).flatMap(UploadEx.uploader(config,_))\n+  }\n+\n+  /**\n+   *   Extract the header from the file and returns header data (Default Implementation)\n+   *\n+   *  Header Parser function splits and parse the delimited file header string\n+   *  into Header case class. Default Parser is implemented with assumption that\n+   *  Header follow pattern specified in  [[au.com.cba.omnia.maestro.core.task.UploadExecution.parseHT()]]\n+   *  User can write custom function if default\n+   *  function doesn't satisfy their requirment ie if file header is not in\n+   *  the default pattern.\n+   *\n+   * @param parseH   : function to parse Header\n+   * @param file     : input sourse file\n+   * @return         : returns file Header data\n+   */\n+  def parseHeader[H] (parseH: String => Result[H] = ParserHT.parseH(_)) (file: String): Result[H] =\n+    UploadEx.hParser(parseH, file)\n+\n+  /**\n+   *  Extract the trailer from the file and returns (Default Implementation) (Default Implementation)\n+   *\n+   *  Trailer Parser function splits and parse the delimited file trailer string\n+   *  into Trailer case class. Parser is implemented with assumption that\n+   *  Header follow pattern specified in  [[au.com.cba.omnia.maestro.core.task.UploadExecution.parseHT()]]\n+   *  User can write custom function if default\n+   *  function doesn't satisfy their requirment ie if file trailer is not in\n+   *  the default pattern.\n+   *\n+   * @param parseT : function to parse Trailer\n+   * @param file  : input source file\n+   * @return      : returns file Trailer information\n+   */\n+  def parseTrailer[T] (parseT: String => Result[T] = ParserHT.parseT(_)) (file: String): Result[T] =\n+    UploadEx.tParser(parseT, file)\n+\n+  /**\n+   * Get the data files matching the pattern\n+   *\n+   * See the description of the file pattern at [[au.com.cba.omnia.maestro.core.task.UploadExecution.upload()]]\n+   *\n+   * @param config: The upload configuration: [[UploadConfig]].\n+   *\n+   * @return List[data]  The list of data files.\n+   */\n+  def findSources(config: UploadConfig): Execution[List[Data]] =\n+    UploadEx.matcher(config)\n+\n+  /**\n+   * Pushes source files onto HDFS and archives them locally.\n+   *\n+   * See the description of the HDFS push and archives at [[au.com.cba.omnia.maestro.core.task.UploadExecution.upload()]]\n+   *\n+   * @param config  : The upload configuration: [[UploadConfig]]\n+   * @param files  : List of Data matching the pattern: [[Data]]\n+   * @return UploadInfo :The list of copied hdfs files : Execution[UploadInfo]\n+   */\n+  def uploadSources(config: UploadConfig) (files: List[Data]): Execution[UploadInfo] =\n+    UploadEx.uploader(config, files)\n+\n+  /**\n+   * Extract the header and trailer from the file and returns\n+   *  parsed value of header and trailer.\n+   *\n+   * Default parser function is designed with assumption that header and\n+   * trailer matches below pattern.\n+   *\n+   * H|BusinessDate|ExtractTime|FileName\n+   * T|RecordCount|CheckSumValue|CheckSumColumn\n+   *\n+   * User can write custom function if custom function doesn't satisfy the requirment","path":"maestro-core/src/main/scala/au/com/cba/omnia/maestro/core/task/UploadExecution.scala","position":296,"original_position":296,"commit_id":"ee7cff1611adce7b35b9512f194bd502deed2b39","original_commit_id":"ee7cff1611adce7b35b9512f194bd502deed2b39","user":{"login":"jonjuscorpion666","id":4725101,"avatar_url":"https://avatars.githubusercontent.com/u/4725101?v=3","gravatar_id":"","url":"https://api.github.com/users/jonjuscorpion666","html_url":"https://github.com/jonjuscorpion666","followers_url":"https://api.github.com/users/jonjuscorpion666/followers","following_url":"https://api.github.com/users/jonjuscorpion666/following{/other_user}","gists_url":"https://api.github.com/users/jonjuscorpion666/gists{/gist_id}","starred_url":"https://api.github.com/users/jonjuscorpion666/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonjuscorpion666/subscriptions","organizations_url":"https://api.github.com/users/jonjuscorpion666/orgs","repos_url":"https://api.github.com/users/jonjuscorpion666/repos","events_url":"https://api.github.com/users/jonjuscorpion666/events{/privacy}","received_events_url":"https://api.github.com/users/jonjuscorpion666/received_events","type":"User","site_admin":false},"body":"Good catch :)\r\n","created_at":"2015-03-30T23:44:35Z","updated_at":"2015-03-30T23:44:35Z","html_url":"https://github.com/CommBank/maestro/pull/350#discussion_r27442686","pull_request_url":"https://api.github.com/repos/CommBank/maestro/pulls/350","_links":{"self":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/comments/27442686"},"html":{"href":"https://github.com/CommBank/maestro/pull/350#discussion_r27442686"},"pull_request":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/350"}}},"pull_request":{"url":"https://api.github.com/repos/CommBank/maestro/pulls/350","id":32273344,"html_url":"https://github.com/CommBank/maestro/pull/350","diff_url":"https://github.com/CommBank/maestro/pull/350.diff","patch_url":"https://github.com/CommBank/maestro/pull/350.patch","issue_url":"https://api.github.com/repos/CommBank/maestro/issues/350","number":350,"state":"open","locked":false,"title":"Header Trailer Validatation and Upload split","user":{"login":"jonjuscorpion666","id":4725101,"avatar_url":"https://avatars.githubusercontent.com/u/4725101?v=3","gravatar_id":"","url":"https://api.github.com/users/jonjuscorpion666","html_url":"https://github.com/jonjuscorpion666","followers_url":"https://api.github.com/users/jonjuscorpion666/followers","following_url":"https://api.github.com/users/jonjuscorpion666/following{/other_user}","gists_url":"https://api.github.com/users/jonjuscorpion666/gists{/gist_id}","starred_url":"https://api.github.com/users/jonjuscorpion666/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonjuscorpion666/subscriptions","organizations_url":"https://api.github.com/users/jonjuscorpion666/orgs","repos_url":"https://api.github.com/users/jonjuscorpion666/repos","events_url":"https://api.github.com/users/jonjuscorpion666/events{/privacy}","received_events_url":"https://api.github.com/users/jonjuscorpion666/received_events","type":"User","site_admin":false},"body":"Updated code for Header Trailer Validatation and Upload Split .","created_at":"2015-03-30T22:16:58Z","updated_at":"2015-03-30T23:44:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e6309d3915e782ebca3e66037487c8832f94b870","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/CommBank/maestro/pulls/350/commits","review_comments_url":"https://api.github.com/repos/CommBank/maestro/pulls/350/comments","review_comment_url":"https://api.github.com/repos/CommBank/maestro/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CommBank/maestro/issues/350/comments","statuses_url":"https://api.github.com/repos/CommBank/maestro/statuses/ee7cff1611adce7b35b9512f194bd502deed2b39","head":{"label":"CommBank:devjohn","ref":"devjohn","sha":"ee7cff1611adce7b35b9512f194bd502deed2b39","user":{"login":"CommBank","id":4240076,"avatar_url":"https://avatars.githubusercontent.com/u/4240076?v=3","gravatar_id":"","url":"https://api.github.com/users/CommBank","html_url":"https://github.com/CommBank","followers_url":"https://api.github.com/users/CommBank/followers","following_url":"https://api.github.com/users/CommBank/following{/other_user}","gists_url":"https://api.github.com/users/CommBank/gists{/gist_id}","starred_url":"https://api.github.com/users/CommBank/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CommBank/subscriptions","organizations_url":"https://api.github.com/users/CommBank/orgs","repos_url":"https://api.github.com/users/CommBank/repos","events_url":"https://api.github.com/users/CommBank/events{/privacy}","received_events_url":"https://api.github.com/users/CommBank/received_events","type":"Organization","site_admin":false},"repo":{"id":17347463,"name":"maestro","full_name":"CommBank/maestro","owner":{"login":"CommBank","id":4240076,"avatar_url":"https://avatars.githubusercontent.com/u/4240076?v=3","gravatar_id":"","url":"https://api.github.com/users/CommBank","html_url":"https://github.com/CommBank","followers_url":"https://api.github.com/users/CommBank/followers","following_url":"https://api.github.com/users/CommBank/following{/other_user}","gists_url":"https://api.github.com/users/CommBank/gists{/gist_id}","starred_url":"https://api.github.com/users/CommBank/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CommBank/subscriptions","organizations_url":"https://api.github.com/users/CommBank/orgs","repos_url":"https://api.github.com/users/CommBank/repos","events_url":"https://api.github.com/users/CommBank/events{/privacy}","received_events_url":"https://api.github.com/users/CommBank/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CommBank/maestro","description":"Data Pipelines that are well typed and enforce good convention","fork":false,"url":"https://api.github.com/repos/CommBank/maestro","forks_url":"https://api.github.com/repos/CommBank/maestro/forks","keys_url":"https://api.github.com/repos/CommBank/maestro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CommBank/maestro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CommBank/maestro/teams","hooks_url":"https://api.github.com/repos/CommBank/maestro/hooks","issue_events_url":"https://api.github.com/repos/CommBank/maestro/issues/events{/number}","events_url":"https://api.github.com/repos/CommBank/maestro/events","assignees_url":"https://api.github.com/repos/CommBank/maestro/assignees{/user}","branches_url":"https://api.github.com/repos/CommBank/maestro/branches{/branch}","tags_url":"https://api.github.com/repos/CommBank/maestro/tags","blobs_url":"https://api.github.com/repos/CommBank/maestro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CommBank/maestro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CommBank/maestro/git/refs{/sha}","trees_url":"https://api.github.com/repos/CommBank/maestro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CommBank/maestro/statuses/{sha}","languages_url":"https://api.github.com/repos/CommBank/maestro/languages","stargazers_url":"https://api.github.com/repos/CommBank/maestro/stargazers","contributors_url":"https://api.github.com/repos/CommBank/maestro/contributors","subscribers_url":"https://api.github.com/repos/CommBank/maestro/subscribers","subscription_url":"https://api.github.com/repos/CommBank/maestro/subscription","commits_url":"https://api.github.com/repos/CommBank/maestro/commits{/sha}","git_commits_url":"https://api.github.com/repos/CommBank/maestro/git/commits{/sha}","comments_url":"https://api.github.com/repos/CommBank/maestro/comments{/number}","issue_comment_url":"https://api.github.com/repos/CommBank/maestro/issues/comments{/number}","contents_url":"https://api.github.com/repos/CommBank/maestro/contents/{+path}","compare_url":"https://api.github.com/repos/CommBank/maestro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CommBank/maestro/merges","archive_url":"https://api.github.com/repos/CommBank/maestro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CommBank/maestro/downloads","issues_url":"https://api.github.com/repos/CommBank/maestro/issues{/number}","pulls_url":"https://api.github.com/repos/CommBank/maestro/pulls{/number}","milestones_url":"https://api.github.com/repos/CommBank/maestro/milestones{/number}","notifications_url":"https://api.github.com/repos/CommBank/maestro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CommBank/maestro/labels{/name}","releases_url":"https://api.github.com/repos/CommBank/maestro/releases{/id}","created_at":"2014-03-02T21:34:53Z","updated_at":"2015-03-26T06:39:40Z","pushed_at":"2015-03-30T22:16:58Z","git_url":"git://github.com/CommBank/maestro.git","ssh_url":"git@github.com:CommBank/maestro.git","clone_url":"https://github.com/CommBank/maestro.git","svn_url":"https://github.com/CommBank/maestro","homepage":"https://commbank.github.io/maestro","size":38933,"stargazers_count":27,"watchers_count":27,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":16,"mirror_url":null,"open_issues_count":66,"forks":16,"open_issues":66,"watchers":27,"default_branch":"master"}},"base":{"label":"CommBank:master","ref":"master","sha":"ee03b6f4f1d0f2722dfaa909ef2348133af0127d","user":{"login":"CommBank","id":4240076,"avatar_url":"https://avatars.githubusercontent.com/u/4240076?v=3","gravatar_id":"","url":"https://api.github.com/users/CommBank","html_url":"https://github.com/CommBank","followers_url":"https://api.github.com/users/CommBank/followers","following_url":"https://api.github.com/users/CommBank/following{/other_user}","gists_url":"https://api.github.com/users/CommBank/gists{/gist_id}","starred_url":"https://api.github.com/users/CommBank/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CommBank/subscriptions","organizations_url":"https://api.github.com/users/CommBank/orgs","repos_url":"https://api.github.com/users/CommBank/repos","events_url":"https://api.github.com/users/CommBank/events{/privacy}","received_events_url":"https://api.github.com/users/CommBank/received_events","type":"Organization","site_admin":false},"repo":{"id":17347463,"name":"maestro","full_name":"CommBank/maestro","owner":{"login":"CommBank","id":4240076,"avatar_url":"https://avatars.githubusercontent.com/u/4240076?v=3","gravatar_id":"","url":"https://api.github.com/users/CommBank","html_url":"https://github.com/CommBank","followers_url":"https://api.github.com/users/CommBank/followers","following_url":"https://api.github.com/users/CommBank/following{/other_user}","gists_url":"https://api.github.com/users/CommBank/gists{/gist_id}","starred_url":"https://api.github.com/users/CommBank/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CommBank/subscriptions","organizations_url":"https://api.github.com/users/CommBank/orgs","repos_url":"https://api.github.com/users/CommBank/repos","events_url":"https://api.github.com/users/CommBank/events{/privacy}","received_events_url":"https://api.github.com/users/CommBank/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CommBank/maestro","description":"Data Pipelines that are well typed and enforce good convention","fork":false,"url":"https://api.github.com/repos/CommBank/maestro","forks_url":"https://api.github.com/repos/CommBank/maestro/forks","keys_url":"https://api.github.com/repos/CommBank/maestro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CommBank/maestro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CommBank/maestro/teams","hooks_url":"https://api.github.com/repos/CommBank/maestro/hooks","issue_events_url":"https://api.github.com/repos/CommBank/maestro/issues/events{/number}","events_url":"https://api.github.com/repos/CommBank/maestro/events","assignees_url":"https://api.github.com/repos/CommBank/maestro/assignees{/user}","branches_url":"https://api.github.com/repos/CommBank/maestro/branches{/branch}","tags_url":"https://api.github.com/repos/CommBank/maestro/tags","blobs_url":"https://api.github.com/repos/CommBank/maestro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CommBank/maestro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CommBank/maestro/git/refs{/sha}","trees_url":"https://api.github.com/repos/CommBank/maestro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CommBank/maestro/statuses/{sha}","languages_url":"https://api.github.com/repos/CommBank/maestro/languages","stargazers_url":"https://api.github.com/repos/CommBank/maestro/stargazers","contributors_url":"https://api.github.com/repos/CommBank/maestro/contributors","subscribers_url":"https://api.github.com/repos/CommBank/maestro/subscribers","subscription_url":"https://api.github.com/repos/CommBank/maestro/subscription","commits_url":"https://api.github.com/repos/CommBank/maestro/commits{/sha}","git_commits_url":"https://api.github.com/repos/CommBank/maestro/git/commits{/sha}","comments_url":"https://api.github.com/repos/CommBank/maestro/comments{/number}","issue_comment_url":"https://api.github.com/repos/CommBank/maestro/issues/comments{/number}","contents_url":"https://api.github.com/repos/CommBank/maestro/contents/{+path}","compare_url":"https://api.github.com/repos/CommBank/maestro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CommBank/maestro/merges","archive_url":"https://api.github.com/repos/CommBank/maestro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CommBank/maestro/downloads","issues_url":"https://api.github.com/repos/CommBank/maestro/issues{/number}","pulls_url":"https://api.github.com/repos/CommBank/maestro/pulls{/number}","milestones_url":"https://api.github.com/repos/CommBank/maestro/milestones{/number}","notifications_url":"https://api.github.com/repos/CommBank/maestro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CommBank/maestro/labels{/name}","releases_url":"https://api.github.com/repos/CommBank/maestro/releases{/id}","created_at":"2014-03-02T21:34:53Z","updated_at":"2015-03-26T06:39:40Z","pushed_at":"2015-03-30T22:16:58Z","git_url":"git://github.com/CommBank/maestro.git","ssh_url":"git@github.com:CommBank/maestro.git","clone_url":"https://github.com/CommBank/maestro.git","svn_url":"https://github.com/CommBank/maestro","homepage":"https://commbank.github.io/maestro","size":38933,"stargazers_count":27,"watchers_count":27,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":16,"mirror_url":null,"open_issues_count":66,"forks":16,"open_issues":66,"watchers":27,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/350"},"html":{"href":"https://github.com/CommBank/maestro/pull/350"},"issue":{"href":"https://api.github.com/repos/CommBank/maestro/issues/350"},"comments":{"href":"https://api.github.com/repos/CommBank/maestro/issues/350/comments"},"review_comments":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/350/comments"},"review_comment":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CommBank/maestro/pulls/350/commits"},"statuses":{"href":"https://api.github.com/repos/CommBank/maestro/statuses/ee7cff1611adce7b35b9512f194bd502deed2b39"}}}}