{"action":"created","comment":{"url":"https://api.github.com/repos/seqan/seqan3/pulls/comments/224766738","pull_request_review_id":164145247,"id":224766738,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNDc2NjczOA==","diff_hunk":"@@ -0,0 +1,347 @@\n+// ============================================================================\n+//                 SeqAn - The Library for Sequence Analysis\n+// ============================================================================\n+//\n+// Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin\n+// Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik\n+// All rights reserved.\n+//\n+// Redistribution and use in source and binary forms, with or without\n+// modification, are permitted provided that the following conditions are met:\n+//\n+//     * Redistributions of source code must retain the above copyright\n+//       notice, this list of conditions and the following disclaimer.\n+//     * Redistributions in binary form must reproduce the above copyright\n+//       notice, this list of conditions and the following disclaimer in the\n+//       documentation and/or other materials provided with the distribution.\n+//     * Neither the name of Knut Reinert or the FU Berlin nor the names of\n+//       its contributors may be used to endorse or promote products derived\n+//       from this software without specific prior written permission.\n+//\n+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+// ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE\n+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n+// DAMAGE.\n+//\n+// ============================================================================\n+\n+/*!\\file\n+ * \\brief Provides the seqan3::sequence_file_format_sam class.\n+ * \\author Mitra Darvish <mitra.darvish AT fu-berlin.de>\n+ */\n+\n+#pragma once\n+\n+#include <iterator>\n+#include <string>\n+#include <string_view>\n+#include <vector>\n+\n+#include <range/v3/algorithm/copy.hpp>\n+#include <range/v3/utility/iterator.hpp>\n+#include <range/v3/view/chunk.hpp>\n+#include <range/v3/view/join.hpp>\n+#include <range/v3/view/remove_if.hpp>\n+\n+#include <seqan3/alphabet/nucleotide/dna5.hpp>\n+#include <seqan3/alphabet/quality/aliases.hpp>\n+#include <seqan3/core/metafunction/range.hpp>\n+#include <seqan3/io/detail/ignore_output_iterator.hpp>\n+#include <seqan3/io/detail/misc.hpp>\n+#include <seqan3/io/sequence_file/input_options.hpp>\n+#include <seqan3/io/sequence_file/output_options.hpp>\n+#include <seqan3/io/stream/parse_condition.hpp>\n+#include <seqan3/range/detail/misc.hpp>\n+#include <seqan3/range/view/char_to.hpp>\n+#include <seqan3/range/view/to_char.hpp>\n+#include <seqan3/range/view/take.hpp>\n+#include <seqan3/range/view/take_exactly.hpp>\n+#include <seqan3/range/view/take_line.hpp>\n+#include <seqan3/range/view/take_until.hpp>\n+#include <seqan3/std/ranges>\n+#include <seqan3/std/view/subrange.hpp>\n+#include <seqan3/std/view/transform.hpp>\n+\n+namespace seqan3\n+{\n+  /*!\\brief       The sam format used as sequence file.\n+   * \\implements  sequence_file_format_concept\n+   * \\ingroup     sequence\n+   *\n+   * \\details\n+   *\n+   * ### Introduction\n+   *\n+   * The SAM format is commonly used to store pairwise alignment information between a query sequence and its\n+   * reference sequence, e.g. a read mapping result. As it provides information on the **id**, **sequence** and\n+   * **quality** of each query, it can additionally be treated as a sequence file.\n+   * See the [article on wikipedia](https://en.wikipedia.org/wiki/SAM_(file_format)) for an in-depth description of\n+   * the format.\n+   *\n+   * ### Fields\n+   *\n+   * The SAM format provides the fields seqan3::field::SEQ, seqan3::field::ID and seqan3::field::SEQ_QUAL.\n+   * All fields are required when writing.\n+   *\n+   * ### Implementation notes\n+   *\n+   * This implementation supports the following optional features of the format:\n+   *\n+   * line breaks and/or other whitespace characters in any part of the sequence (only when reading!), optional tags\n+   * are going to be ignored (when reading)\n+   *\n+   */\n+class sequence_file_format_sam\n+{\n+public:\n+    /*!\\name Constructors, destructor and assignment\n+     * \\{\n+     */\n+     //!\\brief Default constructor is explicitly deleted, you need to give a stream or file name.\n+    sequence_file_format_sam() = default;\n+    //!\\brief Copy construction is explicitly deleted, because you can't have multiple access to the same file.\n+    sequence_file_format_sam(sequence_file_format_sam const &) = delete;\n+    //!\\brief Copy assignment is explicitly deleted, because you can't have multiple access to the same file.\n+    sequence_file_format_sam & operator=(sequence_file_format_sam const &) = delete;\n+    //!\\brief Move construction is defaulted.\n+    sequence_file_format_sam(sequence_file_format_sam &&) = default;\n+    //!\\brief Move assignment is defaulted.\n+    sequence_file_format_sam & operator=(sequence_file_format_sam &&) = default;\n+    //!\\}\n+\n+    //!\\brief The valid file extensions for this format; note that you can modify this value.\n+    static inline std::vector<std::string> file_extensions\n+    {\n+        { \"sam\" },\n+    };\n+\n+    //!\\copydoc sequence_file_input_format_concept::read\n+    template <typename stream_type,     // constraints checked by file\n+              typename seq_legal_alph_type, bool seq_qual_combined,\n+              typename seq_type,        // other constraints checked inside function\n+              typename id_type,\n+              typename qual_type>\n+    void read(stream_type                     & stream,\n+              sequence_file_input_options<seq_legal_alph_type, seq_qual_combined> const & options,\n+              seq_type                        & sequence,\n+              id_type                         & id,\n+              qual_type                       & qualities)\n+    {\n+        auto stream_view = view::subrange<decltype(std::istreambuf_iterator<char>{stream}),\n+                                          decltype(std::istreambuf_iterator<char>{})>\n+                            {std::istreambuf_iterator<char>{stream},\n+                             std::istreambuf_iterator<char>{}};\n+\n+        auto stream_it = ranges::begin(stream_view);\n+\n+        // cache the begin position so we write quals to the same position as seq in seq_qual case\n+        size_t sequence_size_before = 0;\n+        size_t sequence_size_after = 0;\n+        if constexpr (!detail::decays_to_ignore_v<seq_type>)\n+            sequence_size_before = ranges::size(sequence);\n+\n+        auto const is_tab = is_char<'\\t'>;\n+        auto const is_free = is_char<'\\r'>;\n+\n+        while (is_char<'@'>(*stream_it))\n+        {\n+            detail::consume(stream_view | view::take_line);\n+            stream_it = ranges::begin(stream_view);\n+        }\n+\n+        /* ID */\n+        if constexpr (!detail::decays_to_ignore_v<id_type>)\n+        {\n+            if (options.truncate_ids)\n+            {\n+              ranges::copy(stream_view | view::take_until(is_blank)\n+                                       | view::char_to<value_type_t<id_type>>,\n+                                   ranges::back_insert_iterator{id});\n+              detail::consume(stream_view | ranges::view::take_while(is_tab));\n+              detail::consume(stream_view | ranges::view::take_while(!is_tab));\n+            }\n+            else\n+            {\n+              ranges::copy(stream_view | view::take_until_or_throw(is_tab)\n+                                       | view::char_to<value_type_t<id_type>>,\n+                                   ranges::back_insert_iterator{id});\n+            }\n+\n+        }\n+        else\n+        {\n+             detail::consume(stream_view | ranges::view::take_while(!is_tab));\n+        }\n+\n+          // Jump over all parts we are not interested in\n+        for (int i = 0; i < 8;i++)\n+        {\n+            ++stream_it;\n+            detail::consume(stream_view | ranges::view::take_while(!is_tab));\n+        }\n+        ++stream_it;\n+\n+        auto seq_view = stream_view\n+        | ranges::view::remove_if(is_char<'\\r'> || is_digit)\n+         // ignore whitespace and numbers\n+                                      | view::take_until_or_throw(is_tab);   // until next space\n+\n+          // Sequence\n+          if constexpr (!detail::decays_to_ignore_v<seq_type>)\n+          {\n+              auto constexpr is_legal_alph = is_in_alphabet<seq_legal_alph_type>;\n+              ranges::copy(seq_view | view::transform([is_legal_alph] (char const c) // enforce legal alphabet\n+                                      {\n+                                          if (!is_legal_alph(c))\n+                                          {\n+                                              throw parse_error{std::string{\"Encountered an unexpected letter: \"} +\n+                                                                  is_legal_alph.msg.string() +\n+                                                                  \" evaluated to false on \" +\n+                                                                  detail::make_printable(c)};\n+                                          }\n+                                          return c;\n+                                      })\n+                                    | view::char_to<value_type_t<seq_type>>,      // convert to actual target alphabet\n+                           ranges::back_insert_iterator{sequence});\n+\n+              sequence_size_after = ranges::size(sequence);\n+          }\n+          else\n+          {\n+              auto it = ranges::begin(seq_view);\n+              auto it_end = ranges::end(seq_view);\n+              while (it != it_end)\n+             {\n+                  ++it;\n+                  ++sequence_size_after;\n+             }\n+          }\n+          detail::consume(stream_view | ranges::view::take_while(is_tab));\n+\n+          /* Qualities */\n+          if constexpr (seq_qual_combined)\n+          {\n+              // seq_qual field implies that they are the same variable\n+              assert(std::addressof(sequence) == std::addressof(qualities));\n+              ranges::copy(stream_view | view::char_to<typename value_type_t<qual_type>::quality_alphabet_type>,\n+                           ranges::begin(qualities) + sequence_size_before);\n+          }\n+          else if constexpr (!detail::decays_to_ignore_v<qual_type>)\n+          {\n+            ranges::copy(stream_view | view::take_until_or_throw(is_cntrl||is_tab)\n+                                     | view::char_to<value_type_t<qual_type>>,\n+                        ranges::back_insert_iterator{qualities});\n+            // In case of tags\n+            detail::consume(stream_view | ranges::view::take_while(is_tab));\n+            detail::consume(stream_view | ranges::view::take_while(!is_cntrl));\n+          }\n+          else\n+          {\n+              detail::consume(stream_view | ranges::view::take_while(!is_cntrl));\n+          }\n+\n+          // make sure \"buffer at end\" implies \"stream at end\"\n+          if ((std::istreambuf_iterator<char>{stream} == std::istreambuf_iterator<char>{}) &&\n+              (!stream.eof()))\n+          {\n+              stream.get(); // triggers error in stream and sets eof\n+          }\n+\n+          if ((std::istreambuf_iterator<char>{stream} == std::istreambuf_iterator<char>{}) &&\n+              (!stream.eof()))\n+          {\n+              stream.get(); // triggers error in stream and sets eof\n+          }\n+\n+          // Jump over the new line character in the end\n+          detail::consume(stream_view | ranges::view::take_while(is_cntrl));\n+    }\n+\n+    //!\\copydoc sequence_file_output_format_concept::write\n+    template <typename stream_type,     // constraints checked by file\n+              typename seq_type,        // other constraints checked inside function\n+              typename id_type,\n+              typename qual_type>\n+    void write(stream_type                     & stream,\n+               sequence_file_output_options const & options,\n+               seq_type                       && sequence,\n+               id_type                        && id,\n+               qual_type                      && qualities)\n+    {\n+        if constexpr (!(detail::decays_to_ignore_v<seq_type>))\n+        {\n+            static_assert(std::ranges::ForwardRange<seq_type> && alphabet_concept<value_type_t<seq_type>>,\n+          \"The sequence must model std::ranges::ForwardRange and its value type must model seqan3::alphabet_concept. \");\n+        }\n+        ranges::ostreambuf_iterator stream_it{stream};\n+        // ID\n+        if constexpr (detail::decays_to_ignore_v<id_type>)\n+        {\n+            throw std::logic_error{\"The ID field may not be set to ignore when writing sam files.\"};\n+        }\n+        else\n+        {\n+            if (ranges::empty(id)) //[[unlikely]]\n+                throw std::runtime_error{\"The ID field may not be empty when writing sam files.\"};","path":"include/seqan3/io/sequence_file/format_sam.hpp","position":292,"original_position":292,"commit_id":"448bb7163d3511e6a446fed133a3eee1861c5028","original_commit_id":"448bb7163d3511e6a446fed133a3eee1861c5028","user":{"login":"smehringer","id":7955878,"node_id":"MDQ6VXNlcjc5NTU4Nzg=","avatar_url":"https://avatars3.githubusercontent.com/u/7955878?v=4","gravatar_id":"","url":"https://api.github.com/users/smehringer","html_url":"https://github.com/smehringer","followers_url":"https://api.github.com/users/smehringer/followers","following_url":"https://api.github.com/users/smehringer/following{/other_user}","gists_url":"https://api.github.com/users/smehringer/gists{/gist_id}","starred_url":"https://api.github.com/users/smehringer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smehringer/subscriptions","organizations_url":"https://api.github.com/users/smehringer/orgs","repos_url":"https://api.github.com/users/smehringer/repos","events_url":"https://api.github.com/users/smehringer/events{/privacy}","received_events_url":"https://api.github.com/users/smehringer/received_events","type":"User","site_admin":false},"body":"Actually, everything can be empty in the SAM format, so you can remove the exception and write out `*`","created_at":"2018-10-12T12:28:27Z","updated_at":"2018-10-12T12:33:36Z","html_url":"https://github.com/seqan/seqan3/pull/368#discussion_r224766738","pull_request_url":"https://api.github.com/repos/seqan/seqan3/pulls/368","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/comments/224766738"},"html":{"href":"https://github.com/seqan/seqan3/pull/368#discussion_r224766738"},"pull_request":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/368"}}},"pull_request":{"url":"https://api.github.com/repos/seqan/seqan3/pulls/368","id":208285130,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4Mjg1MTMw","html_url":"https://github.com/seqan/seqan3/pull/368","diff_url":"https://github.com/seqan/seqan3/pull/368.diff","patch_url":"https://github.com/seqan/seqan3/pull/368.patch","issue_url":"https://api.github.com/repos/seqan/seqan3/issues/368","number":368,"state":"open","locked":false,"title":"[feature] start sam io","user":{"login":"MitraDarja","id":16179144,"node_id":"MDQ6VXNlcjE2MTc5MTQ0","avatar_url":"https://avatars2.githubusercontent.com/u/16179144?v=4","gravatar_id":"","url":"https://api.github.com/users/MitraDarja","html_url":"https://github.com/MitraDarja","followers_url":"https://api.github.com/users/MitraDarja/followers","following_url":"https://api.github.com/users/MitraDarja/following{/other_user}","gists_url":"https://api.github.com/users/MitraDarja/gists{/gist_id}","starred_url":"https://api.github.com/users/MitraDarja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MitraDarja/subscriptions","organizations_url":"https://api.github.com/users/MitraDarja/orgs","repos_url":"https://api.github.com/users/MitraDarja/repos","events_url":"https://api.github.com/users/MitraDarja/events{/privacy}","received_events_url":"https://api.github.com/users/MitraDarja/received_events","type":"User","site_admin":false},"body":"Start of the sam io\r\nthere are still some TODOs open and I think more tests are necessary to check if it really works. Specifically, a test case with actual qualities are necessary.","created_at":"2018-08-14T13:39:53Z","updated_at":"2018-10-12T12:33:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d20f0359de8a40a0f76ca4d240997446ae85fac1","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/seqan/seqan3/pulls/368/commits","review_comments_url":"https://api.github.com/repos/seqan/seqan3/pulls/368/comments","review_comment_url":"https://api.github.com/repos/seqan/seqan3/pulls/comments{/number}","comments_url":"https://api.github.com/repos/seqan/seqan3/issues/368/comments","statuses_url":"https://api.github.com/repos/seqan/seqan3/statuses/448bb7163d3511e6a446fed133a3eee1861c5028","head":{"label":"MitraDarja:sam_new","ref":"sam_new","sha":"448bb7163d3511e6a446fed133a3eee1861c5028","user":{"login":"MitraDarja","id":16179144,"node_id":"MDQ6VXNlcjE2MTc5MTQ0","avatar_url":"https://avatars2.githubusercontent.com/u/16179144?v=4","gravatar_id":"","url":"https://api.github.com/users/MitraDarja","html_url":"https://github.com/MitraDarja","followers_url":"https://api.github.com/users/MitraDarja/followers","following_url":"https://api.github.com/users/MitraDarja/following{/other_user}","gists_url":"https://api.github.com/users/MitraDarja/gists{/gist_id}","starred_url":"https://api.github.com/users/MitraDarja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MitraDarja/subscriptions","organizations_url":"https://api.github.com/users/MitraDarja/orgs","repos_url":"https://api.github.com/users/MitraDarja/repos","events_url":"https://api.github.com/users/MitraDarja/events{/privacy}","received_events_url":"https://api.github.com/users/MitraDarja/received_events","type":"User","site_admin":false},"repo":{"id":139714198,"node_id":"MDEwOlJlcG9zaXRvcnkxMzk3MTQxOTg=","name":"seqan3","full_name":"MitraDarja/seqan3","private":false,"owner":{"login":"MitraDarja","id":16179144,"node_id":"MDQ6VXNlcjE2MTc5MTQ0","avatar_url":"https://avatars2.githubusercontent.com/u/16179144?v=4","gravatar_id":"","url":"https://api.github.com/users/MitraDarja","html_url":"https://github.com/MitraDarja","followers_url":"https://api.github.com/users/MitraDarja/followers","following_url":"https://api.github.com/users/MitraDarja/following{/other_user}","gists_url":"https://api.github.com/users/MitraDarja/gists{/gist_id}","starred_url":"https://api.github.com/users/MitraDarja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MitraDarja/subscriptions","organizations_url":"https://api.github.com/users/MitraDarja/orgs","repos_url":"https://api.github.com/users/MitraDarja/repos","events_url":"https://api.github.com/users/MitraDarja/events{/privacy}","received_events_url":"https://api.github.com/users/MitraDarja/received_events","type":"User","site_admin":false},"html_url":"https://github.com/MitraDarja/seqan3","description":"The modern C++ library for sequence analysis. Contains version 3 of the library and API docs.","fork":true,"url":"https://api.github.com/repos/MitraDarja/seqan3","forks_url":"https://api.github.com/repos/MitraDarja/seqan3/forks","keys_url":"https://api.github.com/repos/MitraDarja/seqan3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MitraDarja/seqan3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MitraDarja/seqan3/teams","hooks_url":"https://api.github.com/repos/MitraDarja/seqan3/hooks","issue_events_url":"https://api.github.com/repos/MitraDarja/seqan3/issues/events{/number}","events_url":"https://api.github.com/repos/MitraDarja/seqan3/events","assignees_url":"https://api.github.com/repos/MitraDarja/seqan3/assignees{/user}","branches_url":"https://api.github.com/repos/MitraDarja/seqan3/branches{/branch}","tags_url":"https://api.github.com/repos/MitraDarja/seqan3/tags","blobs_url":"https://api.github.com/repos/MitraDarja/seqan3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MitraDarja/seqan3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MitraDarja/seqan3/git/refs{/sha}","trees_url":"https://api.github.com/repos/MitraDarja/seqan3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MitraDarja/seqan3/statuses/{sha}","languages_url":"https://api.github.com/repos/MitraDarja/seqan3/languages","stargazers_url":"https://api.github.com/repos/MitraDarja/seqan3/stargazers","contributors_url":"https://api.github.com/repos/MitraDarja/seqan3/contributors","subscribers_url":"https://api.github.com/repos/MitraDarja/seqan3/subscribers","subscription_url":"https://api.github.com/repos/MitraDarja/seqan3/subscription","commits_url":"https://api.github.com/repos/MitraDarja/seqan3/commits{/sha}","git_commits_url":"https://api.github.com/repos/MitraDarja/seqan3/git/commits{/sha}","comments_url":"https://api.github.com/repos/MitraDarja/seqan3/comments{/number}","issue_comment_url":"https://api.github.com/repos/MitraDarja/seqan3/issues/comments{/number}","contents_url":"https://api.github.com/repos/MitraDarja/seqan3/contents/{+path}","compare_url":"https://api.github.com/repos/MitraDarja/seqan3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MitraDarja/seqan3/merges","archive_url":"https://api.github.com/repos/MitraDarja/seqan3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MitraDarja/seqan3/downloads","issues_url":"https://api.github.com/repos/MitraDarja/seqan3/issues{/number}","pulls_url":"https://api.github.com/repos/MitraDarja/seqan3/pulls{/number}","milestones_url":"https://api.github.com/repos/MitraDarja/seqan3/milestones{/number}","notifications_url":"https://api.github.com/repos/MitraDarja/seqan3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MitraDarja/seqan3/labels{/name}","releases_url":"https://api.github.com/repos/MitraDarja/seqan3/releases{/id}","deployments_url":"https://api.github.com/repos/MitraDarja/seqan3/deployments","created_at":"2018-07-04T11:41:43Z","updated_at":"2018-10-04T08:47:55Z","pushed_at":"2018-10-12T10:59:36Z","git_url":"git://github.com/MitraDarja/seqan3.git","ssh_url":"git@github.com:MitraDarja/seqan3.git","clone_url":"https://github.com/MitraDarja/seqan3.git","svn_url":"https://github.com/MitraDarja/seqan3","homepage":"http://www.seqan.de","size":1982,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"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":"master"}},"base":{"label":"seqan:master","ref":"master","sha":"0bf8d814741cde90c5a009b8576b20fd773cf5ef","user":{"login":"seqan","id":1752144,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NTIxNDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/1752144?v=4","gravatar_id":"","url":"https://api.github.com/users/seqan","html_url":"https://github.com/seqan","followers_url":"https://api.github.com/users/seqan/followers","following_url":"https://api.github.com/users/seqan/following{/other_user}","gists_url":"https://api.github.com/users/seqan/gists{/gist_id}","starred_url":"https://api.github.com/users/seqan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seqan/subscriptions","organizations_url":"https://api.github.com/users/seqan/orgs","repos_url":"https://api.github.com/users/seqan/repos","events_url":"https://api.github.com/users/seqan/events{/privacy}","received_events_url":"https://api.github.com/users/seqan/received_events","type":"Organization","site_admin":false},"repo":{"id":55410078,"node_id":"MDEwOlJlcG9zaXRvcnk1NTQxMDA3OA==","name":"seqan3","full_name":"seqan/seqan3","private":false,"owner":{"login":"seqan","id":1752144,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NTIxNDQ=","avatar_url":"https://avatars2.githubusercontent.com/u/1752144?v=4","gravatar_id":"","url":"https://api.github.com/users/seqan","html_url":"https://github.com/seqan","followers_url":"https://api.github.com/users/seqan/followers","following_url":"https://api.github.com/users/seqan/following{/other_user}","gists_url":"https://api.github.com/users/seqan/gists{/gist_id}","starred_url":"https://api.github.com/users/seqan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seqan/subscriptions","organizations_url":"https://api.github.com/users/seqan/orgs","repos_url":"https://api.github.com/users/seqan/repos","events_url":"https://api.github.com/users/seqan/events{/privacy}","received_events_url":"https://api.github.com/users/seqan/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/seqan/seqan3","description":"The modern C++ library for sequence analysis. Contains version 3 of the library and API docs.","fork":false,"url":"https://api.github.com/repos/seqan/seqan3","forks_url":"https://api.github.com/repos/seqan/seqan3/forks","keys_url":"https://api.github.com/repos/seqan/seqan3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/seqan/seqan3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/seqan/seqan3/teams","hooks_url":"https://api.github.com/repos/seqan/seqan3/hooks","issue_events_url":"https://api.github.com/repos/seqan/seqan3/issues/events{/number}","events_url":"https://api.github.com/repos/seqan/seqan3/events","assignees_url":"https://api.github.com/repos/seqan/seqan3/assignees{/user}","branches_url":"https://api.github.com/repos/seqan/seqan3/branches{/branch}","tags_url":"https://api.github.com/repos/seqan/seqan3/tags","blobs_url":"https://api.github.com/repos/seqan/seqan3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/seqan/seqan3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/seqan/seqan3/git/refs{/sha}","trees_url":"https://api.github.com/repos/seqan/seqan3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/seqan/seqan3/statuses/{sha}","languages_url":"https://api.github.com/repos/seqan/seqan3/languages","stargazers_url":"https://api.github.com/repos/seqan/seqan3/stargazers","contributors_url":"https://api.github.com/repos/seqan/seqan3/contributors","subscribers_url":"https://api.github.com/repos/seqan/seqan3/subscribers","subscription_url":"https://api.github.com/repos/seqan/seqan3/subscription","commits_url":"https://api.github.com/repos/seqan/seqan3/commits{/sha}","git_commits_url":"https://api.github.com/repos/seqan/seqan3/git/commits{/sha}","comments_url":"https://api.github.com/repos/seqan/seqan3/comments{/number}","issue_comment_url":"https://api.github.com/repos/seqan/seqan3/issues/comments{/number}","contents_url":"https://api.github.com/repos/seqan/seqan3/contents/{+path}","compare_url":"https://api.github.com/repos/seqan/seqan3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/seqan/seqan3/merges","archive_url":"https://api.github.com/repos/seqan/seqan3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/seqan/seqan3/downloads","issues_url":"https://api.github.com/repos/seqan/seqan3/issues{/number}","pulls_url":"https://api.github.com/repos/seqan/seqan3/pulls{/number}","milestones_url":"https://api.github.com/repos/seqan/seqan3/milestones{/number}","notifications_url":"https://api.github.com/repos/seqan/seqan3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/seqan/seqan3/labels{/name}","releases_url":"https://api.github.com/repos/seqan/seqan3/releases{/id}","deployments_url":"https://api.github.com/repos/seqan/seqan3/deployments","created_at":"2016-04-04T12:39:15Z","updated_at":"2018-10-10T09:52:16Z","pushed_at":"2018-10-12T10:59:37Z","git_url":"git://github.com/seqan/seqan3.git","ssh_url":"git@github.com:seqan/seqan3.git","clone_url":"https://github.com/seqan/seqan3.git","svn_url":"https://github.com/seqan/seqan3","homepage":"http://www.seqan.de","size":1913,"stargazers_count":35,"watchers_count":35,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":25,"mirror_url":null,"archived":false,"open_issues_count":123,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":25,"open_issues":123,"watchers":35,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/368"},"html":{"href":"https://github.com/seqan/seqan3/pull/368"},"issue":{"href":"https://api.github.com/repos/seqan/seqan3/issues/368"},"comments":{"href":"https://api.github.com/repos/seqan/seqan3/issues/368/comments"},"review_comments":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/368/comments"},"review_comment":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/368/commits"},"statuses":{"href":"https://api.github.com/repos/seqan/seqan3/statuses/448bb7163d3511e6a446fed133a3eee1861c5028"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"smehringer"}}