{"action":"created","comment":{"url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments/30912327","id":30912327,"diff_hunk":"@@ -0,0 +1,375 @@\n+/* -------------------------------------------------------------------------- *\n+ *                OpenSim:  testComponentInterface.cpp                        *\n+ * -------------------------------------------------------------------------- *\n+ * The OpenSim API is a toolkit for musculoskeletal modeling and simulation.  *\n+ * See http://opensim.stanford.edu and the NOTICE file for more information.  *\n+ * OpenSim is developed at Stanford University and supported by the US        *\n+ * National Institutes of Health (U54 GM072970, R24 HD065690) and by DARPA    *\n+ * through the Warrior Web program.                                           *\n+ *                                                                            *\n+ * Copyright (c) 2005-2015 Stanford University and the Authors                *\n+ * Author(s): Ajay Seth                                                       *\n+ *                                                                            *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may    *\n+ * not use this file except in compliance with the License. You may obtain a  *\n+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0.         *\n+ *                                                                            *\n+ * Unless required by applicable law or agreed to in writing, software        *\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,          *\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *\n+ * See the License for the specific language governing permissions and        *\n+ * limitations under the License.                                             *\n+ * -------------------------------------------------------------------------- */\n+#include <OpenSim/Auxiliary/auxiliaryTestFunctions.h>\n+#include <OpenSim/Common/DataTable.h>\n+#include <OpenSim/Common/TimeSeriesData.h>\n+#include <OpenSim/Common/CSVFileAdapter.h>\n+\n+namespace OpenSim {\n+\n+template <> struct Object_GetClassName<SimTK::Mat22>\n+{\n+    static const std::string name() { return \"Mat22\"; }\n+};\n+\n+} // OpenSim namespace\n+\n+using namespace OpenSim;\n+\n+//=============================================================================\n+/**\n+* StreamWriter is a concrete class defining an interface for writing\n+* out the contents of a DataTable to a stream. It controls access to a stream.\n+*/\n+template<typename DataType = SimTK::Real>\n+class StreamWriter : public DataAdapter {\n+\n+public:\n+    StreamWriter() : DataAdapter() {\n+        setAccessMode(std::ios_base::out);\n+    }\n+\n+    virtual ~StreamWriter() {}\n+\n+    StreamWriter(std::ostream& out) : _outputstream(&out) {\n+        setAccessMode(std::ios_base::out);\n+    }\n+\n+    StreamWriter* clone() const override { return new StreamWriter(*this); }\n+\n+protected:\n+\n+    bool extendOpenDataSource() override {\n+        if (_outputstream.empty()){\n+            std::cout << \"StreamWriter::extendOpenDataSrouce() \"\n+                << \"No output stream open.\\n\"\n+                << \" Assuming std::cout.\" << std::endl;\n+            _outputstream = std::cout;\n+        }\n+        return true;\n+    }\n+\n+    bool extendCloseDataSource() override {\n+        if (_outputstream.empty()){\n+            _outputstream.clear();\n+        }\n+        return true;\n+    }\n+\n+    void extendPrepareForWriting(const AbstractDataTable& dt) override {\n+        _outTable = &(DataTable_<DataType>::downcast(dt));\n+        *_outputstream << dt.getDataTypeInfo().name() << \"\\n\";\n+        *_outputstream << dt.getColumnLabels() << \"\\n\";\n+    }\n+\n+    /** extend the writing capability of the DataAdapter to write out\n+    the data to a std::ostream */\n+    bool extendWrite() override {\n+        for (size_t rix = 0; rix < _outTable->getNumRows(); ++rix) {\n+            *_outputstream << _outTable->getRow(rix) << std::endl;\n+        }\n+        return true;\n+    }\n+\n+private:\n+    SimTK::ReferencePtr<std::ostream> _outputstream;\n+    SimTK::ReferencePtr<const DataTable_<DataType> > _outTable;\n+\n+    //=============================================================================\n+};  // END of class StreamWriter\n+\n+\n+//=============================================================================\n+/**\n+* StreamReader is a concrete class defining an interface for reading in\n+* the contents of a DataTable from a stream. It controls access to a stream.\n+*/\n+template<typename DataType = SimTK::Real>\n+class StreamReader : public DataAdapter {\n+    //    OpenSim_DECLARE_CONCRETE_OBJECT_T(StreamReader, DataType, DataAdapter);\n+\n+public:\n+    StreamReader() : DataAdapter() { setAccessMode(std::ios_base::out); }\n+    virtual ~StreamReader() {}\n+\n+    StreamReader(std::istream& in) : _inputstream(&in) {\n+        setAccessMode(std::ios_base::in);\n+    }\n+\n+    StreamReader* clone() const override { return new StreamReader(*this); }\n+\n+    bool extendOpenDataSource() override {\n+        if (_inputstream.empty()){\n+            throw std::runtime_error(\n+                \"StreamReader::extendPrepareForReading(): \"\n+                \"No input stream specified.\\n\"\n+                \"Assuming std::cin.\");\n+        }\n+        return true;\n+    }\n+\n+    bool extendCloseDataSource() override {\n+        if (_inputstream.empty()){\n+            _inputstream.clear();\n+        }\n+        return true;\n+    }\n+\n+    void extendPrepareForReading(AbstractDataTable& dt) const override {\n+        _inTable = &DataTable_<DataType>::downcast(dt);\n+    }\n+\n+    /** extend the reading capability of the DataAdapter to write out table\n+        to a std::istream. Currently implementation is for demonstration only\n+        and does not parse the row into valid values. */\n+    bool extendRead() const override {\n+        std::string rowString;\n+        std::getline(*_inputstream, rowString);\n+        std::cout << \"StreamReader::readNextRow() input stream contains:\";\n+        std::cout << rowString << std::endl;\n+        SimTK::RowVector_<DataType> row(int(_inTable->getNumCols()), DataType(0));\n+        _inTable->appendRow(row);\n+        return !_inputstream->eof();\n+    }\n+\n+private:\n+    SimTK::ReferencePtr<std::istream> _inputstream;\n+    mutable SimTK::ReferencePtr<DataTable_<DataType> > _inTable;\n+};\n+\n+using namespace std;\n+using namespace SimTK;\n+\n+int main() {\n+\n+    try {\n+        DataAdapter::registerDataAdapter(\"streamWriter\",\n+            StreamWriter<SimTK::Real>());\n+        DataAdapter::registerDataAdapter(\"csv\", CSVFileReader());\n+\n+        // create a data table of Vec3's, which would be like marker data\n+        DataTable_<Vec3> markers(1,4);\n+        RowVector_<Vec3> r0(4, Vec3(1.0, 1.0, 1.0));\n+        RowVector_<Vec3> r1(4, Vec3(2.0, 2.0, 2.0));\n+        RowVector_<Vec3> r2(4, Vec3(3.0, 3.0, 3.0));\n+        \n+        // Update the table by row\n+        markers.updRow(0) = r0;\n+        // TODO updating the next row should throw an exception since markers\n+        // should only have 1 row. Currently aborts in release. SimTK::Matrix\n+        // checks in debug.\n+        //ASSERT_THROW(std::exception, markers.updRow(1) = r1);\n+\n+        // Append more rows to grow the table.\n+        markers.appendRow(r1);\n+        markers.appendRow(r2);\n+        cout << \"HERE 2\" << endl;\n+        ASSERT_THROW(std::exception,\n+             markers.appendRow(RowVector_<Vec3>(3, Vec3(4.0, 4.0, 4.0))) );\n+\n+        // create and update column labels for the table of marker data\n+        Array<string> labels;\n+        labels.append(\"mark1\"); labels.append(\"mark2\"); \n+        labels.append(\"mark3\"); labels.append(\"mark4\");\n+        markers.updColumnLabels() = labels;\n+\n+        // demonstrate row and column access of the data table\n+        size_t nr = markers.getNumRows();\n+        size_t nc = markers.getNumCols();\n+\n+        cout << \"Markers has \" << nr << \" rows, \" << nc << \" columns.\" << endl;\n+        cout << \"Marker columns are \" << markers.getColumnLabels() << endl;\n+\n+        const RowVector_<Vec3> row = markers.getRow(2);\n+        row.dump(\"Row 2 markers\");\n+\n+        const Vector_<Vec3> column = markers.getColumn(3);\n+        column.dump(\"Column 3 marker\");\n+\n+        cout << \"Element(1,3) = \" << markers.getElement(1, 3) << endl;\n+\n+        cout << \"Markers Table:\" << endl;\n+        // exercise DataTable's output operator\n+        cout << markers << endl;\n+\n+        // DataTable is our typical table of Real numbers\n+        DataTable table;\n+        // Build up the table by row\n+        table.appendRow(RowVector(5, 0.1));\n+        table.appendRow(RowVector(5, 0.2));\n+        table.appendRow(RowVector(5, 0.3));\n+\n+        nr = table.getNumRows();\n+        nc = table.getNumCols();\n+\n+        cout << \"\\nTable of values has \" << nr << \" rows, \" << nc << \" columns.\" << endl;\n+\n+        labels.setSize(0);\n+        labels.append(\"time\");\n+        for (int i = 1; i < nc; ++i){\n+            stringstream label;\n+            label << \"col\" << i;\n+            labels.append(label.str());\n+        }\n+\n+        table.updColumnLabels() = labels;","path":"OpenSim/Common/Test/testDataInterface.cpp","position":235,"original_position":235,"commit_id":"21807925adc2477e3a87536faf084105b794b29c","original_commit_id":"21807925adc2477e3a87536faf084105b794b29c","user":{"login":"chrisdembia","id":846001,"avatar_url":"https://avatars.githubusercontent.com/u/846001?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisdembia","html_url":"https://github.com/chrisdembia","followers_url":"https://api.github.com/users/chrisdembia/followers","following_url":"https://api.github.com/users/chrisdembia/following{/other_user}","gists_url":"https://api.github.com/users/chrisdembia/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisdembia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisdembia/subscriptions","organizations_url":"https://api.github.com/users/chrisdembia/orgs","repos_url":"https://api.github.com/users/chrisdembia/repos","events_url":"https://api.github.com/users/chrisdembia/events{/privacy}","received_events_url":"https://api.github.com/users/chrisdembia/received_events","type":"User","site_admin":false},"body":"This might not be an obvious way for many less-fluent C++ users to update all the labels.","created_at":"2015-05-22T17:01:42Z","updated_at":"2015-05-22T17:01:42Z","html_url":"https://github.com/opensim-org/opensim-core/pull/456#discussion_r30912327","pull_request_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456","_links":{"self":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments/30912327"},"html":{"href":"https://github.com/opensim-org/opensim-core/pull/456#discussion_r30912327"},"pull_request":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456"}}},"pull_request":{"url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456","id":36001952,"html_url":"https://github.com/opensim-org/opensim-core/pull/456","diff_url":"https://github.com/opensim-org/opensim-core/pull/456.diff","patch_url":"https://github.com/opensim-org/opensim-core/pull/456.patch","issue_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/456","number":456,"state":"open","locked":false,"title":"Data handling interface prototype","user":{"login":"aseth1","id":6494122,"avatar_url":"https://avatars.githubusercontent.com/u/6494122?v=3","gravatar_id":"","url":"https://api.github.com/users/aseth1","html_url":"https://github.com/aseth1","followers_url":"https://api.github.com/users/aseth1/followers","following_url":"https://api.github.com/users/aseth1/following{/other_user}","gists_url":"https://api.github.com/users/aseth1/gists{/gist_id}","starred_url":"https://api.github.com/users/aseth1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aseth1/subscriptions","organizations_url":"https://api.github.com/users/aseth1/orgs","repos_url":"https://api.github.com/users/aseth1/repos","events_url":"https://api.github.com/users/aseth1/events{/privacy}","received_events_url":"https://api.github.com/users/aseth1/received_events","type":"User","site_admin":false},"body":"This PR is to encourage the review of two new abstractions: DataTable and DataAdapter, which define interfaces for in memory data access and for reading in and writing out data from/to varying data sources, respectively. The main objective of these classes is to separate in memory data access (tables)  from I/O (adapters) and enable I/O with multiple types of sources (e.g. different file formats, streaming devices, etc...). These operations are currently combined in the current `Storage` class which has a confusing interface and supports only two related formats (.sto and .mot).  A third format (.trc for markers) is handled by yet another `MarkerData` container that only has the capability to read .trc and .sto files. Separating the concept of consumable data from its source and I/O capability is the first step towards more robust and reusable data handling in OpenSim.\r\n\r\nIn order or priority review:\r\n\r\n1. DataTable.h which will eventually be the replacement for the Storage class as a container of results.\r\n\r\n2. DataAdapter.h who's concrete implementations are intended to read/write tables from/to specific sources and should enable user/developers to define and register their own adapters (that can read their formats) with DataTable (and its subclasses being complete unawares).\r\n\r\n3. TimeSeriesData to hold data (columns) that are trajectories in time (by row)\r\n\r\n4. testDataInterface.cpp that demonstrates some use cases for the interface in creating tables and reading them in and writing them out.\r\n\r\n5. The rest are mostly bare bones implementation to support the prototypes exercised in testDataInterface.\r\n\r\n@sherm1 @klshrinidhi @aymanhab  please, have at it!\r\n@chrisdembia @msdemers  If you guys have some time, look at 1, 2 and 4.","created_at":"2015-05-22T05:43:15Z","updated_at":"2015-05-22T17:01:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0ad3471078ea81c76568d68106ac20bcfde833cd","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456/commits","review_comments_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456/comments","review_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/456/comments","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/21807925adc2477e3a87536faf084105b794b29c","head":{"label":"opensim-org:DataHandlingInterfacePrototype","ref":"DataHandlingInterfacePrototype","sha":"21807925adc2477e3a87536faf084105b794b29c","user":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20775600,"name":"opensim-core","full_name":"opensim-org/opensim-core","owner":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opensim-org/opensim-core","description":"SimTK OpenSim C++ libraries and comand-line applications and Java/Python wrapping.","fork":false,"url":"https://api.github.com/repos/opensim-org/opensim-core","forks_url":"https://api.github.com/repos/opensim-org/opensim-core/forks","keys_url":"https://api.github.com/repos/opensim-org/opensim-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opensim-org/opensim-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opensim-org/opensim-core/teams","hooks_url":"https://api.github.com/repos/opensim-org/opensim-core/hooks","issue_events_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/events{/number}","events_url":"https://api.github.com/repos/opensim-org/opensim-core/events","assignees_url":"https://api.github.com/repos/opensim-org/opensim-core/assignees{/user}","branches_url":"https://api.github.com/repos/opensim-org/opensim-core/branches{/branch}","tags_url":"https://api.github.com/repos/opensim-org/opensim-core/tags","blobs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opensim-org/opensim-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/opensim-org/opensim-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/{sha}","languages_url":"https://api.github.com/repos/opensim-org/opensim-core/languages","stargazers_url":"https://api.github.com/repos/opensim-org/opensim-core/stargazers","contributors_url":"https://api.github.com/repos/opensim-org/opensim-core/contributors","subscribers_url":"https://api.github.com/repos/opensim-org/opensim-core/subscribers","subscription_url":"https://api.github.com/repos/opensim-org/opensim-core/subscription","commits_url":"https://api.github.com/repos/opensim-org/opensim-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/opensim-org/opensim-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/opensim-org/opensim-core/contents/{+path}","compare_url":"https://api.github.com/repos/opensim-org/opensim-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opensim-org/opensim-core/merges","archive_url":"https://api.github.com/repos/opensim-org/opensim-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opensim-org/opensim-core/downloads","issues_url":"https://api.github.com/repos/opensim-org/opensim-core/issues{/number}","pulls_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls{/number}","milestones_url":"https://api.github.com/repos/opensim-org/opensim-core/milestones{/number}","notifications_url":"https://api.github.com/repos/opensim-org/opensim-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opensim-org/opensim-core/labels{/name}","releases_url":"https://api.github.com/repos/opensim-org/opensim-core/releases{/id}","created_at":"2014-06-12T16:57:56Z","updated_at":"2015-05-18T16:29:11Z","pushed_at":"2015-05-22T05:43:16Z","git_url":"git://github.com/opensim-org/opensim-core.git","ssh_url":"git@github.com:opensim-org/opensim-core.git","clone_url":"https://github.com/opensim-org/opensim-core.git","svn_url":"https://github.com/opensim-org/opensim-core","homepage":"opensim.stanford.edu","size":113344,"stargazers_count":11,"watchers_count":11,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":197,"forks":8,"open_issues":197,"watchers":11,"default_branch":"master"}},"base":{"label":"opensim-org:NewDataHandling_Feature","ref":"NewDataHandling_Feature","sha":"95b477c31a6145e257b93f2ddbf9122af6ad5fb5","user":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20775600,"name":"opensim-core","full_name":"opensim-org/opensim-core","owner":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opensim-org/opensim-core","description":"SimTK OpenSim C++ libraries and comand-line applications and Java/Python wrapping.","fork":false,"url":"https://api.github.com/repos/opensim-org/opensim-core","forks_url":"https://api.github.com/repos/opensim-org/opensim-core/forks","keys_url":"https://api.github.com/repos/opensim-org/opensim-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opensim-org/opensim-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opensim-org/opensim-core/teams","hooks_url":"https://api.github.com/repos/opensim-org/opensim-core/hooks","issue_events_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/events{/number}","events_url":"https://api.github.com/repos/opensim-org/opensim-core/events","assignees_url":"https://api.github.com/repos/opensim-org/opensim-core/assignees{/user}","branches_url":"https://api.github.com/repos/opensim-org/opensim-core/branches{/branch}","tags_url":"https://api.github.com/repos/opensim-org/opensim-core/tags","blobs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opensim-org/opensim-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/opensim-org/opensim-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/{sha}","languages_url":"https://api.github.com/repos/opensim-org/opensim-core/languages","stargazers_url":"https://api.github.com/repos/opensim-org/opensim-core/stargazers","contributors_url":"https://api.github.com/repos/opensim-org/opensim-core/contributors","subscribers_url":"https://api.github.com/repos/opensim-org/opensim-core/subscribers","subscription_url":"https://api.github.com/repos/opensim-org/opensim-core/subscription","commits_url":"https://api.github.com/repos/opensim-org/opensim-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/opensim-org/opensim-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/opensim-org/opensim-core/contents/{+path}","compare_url":"https://api.github.com/repos/opensim-org/opensim-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opensim-org/opensim-core/merges","archive_url":"https://api.github.com/repos/opensim-org/opensim-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opensim-org/opensim-core/downloads","issues_url":"https://api.github.com/repos/opensim-org/opensim-core/issues{/number}","pulls_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls{/number}","milestones_url":"https://api.github.com/repos/opensim-org/opensim-core/milestones{/number}","notifications_url":"https://api.github.com/repos/opensim-org/opensim-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opensim-org/opensim-core/labels{/name}","releases_url":"https://api.github.com/repos/opensim-org/opensim-core/releases{/id}","created_at":"2014-06-12T16:57:56Z","updated_at":"2015-05-18T16:29:11Z","pushed_at":"2015-05-22T05:43:16Z","git_url":"git://github.com/opensim-org/opensim-core.git","ssh_url":"git@github.com:opensim-org/opensim-core.git","clone_url":"https://github.com/opensim-org/opensim-core.git","svn_url":"https://github.com/opensim-org/opensim-core","homepage":"opensim.stanford.edu","size":113344,"stargazers_count":11,"watchers_count":11,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":197,"forks":8,"open_issues":197,"watchers":11,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456"},"html":{"href":"https://github.com/opensim-org/opensim-core/pull/456"},"issue":{"href":"https://api.github.com/repos/opensim-org/opensim-core/issues/456"},"comments":{"href":"https://api.github.com/repos/opensim-org/opensim-core/issues/456/comments"},"review_comments":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456/comments"},"review_comment":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/456/commits"},"statuses":{"href":"https://api.github.com/repos/opensim-org/opensim-core/statuses/21807925adc2477e3a87536faf084105b794b29c"}}}}