{"action":"created","comment":{"url":"https://api.github.com/repos/pydata/pandas/pulls/comments/35527405","id":35527405,"diff_hunk":"@@ -68,27 +72,207 @@ def get_writer(engine_name):\n         raise ValueError(\"No Excel writer '%s'\" % engine_name)\n \n \n+class BaseFile(object):\n+    \"\"\"Base class for excel readers\n+\n+    A file class can be initialized even if the engine is not installed.\n+    If the engine is not installed, io_class and _open_workbook are None.\n+    When attempting to use open_workbook while _open_workbook is None, the\n+    relevant ImportError is raised. When calling is_ext, False is retunred when\n+    the reader is not installed.\n+    \"\"\"\n+    # added in order to deal with both Open Document Format and MS Excel\n+    # fil types, see PR #9070\n+\n+    def __init__(self, engine=None):\n+        \"\"\"Set the engine name, and extension. If the engine is not installed,\n+        io_class and _open_workbook are both None.\n+        \"\"\"\n+        self.engine = engine\n+        self.io_class = None\n+        self._open_workbook = None\n+\n+    def open_workbook(self, *args, **kwargs):\n+        \"\"\"Explicitely load the engine again (and trigger an ImportError in the\n+        process) if _open_workbook is set to None.\n+        \"\"\"\n+        # try to load the engine again and raise import error if required\n+        if self._open_workbook is None:\n+            self.load_engine()\n+        # just in case the user passes an already opened workbook of io_class\n+        if len(args) > 0 and isinstance(args[0], self.io_class):\n+            return args[0]\n+        return self._open_workbook(*args, **kwargs)\n+\n+    def create(self, io, engine=None):\n+        \"\"\"Create the appropriate speadsheet book based on io and optionally\n+        engine.\n+\n+        Paratemeters\n+        ------------\n+        io : string, file-like object or xlrd/ezodf workbook\n+            If a string, expected to be a path to xls, xlsx, or ods file.\n+            File-like objects or buffers are only supported for xlrd types.\n+\n+        engine: string, default None\n+            If io is not a buffer or path, this must be set to identify io.\n+            Acceptable values are None, xlrd, or ezodf\n+\n+        Returns\n+        -------\n+        engine : string\n+            Engine used for reading the io\n+\n+        book : object\n+            The spreadsheet book class created by the engine.\n+        \"\"\"\n+\n+        if engine is not None:\n+            try:\n+                reader = _readers[engine]\n+            except KeyError:\n+                msg = 'Excel reader engine \"%s\" is not implemented' % engine\n+                raise NotImplementedError(msg)\n+            # load_engine throws the relevant import error if not installed\n+            reader.load_engine()\n+            self.book = reader.open_workbook(io)\n+            self.engine = engine\n+            return self.engine, self.book\n+\n+        if isinstance(io, compat.string_types):\n+            ext = io.split('.')[-1]\n+            try:\n+                reader = _reader_extensions[ext]\n+            except KeyError:\n+                msg = 'No support implemented for extension \"%s\"' % ext\n+                raise NotImplementedError(msg)\n+            reader.load_engine()\n+            if _is_url(io):\n+                data = _urlopen(io).read()\n+                self.book = reader.read_buffer(data)\n+            else:\n+                self.book = reader.open_workbook(io)\n+            self.engine = reader.engine\n+            return self.engine, self.book\n+\n+        # try to determine the reader type based on properties of installed\n+        # reader modules.\n+        for engine, reader in compat.iteritems(_readers):\n+            # only try to import readers that have not been imported before\n+            if reader.io_class is None:\n+                try:\n+                    reader.load_engine()\n+                # if the reader is not installed, the user could not have\n+                # passed the corresponding reader.io_class, so it is safe\n+                # to assume that io is not the current reader\n+                except ImportError:\n+                    continue\n+            # Does the io type match the current available reader?\n+            if isinstance(io, reader.io_class):\n+                self.engine = engine\n+                self.book = io\n+                return self.engine, self.book\n+            # xlrd has some additional/alternative reading mechanisms:\n+            elif engine=='xlrd' and hasattr(io, \"read\"):\n+                xlrd_f = _readers['xlrd']\n+                # N.B. xlrd.Book has a read attribute too\n+                self.book = xlrd_f.read_buffer(io.read())\n+                self.engine = engine\n+                return self.engine, self.book\n+\n+        raise ValueError('Must explicitly set engine if not passing in buffer '\n+                         'or path for io.')\n+\n+\n+class XLRDFile(BaseFile):\n+    \"\"\"File reader class for MS Excel spreadsheets (depends on xlrd)\n+    \"\"\"\n+    extensions = ['xls', 'xlsx', 'xlsm']\n+\n+    def __init__(self, engine='xlrd'):\n+        # engine, extensions, are defined here, but io_class and open_workbook\n+        # are only defined when importing the engine\n+        super(XLRDFile, self).__init__(engine=engine)\n+\n+    def load_engine(self):\n+        import xlrd  # throw an ImportError if we need to\n+        ver = tuple(map(int, xlrd.__VERSION__.split(\".\")[:2]))\n+        if ver < (0, 9):  # pragma: no cover\n+            raise ImportError(\"pandas requires xlrd >= 0.9.0 for excel \"\n+                              \"support, current version \" + xlrd.__VERSION__)\n+        else:\n+            self._open_workbook = xlrd.open_workbook\n+            self.io_class = xlrd.Book\n+        return True\n+\n+    def read_buffer(self, data):\n+        \"\"\"Read from a buffer\n+        \"\"\"\n+        return self.open_workbook(file_contents=data)\n+\n+\n+class EZODFFile(BaseFile):\n+    \"\"\"File reader class for ODF spreadsheets (depends on ezodf)\n+    \"\"\"\n+    extensions = ['ods']\n+\n+    def __init__(self, engine='ezodf'):\n+        # engine, extensions, are defined here, but io_class and open_workbook","path":"pandas/io/excel.py","position":167,"original_position":167,"commit_id":"c7fea57a217aa50bd09e2624622ca44ac9dd3fbc","original_commit_id":"c7fea57a217aa50bd09e2624622ca44ac9dd3fbc","user":{"login":"jreback","id":953992,"avatar_url":"https://avatars.githubusercontent.com/u/953992?v=3","gravatar_id":"","url":"https://api.github.com/users/jreback","html_url":"https://github.com/jreback","followers_url":"https://api.github.com/users/jreback/followers","following_url":"https://api.github.com/users/jreback/following{/other_user}","gists_url":"https://api.github.com/users/jreback/gists{/gist_id}","starred_url":"https://api.github.com/users/jreback/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jreback/subscriptions","organizations_url":"https://api.github.com/users/jreback/orgs","repos_url":"https://api.github.com/users/jreback/repos","events_url":"https://api.github.com/users/jreback/events{/privacy}","received_events_url":"https://api.github.com/users/jreback/received_events","type":"User","site_admin":false},"body":"so just set the engine as as a class attribute, e.g. here would be ``engine='ezodf'``. you don't need the ``__init__`` method in the sub-class then.","created_at":"2015-07-27T11:46:12Z","updated_at":"2015-07-27T11:46:12Z","html_url":"https://github.com/pydata/pandas/pull/9070#discussion_r35527405","pull_request_url":"https://api.github.com/repos/pydata/pandas/pulls/9070","_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments/35527405"},"html":{"href":"https://github.com/pydata/pandas/pull/9070#discussion_r35527405"},"pull_request":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9070"}}},"pull_request":{"url":"https://api.github.com/repos/pydata/pandas/pulls/9070","id":26020578,"html_url":"https://github.com/pydata/pandas/pull/9070","diff_url":"https://github.com/pydata/pandas/pull/9070.diff","patch_url":"https://github.com/pydata/pandas/pull/9070.patch","issue_url":"https://api.github.com/repos/pydata/pandas/issues/9070","number":9070,"state":"open","locked":false,"title":"ENH: Open Document Format ODS support in read_excel()","user":{"login":"davidovitch","id":2007257,"avatar_url":"https://avatars.githubusercontent.com/u/2007257?v=3","gravatar_id":"","url":"https://api.github.com/users/davidovitch","html_url":"https://github.com/davidovitch","followers_url":"https://api.github.com/users/davidovitch/followers","following_url":"https://api.github.com/users/davidovitch/following{/other_user}","gists_url":"https://api.github.com/users/davidovitch/gists{/gist_id}","starred_url":"https://api.github.com/users/davidovitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidovitch/subscriptions","organizations_url":"https://api.github.com/users/davidovitch/orgs","repos_url":"https://api.github.com/users/davidovitch/repos","events_url":"https://api.github.com/users/davidovitch/events{/privacy}","received_events_url":"https://api.github.com/users/davidovitch/received_events","type":"User","site_admin":false},"body":"This work should eventually lead to a reader and writer for ods spreadsheets (LibreOffice / OpenOffice Open Document Format). I am doing this work in the master of my clone of pandas. From the wiki I understood it is fine for me to commit to my master and rebase with upstream from time to time. Please let me know if I should follow another git workflow (this is my first PR).\r\n\r\nThis is what I have so far:\r\n* It seems to make sense to implement an OdsFile and OdsWriter in pandas/io/excel.py\r\n* I created ods test files identical to the other Excel test files.\r\n* Basic reading works, but does not handle all corner cases correctly yet\r\n* Tests and WritingOds are not implemented yet\r\n\r\nI am not sure how to approach the following issues:\r\n\r\n* For the tests, it would make sense to also use pandas/io/tests/test_excel.py (there would be a lot of code duplication otherwise). However, this would require some kind of a more elaborate test skipping mechanism than currently implemented. One could have ods dependencies installed, but not the Excel ones and vice versa. \r\n* When considering pandas could support more spreadsheet formats, does it make sense to rename pandas/io/excel.py to spreadsheet.py, and correspondingly, read_excel to read_spreadsheet? I guess this is not easy since it a lot of stuff out there already counts on the excel naming scheme.\r\n\r\nFor the record, there is one message on the [mailing list](https://groups.google.com/forum/?fromgroups#!topic/pydata/Zv-BXJNsP2U), and this PR will fix issue #2311.\r\n\r\nods support depends on [ezodf](https://github.com/T0ha/ezodf), and issue #2311 mentions some of the alternatives.","created_at":"2014-12-13T11:45:25Z","updated_at":"2015-07-27T11:46:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"42f03d87231f23ee6064f956d9b60a12e286f791","assignee":null,"milestone":{"url":"https://api.github.com/repos/pydata/pandas/milestones/32","html_url":"https://github.com/pydata/pandas/milestones/Next%20Major%20Release","labels_url":"https://api.github.com/repos/pydata/pandas/milestones/32/labels","id":933188,"number":32,"title":"Next Major Release","description":"after 0.16.1 of course","creator":{"login":"jreback","id":953992,"avatar_url":"https://avatars.githubusercontent.com/u/953992?v=3","gravatar_id":"","url":"https://api.github.com/users/jreback","html_url":"https://github.com/jreback","followers_url":"https://api.github.com/users/jreback/followers","following_url":"https://api.github.com/users/jreback/following{/other_user}","gists_url":"https://api.github.com/users/jreback/gists{/gist_id}","starred_url":"https://api.github.com/users/jreback/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jreback/subscriptions","organizations_url":"https://api.github.com/users/jreback/orgs","repos_url":"https://api.github.com/users/jreback/repos","events_url":"https://api.github.com/users/jreback/events{/privacy}","received_events_url":"https://api.github.com/users/jreback/received_events","type":"User","site_admin":false},"open_issues":806,"closed_issues":57,"state":"open","created_at":"2015-01-13T10:53:19Z","updated_at":"2015-07-26T17:41:35Z","due_on":"2015-11-30T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/pydata/pandas/pulls/9070/commits","review_comments_url":"https://api.github.com/repos/pydata/pandas/pulls/9070/comments","review_comment_url":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pydata/pandas/issues/9070/comments","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/c7fea57a217aa50bd09e2624622ca44ac9dd3fbc","head":{"label":"davidovitch:master","ref":"master","sha":"c7fea57a217aa50bd09e2624622ca44ac9dd3fbc","user":{"login":"davidovitch","id":2007257,"avatar_url":"https://avatars.githubusercontent.com/u/2007257?v=3","gravatar_id":"","url":"https://api.github.com/users/davidovitch","html_url":"https://github.com/davidovitch","followers_url":"https://api.github.com/users/davidovitch/followers","following_url":"https://api.github.com/users/davidovitch/following{/other_user}","gists_url":"https://api.github.com/users/davidovitch/gists{/gist_id}","starred_url":"https://api.github.com/users/davidovitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidovitch/subscriptions","organizations_url":"https://api.github.com/users/davidovitch/orgs","repos_url":"https://api.github.com/users/davidovitch/repos","events_url":"https://api.github.com/users/davidovitch/events{/privacy}","received_events_url":"https://api.github.com/users/davidovitch/received_events","type":"User","site_admin":false},"repo":{"id":27941103,"name":"pandas","full_name":"davidovitch/pandas","owner":{"login":"davidovitch","id":2007257,"avatar_url":"https://avatars.githubusercontent.com/u/2007257?v=3","gravatar_id":"","url":"https://api.github.com/users/davidovitch","html_url":"https://github.com/davidovitch","followers_url":"https://api.github.com/users/davidovitch/followers","following_url":"https://api.github.com/users/davidovitch/following{/other_user}","gists_url":"https://api.github.com/users/davidovitch/gists{/gist_id}","starred_url":"https://api.github.com/users/davidovitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidovitch/subscriptions","organizations_url":"https://api.github.com/users/davidovitch/orgs","repos_url":"https://api.github.com/users/davidovitch/repos","events_url":"https://api.github.com/users/davidovitch/events{/privacy}","received_events_url":"https://api.github.com/users/davidovitch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/davidovitch/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":true,"url":"https://api.github.com/repos/davidovitch/pandas","forks_url":"https://api.github.com/repos/davidovitch/pandas/forks","keys_url":"https://api.github.com/repos/davidovitch/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/davidovitch/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/davidovitch/pandas/teams","hooks_url":"https://api.github.com/repos/davidovitch/pandas/hooks","issue_events_url":"https://api.github.com/repos/davidovitch/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/davidovitch/pandas/events","assignees_url":"https://api.github.com/repos/davidovitch/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/davidovitch/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/davidovitch/pandas/tags","blobs_url":"https://api.github.com/repos/davidovitch/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/davidovitch/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/davidovitch/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/davidovitch/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/davidovitch/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/davidovitch/pandas/languages","stargazers_url":"https://api.github.com/repos/davidovitch/pandas/stargazers","contributors_url":"https://api.github.com/repos/davidovitch/pandas/contributors","subscribers_url":"https://api.github.com/repos/davidovitch/pandas/subscribers","subscription_url":"https://api.github.com/repos/davidovitch/pandas/subscription","commits_url":"https://api.github.com/repos/davidovitch/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/davidovitch/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/davidovitch/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/davidovitch/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/davidovitch/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/davidovitch/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/davidovitch/pandas/merges","archive_url":"https://api.github.com/repos/davidovitch/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/davidovitch/pandas/downloads","issues_url":"https://api.github.com/repos/davidovitch/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/davidovitch/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/davidovitch/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/davidovitch/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/davidovitch/pandas/labels{/name}","releases_url":"https://api.github.com/repos/davidovitch/pandas/releases{/id}","created_at":"2014-12-12T22:41:43Z","updated_at":"2015-04-30T09:05:29Z","pushed_at":"2015-07-26T10:01:19Z","git_url":"git://github.com/davidovitch/pandas.git","ssh_url":"git@github.com:davidovitch/pandas.git","clone_url":"https://github.com/davidovitch/pandas.git","svn_url":"https://github.com/davidovitch/pandas","homepage":"http://pandas.pydata.org","size":55848,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pydata:master","ref":"master","sha":"5a9a9da80c1a8b3e146f579f581261257b604f66","user":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"repo":{"id":858127,"name":"pandas","full_name":"pydata/pandas","owner":{"login":"pydata","id":1284191,"avatar_url":"https://avatars.githubusercontent.com/u/1284191?v=3","gravatar_id":"","url":"https://api.github.com/users/pydata","html_url":"https://github.com/pydata","followers_url":"https://api.github.com/users/pydata/followers","following_url":"https://api.github.com/users/pydata/following{/other_user}","gists_url":"https://api.github.com/users/pydata/gists{/gist_id}","starred_url":"https://api.github.com/users/pydata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pydata/subscriptions","organizations_url":"https://api.github.com/users/pydata/orgs","repos_url":"https://api.github.com/users/pydata/repos","events_url":"https://api.github.com/users/pydata/events{/privacy}","received_events_url":"https://api.github.com/users/pydata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pydata/pandas","description":"Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more","fork":false,"url":"https://api.github.com/repos/pydata/pandas","forks_url":"https://api.github.com/repos/pydata/pandas/forks","keys_url":"https://api.github.com/repos/pydata/pandas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pydata/pandas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pydata/pandas/teams","hooks_url":"https://api.github.com/repos/pydata/pandas/hooks","issue_events_url":"https://api.github.com/repos/pydata/pandas/issues/events{/number}","events_url":"https://api.github.com/repos/pydata/pandas/events","assignees_url":"https://api.github.com/repos/pydata/pandas/assignees{/user}","branches_url":"https://api.github.com/repos/pydata/pandas/branches{/branch}","tags_url":"https://api.github.com/repos/pydata/pandas/tags","blobs_url":"https://api.github.com/repos/pydata/pandas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pydata/pandas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pydata/pandas/git/refs{/sha}","trees_url":"https://api.github.com/repos/pydata/pandas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pydata/pandas/statuses/{sha}","languages_url":"https://api.github.com/repos/pydata/pandas/languages","stargazers_url":"https://api.github.com/repos/pydata/pandas/stargazers","contributors_url":"https://api.github.com/repos/pydata/pandas/contributors","subscribers_url":"https://api.github.com/repos/pydata/pandas/subscribers","subscription_url":"https://api.github.com/repos/pydata/pandas/subscription","commits_url":"https://api.github.com/repos/pydata/pandas/commits{/sha}","git_commits_url":"https://api.github.com/repos/pydata/pandas/git/commits{/sha}","comments_url":"https://api.github.com/repos/pydata/pandas/comments{/number}","issue_comment_url":"https://api.github.com/repos/pydata/pandas/issues/comments{/number}","contents_url":"https://api.github.com/repos/pydata/pandas/contents/{+path}","compare_url":"https://api.github.com/repos/pydata/pandas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pydata/pandas/merges","archive_url":"https://api.github.com/repos/pydata/pandas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pydata/pandas/downloads","issues_url":"https://api.github.com/repos/pydata/pandas/issues{/number}","pulls_url":"https://api.github.com/repos/pydata/pandas/pulls{/number}","milestones_url":"https://api.github.com/repos/pydata/pandas/milestones{/number}","notifications_url":"https://api.github.com/repos/pydata/pandas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pydata/pandas/labels{/name}","releases_url":"https://api.github.com/repos/pydata/pandas/releases{/id}","created_at":"2010-08-24T01:37:33Z","updated_at":"2015-07-27T11:05:05Z","pushed_at":"2015-07-27T11:42:46Z","git_url":"git://github.com/pydata/pandas.git","ssh_url":"git@github.com:pydata/pandas.git","clone_url":"https://github.com/pydata/pandas.git","svn_url":"https://github.com/pydata/pandas","homepage":"http://pandas.pydata.org","size":149891,"stargazers_count":4699,"watchers_count":4699,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1789,"mirror_url":null,"open_issues_count":1511,"forks":1789,"open_issues":1511,"watchers":4699,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9070"},"html":{"href":"https://github.com/pydata/pandas/pull/9070"},"issue":{"href":"https://api.github.com/repos/pydata/pandas/issues/9070"},"comments":{"href":"https://api.github.com/repos/pydata/pandas/issues/9070/comments"},"review_comments":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9070/comments"},"review_comment":{"href":"https://api.github.com/repos/pydata/pandas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pydata/pandas/pulls/9070/commits"},"statuses":{"href":"https://api.github.com/repos/pydata/pandas/statuses/c7fea57a217aa50bd09e2624622ca44ac9dd3fbc"}}}}