{"action":"created","comment":{"url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments/30528583","id":30528583,"diff_hunk":"@@ -0,0 +1,529 @@\n+# coding: utf-8\n+import codecs\n+from contextlib import contextmanager\n+import csv\n+import datetime\n+from decimal import Decimal\n+import locale\n+import os\n+import random\n+import sys\n+from tempfile import NamedTemporaryFile\n+import unittest\n+from uuid import uuid1, uuid4\n+\n+from cassandra.concurrent import execute_concurrent_with_args\n+\n+from dtest import debug, Tester\n+from tools import rows_to_list, since\n+from cqlsh_tools import csv_rows, random_list, DummyColorMap, assert_csvs_items_equal\n+\n+\n+DEFAULT_FLOAT_PRECISION = 5  # magic number copied from cqlsh script\n+\n+\n+class _CqlshCopyBase(Tester):\n+\n+    def prepare(self):\n+        self.cluster.populate(1).start(wait_for_binary_proto=True)\n+        self.node1, = self.cluster.nodelist()\n+        self.session = self.patient_cql_connection(self.node1)\n+        self.create_ks(self.session, 'ks', 1)\n+\n+    def all_datatypes_prepare(self):\n+        self.prepare()\n+        self.session.execute('''\n+            CREATE TABLE testdatatype (\n+                a ascii PRIMARY KEY,\n+                b bigint,\n+                c blob,\n+                d boolean,\n+                e decimal,\n+                f double,\n+                g float,\n+                h inet,\n+                i int,\n+                j text,\n+                k timestamp,\n+                l timeuuid,\n+                m uuid,\n+                n varchar,\n+                o varint\n+            )''')\n+        self.data = ('ascii',  # a ascii\n+                     2 ** 40,  # b bigint\n+                     0111,  # c blob\n+                     True,  # d boolean\n+                     Decimal(3.14),  # e decimal\n+                     2.444,  # f double\n+                     1.1,  # g float\n+                     '127.0.0.1',  # h inet\n+                     25,  # i int\n+                     'ヽ(´ー｀)ノ',  # j text\n+                     datetime.datetime(2005, 7, 14, 12, 30),  # k timestamp\n+                     uuid1(),  # l timeuuid\n+                     uuid4(),  # m uuid\n+                     'asdf',  # n varchar\n+                     2 ** 65  # o varint\n+                     )\n+\n+\n+# Reading from csv files to cqlsh-formatted strings would require extensive use\n+# of the deprecated cassandra-dbapi2 project, so we skip all but the simplest\n+# tests on pre-2.1 versions.\n+@since('2.1')\n+class CqlshCopyTest(_CqlshCopyBase):\n+\n+    @contextmanager\n+    def _cqlshlib(self):\n+        '''\n+        Returns the cqlshlib module, as defined in self.cluster's first node.\n+        '''\n+        # This method accomplishes its goal by manually adding the library to\n+        # sys.path, returning the module, then restoring the old path once the\n+        # context manager exits. This isn't great for maintainability and should\n+        # be replaced if cqlshlib is made easier to interact with.\n+        saved_path = list(sys.path)\n+        cassandra_dir = self.cluster.nodelist()[0].get_install_dir()\n+\n+        try:\n+            sys.path = sys.path + [os.path.join(cassandra_dir, 'pylib')]\n+            import cqlshlib\n+            yield cqlshlib\n+        finally:\n+            sys.path = saved_path\n+\n+    def assertCsvResultEqual(self, csv_filename, results):\n+        self.assertItemsEqual(list(csv_rows(csv_filename)),\n+                              list(self.result_to_csv_rows(results)))\n+\n+    def result_to_csv_rows(self, result):\n+        '''\n+        Given an object returned from a CQL query, returns a string formatted by\n+        the cqlsh formatting utilities.\n+        '''\n+        # This has no real dependencies on Tester except that self._cqlshlib has\n+        # to grab self.cluster's install directory. This should be pulled out\n+        # into a bare function if cqlshlib is made easier to interact with.\n+        with self._cqlshlib() as cqlshlib:\n+            from cqlshlib.formatting import format_value\n+            try:\n+                # doesn't properly import on 2.1, but making\n+                from cqlshlib.formatting import DateTimeFormat\n+                date_time_format = DateTimeFormat()\n+            except ImportError:\n+                date_time_format = None\n+            encoding_name = codecs.lookup(locale.getpreferredencoding()).name\n+\n+            def fmt(val):\n+                # different versions use time_format or date_time_format\n+                # but all versions reject spurious values, so we just use both\n+                # here\n+                return format_value(type(val), val,\n+                                    encoding=encoding_name,\n+                                    date_time_format=date_time_format,\n+                                    time_format=None,\n+                                    float_precision=DEFAULT_FLOAT_PRECISION,\n+                                    colormap=DummyColorMap(),\n+                                    nullval=None).strval\n+\n+        return [[fmt(v) for v in row] for row in result]\n+\n+    def test_list_data(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testlist (\n+                a int PRIMARY KEY,\n+                b list<uuid>\n+            )\"\"\")\n+\n+        insert_statement = self.session.prepare(\"INSERT INTO testlist (a, b) VALUES (?, ?)\")\n+        args = [(i, random_list(gen=uuid4)) for i in range(1000)]\n+        execute_concurrent_with_args(self.session, insert_statement, args)\n+\n+        results = list(self.session.execute(\"SELECT * FROM testlist\"))\n+\n+        tempfile = NamedTemporaryFile()\n+        debug('Exporting to csv file: {name}'.format(name=tempfile.name))\n+        self.node1.run_cqlsh(cmds=\"COPY ks.testlist TO '{name}'\".format(name=tempfile.name))\n+\n+        self.assertCsvResultEqual(tempfile.name, results)\n+\n+    def test_tuple_data(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testtuple (\n+                a int primary key,\n+                b tuple<uuid, uuid, uuid>\n+            )\"\"\")\n+\n+        insert_statement = self.session.prepare(\"INSERT INTO testtuple (a, b) VALUES (?, ?)\")\n+        args = [(i, random_list(gen=uuid4, n=3)) for i in range(1000)]\n+        execute_concurrent_with_args(self.session, insert_statement, args)\n+\n+        results = list(self.session.execute(\"SELECT * FROM testtuple\"))\n+\n+        tempfile = NamedTemporaryFile()\n+        debug('Exporting to csv file: {name}'.format(name=tempfile.name))\n+        self.node1.run_cqlsh(cmds=\"COPY ks.testtuple TO '{name}'\".format(name=tempfile.name))\n+\n+        self.assertCsvResultEqual(tempfile.name, results)\n+\n+    def non_default_delimiter_template(self, delimiter):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testdelimiter (\n+                a int primary key\n+            )\"\"\")\n+        insert_statement = self.session.prepare(\"INSERT INTO testdelimiter (a) VALUES (?)\")\n+        args = [(i,) for i in range(1000)]\n+        execute_concurrent_with_args(self.session, insert_statement, args)\n+\n+        results = list(self.session.execute(\"SELECT * FROM testdelimiter\"))\n+\n+        tempfile = NamedTemporaryFile()\n+        debug('Exporting to csv file: {name}'.format(name=tempfile.name))\n+        cmds = \"COPY ks.testdelimiter TO '{name}'\".format(name=tempfile.name)\n+        cmds += \" WITH DELIMITER = '{d}'\".format(d=delimiter)\n+        self.node1.run_cqlsh(cmds=cmds)\n+\n+        self.assertCsvResultEqual(tempfile.name, results)\n+\n+    def test_colon_delimiter(self):\n+        self.non_default_delimiter_template(':')\n+\n+    def test_letter_delimiter(self):\n+        self.non_default_delimiter_template('a')\n+\n+    def test_number_delimiter(self):\n+        self.non_default_delimiter_template('1')\n+\n+    def custom_null_indicator_template(self, indicator):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testnullindicator (\n+                a int primary key,\n+                b text\n+            )\"\"\")\n+        insert_non_null = self.session.prepare(\"INSERT INTO testnullindicator (a, b) VALUES (?, ?)\")\n+        execute_concurrent_with_args(self.session, insert_non_null,\n+                                     [(1, 'eggs'), (100, 'sausage')])\n+        insert_null = self.session.prepare(\"INSERT INTO testnullindicator (a) VALUES (?)\")\n+        execute_concurrent_with_args(self.session, insert_null, [(2,), (200,)])\n+\n+        tempfile = NamedTemporaryFile()\n+        debug('Exporting to csv file: {name}'.format(name=tempfile.name))\n+        cmds = \"COPY ks.testnullindicator TO '{name}'\".format(name=tempfile.name)\n+        cmds += \" WITH NULL = '{d}'\".format(d=indicator)\n+        self.node1.run_cqlsh(cmds=cmds)\n+\n+        results = list(self.session.execute(\"SELECT a, b FROM ks.testnullindicator\"))\n+        results = [[indicator if value is None else value for value in row]\n+                   for row in results]\n+\n+        self.assertCsvResultEqual(tempfile.name, results)\n+\n+    def test_undefined_as_null_indicator(self):\n+        self.custom_null_indicator_template('undefined')\n+\n+    def test_null_as_null_indicator(self):\n+        self.custom_null_indicator_template('null')\n+\n+    def test_writing_use_header(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testheader (\n+                a int primary key,\n+                b int\n+            )\"\"\")\n+        insert_statement = self.session.prepare(\"INSERT INTO testheader (a, b) VALUES (?, ?)\")\n+        args = [(1, 10), (2, 20), (3, 30)]\n+        execute_concurrent_with_args(self.session, insert_statement, args)\n+\n+        tempfile = NamedTemporaryFile()\n+        debug('Exporting to csv file: {name}'.format(name=tempfile.name))\n+        cmds = \"COPY ks.testheader TO '{name}'\".format(name=tempfile.name)\n+        cmds += \" WITH HEADER = true\"\n+        self.node1.run_cqlsh(cmds=cmds)\n+\n+        with open(tempfile.name, 'r') as csvfile:\n+            csv_values = list(csv.reader(csvfile))\n+\n+        self.assertEqual(len(csv_values), 4, msg=str(csv_values))\n+        self.assertSequenceEqual(csv_values,\n+                                 [['a', 'b'], ['1', '10'], ['2', '20'], ['3', '30']])\n+\n+    def test_reading_use_header(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testheader (\n+                a int primary key,\n+                b int\n+            )\"\"\")\n+\n+        tempfile = NamedTemporaryFile()\n+\n+        data = [[1, 20], [2, 40], [3, 60], [4, 80]]\n+\n+        with open(tempfile.name, 'w') as csvfile:\n+            writer = csv.DictWriter(csvfile, fieldnames=['a', 'b'])\n+            writer.writeheader()\n+            for a, b in data:\n+                writer.writerow({'a': a, 'b': b})\n+\n+        cmds = \"COPY ks.testheader FROM '{name}'\".format(name=tempfile.name)\n+        cmds += \" WITH HEADER = true\"\n+        self.node1.run_cqlsh(cmds=cmds)\n+\n+        result = self.session.execute(\"SELECT * FROM testheader\")\n+        self.assertItemsEqual([tuple(d) for d in data],\n+                              [tuple(r) for r in rows_to_list(result)])\n+\n+    def test_explicit_column_order_writing(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testorder (\n+                a int primary key,\n+                b int,\n+                c text\n+            )\"\"\")\n+\n+        data = [[1, 20, 'ham'], [2, 40, 'eggs'],\n+                [3, 60, 'beans'], [4, 80, 'toast']]\n+        insert_statement = self.session.prepare(\"INSERT INTO testorder (a, b, c) VALUES (?, ?, ?)\")\n+        execute_concurrent_with_args(self.session, insert_statement, data)\n+\n+        tempfile = NamedTemporaryFile()\n+\n+        self.node1.run_cqlsh(\n+            \"COPY ks.testorder (a, c, b) TO '{name}'\".format(name=tempfile.name))\n+\n+        reference_file = NamedTemporaryFile()\n+        with open(reference_file.name, 'w') as csvfile:\n+            writer = csv.writer(csvfile)\n+            for a, b, c in data:\n+                writer.writerow([a, c, b])\n+\n+        assert_csvs_items_equal(tempfile.name, reference_file.name)\n+\n+    def test_explicit_column_order_reading(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testorder (\n+                a int primary key,\n+                b text,\n+                c int\n+            )\"\"\")\n+\n+        data = [[1, 20, 'ham'], [2, 40, 'eggs'],\n+                [3, 60, 'beans'], [4, 80, 'toast']]\n+\n+        tempfile = NamedTemporaryFile()\n+        write_rows_to_csv(tempfile.name, data)\n+\n+        self.node1.run_cqlsh(\n+            \"COPY ks.testorder (a, c, b) FROM '{name}'\".format(name=tempfile.name))\n+\n+        results = list(self.session.execute(\"SELECT * FROM testorder\"))\n+        reference_file = NamedTemporaryFile()\n+        with open(reference_file.name, 'w') as csvfile:\n+            writer = csv.writer(csvfile)\n+            for a, b, c in data:\n+                writer.writerow([a, c, b])\n+\n+        self.assertCsvResultEqual(reference_file.name, results)\n+\n+    def test_quoted_column_names_reading(self):\n+        self.prepare()\n+        self.session.execute(\"\"\"\n+            CREATE TABLE testquoted (\n+                \"IdNumber\" int PRIMARY KEY,\n+                \"select\" text\n+            )\"\"\")\n+\n+        data = [[1, 'no'], [2, 'Yes'],\n+                [3, 'True'], [4, 'false']]\n+\n+        tempfile = NamedTemporaryFile()\n+        write_rows_to_csv(tempfile.name, data)\n+\n+        self.node1.run_cqlsh(\n+            \"\"\"COPY ks.testquoted (\"IdNumber\", \"select\") FROM '{name}'\"\"\".format(name=tempfile.name))","path":"cqlsh_tests/cqlsh_copy_tests.py","position":null,"original_position":351,"commit_id":"70894809a37fb3a291f04712b38171e5d08c6747","original_commit_id":"b5658ee23bda4cb0457432bf808fc86d323eca6d","user":{"login":"mambocab","id":3753769,"avatar_url":"https://avatars.githubusercontent.com/u/3753769?v=3","gravatar_id":"","url":"https://api.github.com/users/mambocab","html_url":"https://github.com/mambocab","followers_url":"https://api.github.com/users/mambocab/followers","following_url":"https://api.github.com/users/mambocab/following{/other_user}","gists_url":"https://api.github.com/users/mambocab/gists{/gist_id}","starred_url":"https://api.github.com/users/mambocab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mambocab/subscriptions","organizations_url":"https://api.github.com/users/mambocab/orgs","repos_url":"https://api.github.com/users/mambocab/repos","events_url":"https://api.github.com/users/mambocab/events{/privacy}","received_events_url":"https://api.github.com/users/mambocab/received_events","type":"User","site_admin":false},"body":"addressed in https://github.com/mambocab/cassandra-dtest/commit/70894809a37fb3a291f04712b38171e5d08c6747","created_at":"2015-05-18T17:27:18Z","updated_at":"2015-05-18T17:27:18Z","html_url":"https://github.com/riptano/cassandra-dtest/pull/278#discussion_r30528583","pull_request_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278","_links":{"self":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments/30528583"},"html":{"href":"https://github.com/riptano/cassandra-dtest/pull/278#discussion_r30528583"},"pull_request":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278"}}},"pull_request":{"url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278","id":35531630,"html_url":"https://github.com/riptano/cassandra-dtest/pull/278","diff_url":"https://github.com/riptano/cassandra-dtest/pull/278.diff","patch_url":"https://github.com/riptano/cassandra-dtest/pull/278.patch","issue_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/278","number":278,"state":"open","locked":false,"title":"Cassandra 9306: cqlsh COPY tests","user":{"login":"mambocab","id":3753769,"avatar_url":"https://avatars.githubusercontent.com/u/3753769?v=3","gravatar_id":"","url":"https://api.github.com/users/mambocab","html_url":"https://github.com/mambocab","followers_url":"https://api.github.com/users/mambocab/followers","following_url":"https://api.github.com/users/mambocab/following{/other_user}","gists_url":"https://api.github.com/users/mambocab/gists{/gist_id}","starred_url":"https://api.github.com/users/mambocab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mambocab/subscriptions","organizations_url":"https://api.github.com/users/mambocab/orgs","repos_url":"https://api.github.com/users/mambocab/repos","events_url":"https://api.github.com/users/mambocab/events{/privacy}","received_events_url":"https://api.github.com/users/mambocab/received_events","type":"User","site_admin":false},"body":"This adds a suite of tests for the COPY command in cqlsh, as described [here](https://issues.apache.org/jira/browse/CASSANDRA-9306).\r\n\r\nNote that I've broken off the tests into their own module, as discussed in #188 -- this kept each test file a little more managably-sized and helped me organize utility functions. I can jam all the tests back into one file if anyone has strong feelings, but personally, I prefer them this way.\r\n\r\nI've put off testing against a cluster with a failing node -- it may be better suited as part of [9172](https://issues.apache.org/jira/browse/CASSANDRA-9172), or part of the kitchen sink tests.\r\n\r\nRequesting review from @thobbs, since he filed the Jira for these.\r\n\r\nI'll squash before merging.","created_at":"2015-05-15T17:06:28Z","updated_at":"2015-05-18T17:27:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c40a445a15e4de75cacdc1debceea4869fed0e3f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278/commits","review_comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278/comments","review_comment_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments{/number}","comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/278/comments","statuses_url":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/70894809a37fb3a291f04712b38171e5d08c6747","head":{"label":"mambocab:CASSANDRA-9306","ref":"CASSANDRA-9306","sha":"70894809a37fb3a291f04712b38171e5d08c6747","user":{"login":"mambocab","id":3753769,"avatar_url":"https://avatars.githubusercontent.com/u/3753769?v=3","gravatar_id":"","url":"https://api.github.com/users/mambocab","html_url":"https://github.com/mambocab","followers_url":"https://api.github.com/users/mambocab/followers","following_url":"https://api.github.com/users/mambocab/following{/other_user}","gists_url":"https://api.github.com/users/mambocab/gists{/gist_id}","starred_url":"https://api.github.com/users/mambocab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mambocab/subscriptions","organizations_url":"https://api.github.com/users/mambocab/orgs","repos_url":"https://api.github.com/users/mambocab/repos","events_url":"https://api.github.com/users/mambocab/events{/privacy}","received_events_url":"https://api.github.com/users/mambocab/received_events","type":"User","site_admin":false},"repo":{"id":31236640,"name":"cassandra-dtest","full_name":"mambocab/cassandra-dtest","owner":{"login":"mambocab","id":3753769,"avatar_url":"https://avatars.githubusercontent.com/u/3753769?v=3","gravatar_id":"","url":"https://api.github.com/users/mambocab","html_url":"https://github.com/mambocab","followers_url":"https://api.github.com/users/mambocab/followers","following_url":"https://api.github.com/users/mambocab/following{/other_user}","gists_url":"https://api.github.com/users/mambocab/gists{/gist_id}","starred_url":"https://api.github.com/users/mambocab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mambocab/subscriptions","organizations_url":"https://api.github.com/users/mambocab/orgs","repos_url":"https://api.github.com/users/mambocab/repos","events_url":"https://api.github.com/users/mambocab/events{/privacy}","received_events_url":"https://api.github.com/users/mambocab/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mambocab/cassandra-dtest","description":"Cassandra Distributed Tests","fork":true,"url":"https://api.github.com/repos/mambocab/cassandra-dtest","forks_url":"https://api.github.com/repos/mambocab/cassandra-dtest/forks","keys_url":"https://api.github.com/repos/mambocab/cassandra-dtest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mambocab/cassandra-dtest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mambocab/cassandra-dtest/teams","hooks_url":"https://api.github.com/repos/mambocab/cassandra-dtest/hooks","issue_events_url":"https://api.github.com/repos/mambocab/cassandra-dtest/issues/events{/number}","events_url":"https://api.github.com/repos/mambocab/cassandra-dtest/events","assignees_url":"https://api.github.com/repos/mambocab/cassandra-dtest/assignees{/user}","branches_url":"https://api.github.com/repos/mambocab/cassandra-dtest/branches{/branch}","tags_url":"https://api.github.com/repos/mambocab/cassandra-dtest/tags","blobs_url":"https://api.github.com/repos/mambocab/cassandra-dtest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mambocab/cassandra-dtest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mambocab/cassandra-dtest/git/refs{/sha}","trees_url":"https://api.github.com/repos/mambocab/cassandra-dtest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mambocab/cassandra-dtest/statuses/{sha}","languages_url":"https://api.github.com/repos/mambocab/cassandra-dtest/languages","stargazers_url":"https://api.github.com/repos/mambocab/cassandra-dtest/stargazers","contributors_url":"https://api.github.com/repos/mambocab/cassandra-dtest/contributors","subscribers_url":"https://api.github.com/repos/mambocab/cassandra-dtest/subscribers","subscription_url":"https://api.github.com/repos/mambocab/cassandra-dtest/subscription","commits_url":"https://api.github.com/repos/mambocab/cassandra-dtest/commits{/sha}","git_commits_url":"https://api.github.com/repos/mambocab/cassandra-dtest/git/commits{/sha}","comments_url":"https://api.github.com/repos/mambocab/cassandra-dtest/comments{/number}","issue_comment_url":"https://api.github.com/repos/mambocab/cassandra-dtest/issues/comments{/number}","contents_url":"https://api.github.com/repos/mambocab/cassandra-dtest/contents/{+path}","compare_url":"https://api.github.com/repos/mambocab/cassandra-dtest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mambocab/cassandra-dtest/merges","archive_url":"https://api.github.com/repos/mambocab/cassandra-dtest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mambocab/cassandra-dtest/downloads","issues_url":"https://api.github.com/repos/mambocab/cassandra-dtest/issues{/number}","pulls_url":"https://api.github.com/repos/mambocab/cassandra-dtest/pulls{/number}","milestones_url":"https://api.github.com/repos/mambocab/cassandra-dtest/milestones{/number}","notifications_url":"https://api.github.com/repos/mambocab/cassandra-dtest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mambocab/cassandra-dtest/labels{/name}","releases_url":"https://api.github.com/repos/mambocab/cassandra-dtest/releases{/id}","created_at":"2015-02-23T23:58:43Z","updated_at":"2015-03-20T18:05:58Z","pushed_at":"2015-05-18T17:24:24Z","git_url":"git://github.com/mambocab/cassandra-dtest.git","ssh_url":"git@github.com:mambocab/cassandra-dtest.git","clone_url":"https://github.com/mambocab/cassandra-dtest.git","svn_url":"https://github.com/mambocab/cassandra-dtest","homepage":"","size":11782,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"riptano:master","ref":"master","sha":"be63ab82a4a7a5c9de891f4ad3eaa8bae15f90e7","user":{"login":"riptano","id":275430,"avatar_url":"https://avatars.githubusercontent.com/u/275430?v=3","gravatar_id":"","url":"https://api.github.com/users/riptano","html_url":"https://github.com/riptano","followers_url":"https://api.github.com/users/riptano/followers","following_url":"https://api.github.com/users/riptano/following{/other_user}","gists_url":"https://api.github.com/users/riptano/gists{/gist_id}","starred_url":"https://api.github.com/users/riptano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riptano/subscriptions","organizations_url":"https://api.github.com/users/riptano/orgs","repos_url":"https://api.github.com/users/riptano/repos","events_url":"https://api.github.com/users/riptano/events{/privacy}","received_events_url":"https://api.github.com/users/riptano/received_events","type":"Organization","site_admin":false},"repo":{"id":2674774,"name":"cassandra-dtest","full_name":"riptano/cassandra-dtest","owner":{"login":"riptano","id":275430,"avatar_url":"https://avatars.githubusercontent.com/u/275430?v=3","gravatar_id":"","url":"https://api.github.com/users/riptano","html_url":"https://github.com/riptano","followers_url":"https://api.github.com/users/riptano/followers","following_url":"https://api.github.com/users/riptano/following{/other_user}","gists_url":"https://api.github.com/users/riptano/gists{/gist_id}","starred_url":"https://api.github.com/users/riptano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riptano/subscriptions","organizations_url":"https://api.github.com/users/riptano/orgs","repos_url":"https://api.github.com/users/riptano/repos","events_url":"https://api.github.com/users/riptano/events{/privacy}","received_events_url":"https://api.github.com/users/riptano/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/riptano/cassandra-dtest","description":"Cassandra Distributed Tests","fork":false,"url":"https://api.github.com/repos/riptano/cassandra-dtest","forks_url":"https://api.github.com/repos/riptano/cassandra-dtest/forks","keys_url":"https://api.github.com/repos/riptano/cassandra-dtest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/riptano/cassandra-dtest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/riptano/cassandra-dtest/teams","hooks_url":"https://api.github.com/repos/riptano/cassandra-dtest/hooks","issue_events_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/events{/number}","events_url":"https://api.github.com/repos/riptano/cassandra-dtest/events","assignees_url":"https://api.github.com/repos/riptano/cassandra-dtest/assignees{/user}","branches_url":"https://api.github.com/repos/riptano/cassandra-dtest/branches{/branch}","tags_url":"https://api.github.com/repos/riptano/cassandra-dtest/tags","blobs_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/refs{/sha}","trees_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/{sha}","languages_url":"https://api.github.com/repos/riptano/cassandra-dtest/languages","stargazers_url":"https://api.github.com/repos/riptano/cassandra-dtest/stargazers","contributors_url":"https://api.github.com/repos/riptano/cassandra-dtest/contributors","subscribers_url":"https://api.github.com/repos/riptano/cassandra-dtest/subscribers","subscription_url":"https://api.github.com/repos/riptano/cassandra-dtest/subscription","commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/commits{/sha}","git_commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/commits{/sha}","comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/comments{/number}","issue_comment_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/comments{/number}","contents_url":"https://api.github.com/repos/riptano/cassandra-dtest/contents/{+path}","compare_url":"https://api.github.com/repos/riptano/cassandra-dtest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/riptano/cassandra-dtest/merges","archive_url":"https://api.github.com/repos/riptano/cassandra-dtest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/riptano/cassandra-dtest/downloads","issues_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues{/number}","pulls_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls{/number}","milestones_url":"https://api.github.com/repos/riptano/cassandra-dtest/milestones{/number}","notifications_url":"https://api.github.com/repos/riptano/cassandra-dtest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/riptano/cassandra-dtest/labels{/name}","releases_url":"https://api.github.com/repos/riptano/cassandra-dtest/releases{/id}","created_at":"2011-10-30T11:15:44Z","updated_at":"2015-05-08T19:09:35Z","pushed_at":"2015-05-18T17:24:24Z","git_url":"git://github.com/riptano/cassandra-dtest.git","ssh_url":"git@github.com:riptano/cassandra-dtest.git","clone_url":"https://github.com/riptano/cassandra-dtest.git","svn_url":"https://github.com/riptano/cassandra-dtest","homepage":"","size":16841,"stargazers_count":57,"watchers_count":57,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":34,"mirror_url":null,"open_issues_count":30,"forks":34,"open_issues":30,"watchers":57,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278"},"html":{"href":"https://github.com/riptano/cassandra-dtest/pull/278"},"issue":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/issues/278"},"comments":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/issues/278/comments"},"review_comments":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278/comments"},"review_comment":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/278/commits"},"statuses":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/70894809a37fb3a291f04712b38171e5d08c6747"}}}}