{"action":"created","comment":{"url":"https://api.github.com/repos/ros2/design/pulls/comments/217191045","pull_request_review_id":154846347,"id":217191045,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNzE5MTA0NQ==","diff_hunk":"@@ -0,0 +1,213 @@\n+---\n+layout: default\n+title: WideStrings\n+abstract:\n+  Some ROS2 users would like to use multi-byte characters for topic data, suitable for supporting multi-byte languages.\n+  This article lays out the problem, and explores potential solutions to this problem.\n+author: '[Chris Lalancette](https://github.com/clalancette)'\n+published: true\n+---\n+\n+- This will become a table of contents (this text will be scraped).\n+{:toc}\n+\n+# {{ page.title }}\n+\n+<div class=\"abstract\" markdown=\"1\">\n+{{ page.abstract }}\n+</div>\n+\n+Original Author: {{ page.author }}\n+\n+## Background\n+\n+ROS2 currently supports the concept of strings, which are sequences of single-byte characters.\n+When working with ROS 2 topic data, some users would like to use multi-byte characters (e.g. UTF-8) for their topic data.\n+This article explores the problem and the possible solutions.\n+Note that this article specifically does not talk about binary data, as that is already handled by using uint8_t arrays.\n+It also does not talk about using multi-byte characters for the topic *names*, as this is disallowed by the DDS specification.\n+\n+## Multi-byte character background\n+\n+Before delving into ROS 2 specifics, some time should be spent discussing multi-byte characters in general.\n+What is meant by multi-byte characters?\n+The original ASCII character set only provided for printable characters using binary sequences 0 to 127.\n+Several extensions were made to this to use 128-255, but that approach only extended the character set to be able to cover a few more languages.\n+Several other encodings were created as the need arose, and it became clear by the 1990's that a worldwide standard was required.\n+Thus, Unicode was created to be a single specification that could cover all of the languages of the world.\n+The early versions of Unicode actually failed to live up to this expectation, and some of those early versions of Unicode are still baked into widely used software (Microsoft Windows, Java, etc).\n+Later on, the Unicode standard evolved to truly be able to cover the languages of the entire world, and this is what should generally be used for new designs.\n+As a side benefit, the newer versions of Unicode (UTF-8) are backwards compatible with ASCII.\n+There is a lot of history here, and things are much more complicated then the brief introduction above.\n+For more information, the following links provide introductory material:\n+\n+* [http://kunststube.net/encoding/](http://kunststube.net/encoding/)\n+* [http://stackoverflow.com/questions/4588302/why-isnt-wchar-t-widely-used-in-code-for-linux-related-platforms](http://stackoverflow.com/questions/4588302/why-isnt-wchar-t-widely-used-in-code-for-linux-related-platforms)\n+* [http://www.diveintopython3.net/strings.html](http://www.diveintopython3.net/strings.html)\n+* [http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring](http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring)\n+\n+The rest of this document is generally going to assume Unicode, unless stated otherwise.\n+\n+## Unicode Characters in Strings\n+ROS 1 says string fields are to contain ASCII encoded data, but allows UTF-8.\n+DDS-XTYPES mandates UTF-8 be used as the encoding of IDL type `string`.\n+To be compatible with ROS 1 and DDS-XTYPES, in ROS 2 the content of a `string` is expected to be UTF-8.\n+\n+## Introducing Wide Strings\n+ROS 2 messages will have a new [primitive field type](/articles/interface_definition.html) `wstring`.\n+This purpose is to allow ROS 2 nodes to comminicate with non-ROS DDS entities using an IDL containing a `wstring` field.\n+The encoding of data in this type should be UTF-16 to match DDS-XTYPES 1.2.\n+Since both UTF-8 and UTF-16 can encode the same code points, new ROS 2 messages should prefer `string` over `wstring`.\n+\n+## Encodings are Recommendations\n+The choice of UTF-8 or UTF-16 for `string` and `wstring` are recommendations.\n+A `string` or `wstring` field is allowed to be populated and published with an unknown encoding.\n+If subscriber receives a string containing an unknown ncoding then it is up to the subscriber how to handle it.\n+It could decode it using an encoding that has been agreed to out of band.\n+Other subscribers like `ros2 topic echo` may echo the bytes in hexadecimal.\n+\n+In practice using different encodings may not be possible.\n+The IDL specification forbids `string` from containing `NULL` values.\n+For compatibility a ROS message `string` field must not contain zero bytes, and a `wstring` field must not contain zero words.\n+An encoding like UTF-32 cannot be used since it may have zero bytes or words in a code point.\n+If UTF-32 encoded strings need to be transmitted then one should either convert to UTF-8 and use a `string` or use a `uint32` array.\n+\n+<div class=\"alert alert-warning\" markdown=\"1\">\n+  <b>TODO:</b> Can ROS 1 publish a string with NULL bytes?\n+</div>\n+\n+## Unicode Strings Across ROS 1 Bridge\n+Since ROS 1 and 2 both allow `string` to be UTF-8, the ROS 1 bridge will pass values unmodified between them.\n+If a message sent from ROS 2 to ROS 1 fails to serialize because a string contains values that are not legal UTF-8 then it won't be published by the bridge.\n+\n+If a ROS 2 message has a field of type `wstring` then the bridge will attempt to convert it from UTF-16 to UTF-8.\n+The resulting UTF-8 encoded string will be published as a `string` type.\n+If the conversion fails then the bridge will not publish the message.\n+\n+## Size of a Wide String\n+\n+Both UTF-8 and UTF-16 are variable width encodings.\n+To minimize the amount of memory used, the `string` and `wstring` types are to be stored in client libraries according to the smallest possible code point.\n+This means `string` must be specified as a sequence of bytes, and `wstring` is to be specified as a sequence of words.\n+\n+Some DDS implementations use 32bit types to store wide strings values.\n+This may be due to DDS-XTYPES 1.1 spec saying `wchar` is a 32bit value.\n+ROS 2 will instead aim to be compatible with DDS-XTYPES 1.2 and use 16bit storage for wide characters.\n+Generated code for ROS 2 messages will automatically handle the conversion when a message is serialized or deserialized.\n+\n+### Bounded wide strings\n+\n+Embedded systems accepting strings may use message definitions that restrict the maximum size of a string.\n+These are referred to as bounded strings.\n+Their purpose is to restrinct the amount of memory used, so the bounds must be specified as units of memory.\n+If a `string` field is bounded then the size is given in bytes.\n+Similarly the size of a bounded `wstring` is to be specified in words.\n+It is the responsibility of whoever populates a bounded `string` or `wstring` to make sure it contains whole code points only.\n+Partial code points are indistinuguishable from unknown encodings, so a bounded string whose last code point is incomplete will be published without error.","path":"articles/WideStrings.md","position":null,"original_position":106,"commit_id":"7d2ca06ce8f8dbd420f6e2e2ce2bc233c82e87a9","original_commit_id":"93dd672259b1554115cfd9b1a0f6a2773c89b3b7","user":{"login":"sloretz","id":4175662,"node_id":"MDQ6VXNlcjQxNzU2NjI=","avatar_url":"https://avatars1.githubusercontent.com/u/4175662?v=4","gravatar_id":"","url":"https://api.github.com/users/sloretz","html_url":"https://github.com/sloretz","followers_url":"https://api.github.com/users/sloretz/followers","following_url":"https://api.github.com/users/sloretz/following{/other_user}","gists_url":"https://api.github.com/users/sloretz/gists{/gist_id}","starred_url":"https://api.github.com/users/sloretz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sloretz/subscriptions","organizations_url":"https://api.github.com/users/sloretz/orgs","repos_url":"https://api.github.com/users/sloretz/repos","events_url":"https://api.github.com/users/sloretz/events{/privacy}","received_events_url":"https://api.github.com/users/sloretz/received_events","type":"User","site_admin":false},"body":"It was. In 7d2ca06ce8f8dbd420f6e2e2ce2bc233c82e87a9 I changed it to say they're not guaranteed to be published to match 354da47cb1cf7d9fcc1384e0ac4f6d84f2f1e5a2","created_at":"2018-09-12T21:12:25Z","updated_at":"2018-09-12T21:12:26Z","html_url":"https://github.com/ros2/design/pull/117#discussion_r217191045","pull_request_url":"https://api.github.com/repos/ros2/design/pulls/117","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ros2/design/pulls/comments/217191045"},"html":{"href":"https://github.com/ros2/design/pull/117#discussion_r217191045"},"pull_request":{"href":"https://api.github.com/repos/ros2/design/pulls/117"}},"in_reply_to_id":217124367},"pull_request":{"url":"https://api.github.com/repos/ros2/design/pulls/117","id":109519787,"node_id":"MDExOlB1bGxSZXF1ZXN0MTA5NTE5Nzg3","html_url":"https://github.com/ros2/design/pull/117","diff_url":"https://github.com/ros2/design/pull/117.diff","patch_url":"https://github.com/ros2/design/pull/117.patch","issue_url":"https://api.github.com/repos/ros2/design/issues/117","number":117,"state":"open","locked":false,"title":"Add article about WideStrings.","user":{"login":"clalancette","id":163000,"node_id":"MDQ6VXNlcjE2MzAwMA==","avatar_url":"https://avatars0.githubusercontent.com/u/163000?v=4","gravatar_id":"","url":"https://api.github.com/users/clalancette","html_url":"https://github.com/clalancette","followers_url":"https://api.github.com/users/clalancette/followers","following_url":"https://api.github.com/users/clalancette/following{/other_user}","gists_url":"https://api.github.com/users/clalancette/gists{/gist_id}","starred_url":"https://api.github.com/users/clalancette/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clalancette/subscriptions","organizations_url":"https://api.github.com/users/clalancette/orgs","repos_url":"https://api.github.com/users/clalancette/repos","events_url":"https://api.github.com/users/clalancette/events{/privacy}","received_events_url":"https://api.github.com/users/clalancette/received_events","type":"User","site_admin":false},"body":"This incorporates a bunch of research and thinking I've done about the problem, as well as feedback from people internally.  Note a few things about this article:\r\n\r\n1.  It takes the stance that we should have a wide string type separate from the string type.\r\n\r\n2.  It takes the stance that we should use UTF-8.  We haven't 100% decided this, but it is the most logical choice; almost all other encodings are deprecated at this point.\r\n\r\n3.  It takes the stance that we should map the wide string onto the DDS concept of a wchar.  As Mikael pointed out, the XTypes spec on top of DDS mandates that wchar == Char32.  While the spec does *not* mandate what size Char32 is, it would be pretty surprising if it would be anything but 32 bits.  The other option we have here is to map the wide string on the DDS concept of uint8, which would shrink the size on the wire.  As it stands right now, none of the tools I looked at (including the RTI Connext tools) have the ability to properly display a wchar/wstring, so there is currently no compelling reason to go with wchar.  Still TBD.\r\n\r\n4.  The C++ example below is really simple.  There actually exists a library called \"utf8\" that has a utf8_string class that behaves a lot like std::string, and that is what the example below uses.  What other APIs do we think we would need to model?\r\n\r\nconnects to  ros2/rosidl#208","created_at":"2017-03-07T16:39:08Z","updated_at":"2018-09-12T21:12:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fa43cf26f0970a20da9dcd03ec27c2ba1ca22967","assignee":{"login":"sloretz","id":4175662,"node_id":"MDQ6VXNlcjQxNzU2NjI=","avatar_url":"https://avatars1.githubusercontent.com/u/4175662?v=4","gravatar_id":"","url":"https://api.github.com/users/sloretz","html_url":"https://github.com/sloretz","followers_url":"https://api.github.com/users/sloretz/followers","following_url":"https://api.github.com/users/sloretz/following{/other_user}","gists_url":"https://api.github.com/users/sloretz/gists{/gist_id}","starred_url":"https://api.github.com/users/sloretz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sloretz/subscriptions","organizations_url":"https://api.github.com/users/sloretz/orgs","repos_url":"https://api.github.com/users/sloretz/repos","events_url":"https://api.github.com/users/sloretz/events{/privacy}","received_events_url":"https://api.github.com/users/sloretz/received_events","type":"User","site_admin":false},"assignees":[{"login":"sloretz","id":4175662,"node_id":"MDQ6VXNlcjQxNzU2NjI=","avatar_url":"https://avatars1.githubusercontent.com/u/4175662?v=4","gravatar_id":"","url":"https://api.github.com/users/sloretz","html_url":"https://github.com/sloretz","followers_url":"https://api.github.com/users/sloretz/followers","following_url":"https://api.github.com/users/sloretz/following{/other_user}","gists_url":"https://api.github.com/users/sloretz/gists{/gist_id}","starred_url":"https://api.github.com/users/sloretz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sloretz/subscriptions","organizations_url":"https://api.github.com/users/sloretz/orgs","repos_url":"https://api.github.com/users/sloretz/repos","events_url":"https://api.github.com/users/sloretz/events{/privacy}","received_events_url":"https://api.github.com/users/sloretz/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":666362398,"node_id":"MDU6TGFiZWw2NjYzNjIzOTg=","url":"https://api.github.com/repos/ros2/design/labels/help%20wanted","name":"help wanted","color":"008672","default":true},{"id":228101453,"node_id":"MDU6TGFiZWwyMjgxMDE0NTM=","url":"https://api.github.com/repos/ros2/design/labels/ready","name":"ready","color":"80916d","default":false},{"id":567800597,"node_id":"MDU6TGFiZWw1Njc4MDA1OTc=","url":"https://api.github.com/repos/ros2/design/labels/requires-changes","name":"requires-changes","color":"fef2c0","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ros2/design/pulls/117/commits","review_comments_url":"https://api.github.com/repos/ros2/design/pulls/117/comments","review_comment_url":"https://api.github.com/repos/ros2/design/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ros2/design/issues/117/comments","statuses_url":"https://api.github.com/repos/ros2/design/statuses/7d2ca06ce8f8dbd420f6e2e2ce2bc233c82e87a9","head":{"label":"ros2:wstring","ref":"wstring","sha":"7d2ca06ce8f8dbd420f6e2e2ce2bc233c82e87a9","user":{"login":"ros2","id":3979232,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5NzkyMzI=","avatar_url":"https://avatars1.githubusercontent.com/u/3979232?v=4","gravatar_id":"","url":"https://api.github.com/users/ros2","html_url":"https://github.com/ros2","followers_url":"https://api.github.com/users/ros2/followers","following_url":"https://api.github.com/users/ros2/following{/other_user}","gists_url":"https://api.github.com/users/ros2/gists{/gist_id}","starred_url":"https://api.github.com/users/ros2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ros2/subscriptions","organizations_url":"https://api.github.com/users/ros2/orgs","repos_url":"https://api.github.com/users/ros2/repos","events_url":"https://api.github.com/users/ros2/events{/privacy}","received_events_url":"https://api.github.com/users/ros2/received_events","type":"Organization","site_admin":false},"repo":{"id":14241623,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI0MTYyMw==","name":"design","full_name":"ros2/design","owner":{"login":"ros2","id":3979232,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5NzkyMzI=","avatar_url":"https://avatars1.githubusercontent.com/u/3979232?v=4","gravatar_id":"","url":"https://api.github.com/users/ros2","html_url":"https://github.com/ros2","followers_url":"https://api.github.com/users/ros2/followers","following_url":"https://api.github.com/users/ros2/following{/other_user}","gists_url":"https://api.github.com/users/ros2/gists{/gist_id}","starred_url":"https://api.github.com/users/ros2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ros2/subscriptions","organizations_url":"https://api.github.com/users/ros2/orgs","repos_url":"https://api.github.com/users/ros2/repos","events_url":"https://api.github.com/users/ros2/events{/privacy}","received_events_url":"https://api.github.com/users/ros2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ros2/design","description":"Design documentation for ROS 2.0 effort","fork":false,"url":"https://api.github.com/repos/ros2/design","forks_url":"https://api.github.com/repos/ros2/design/forks","keys_url":"https://api.github.com/repos/ros2/design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ros2/design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ros2/design/teams","hooks_url":"https://api.github.com/repos/ros2/design/hooks","issue_events_url":"https://api.github.com/repos/ros2/design/issues/events{/number}","events_url":"https://api.github.com/repos/ros2/design/events","assignees_url":"https://api.github.com/repos/ros2/design/assignees{/user}","branches_url":"https://api.github.com/repos/ros2/design/branches{/branch}","tags_url":"https://api.github.com/repos/ros2/design/tags","blobs_url":"https://api.github.com/repos/ros2/design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ros2/design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ros2/design/git/refs{/sha}","trees_url":"https://api.github.com/repos/ros2/design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ros2/design/statuses/{sha}","languages_url":"https://api.github.com/repos/ros2/design/languages","stargazers_url":"https://api.github.com/repos/ros2/design/stargazers","contributors_url":"https://api.github.com/repos/ros2/design/contributors","subscribers_url":"https://api.github.com/repos/ros2/design/subscribers","subscription_url":"https://api.github.com/repos/ros2/design/subscription","commits_url":"https://api.github.com/repos/ros2/design/commits{/sha}","git_commits_url":"https://api.github.com/repos/ros2/design/git/commits{/sha}","comments_url":"https://api.github.com/repos/ros2/design/comments{/number}","issue_comment_url":"https://api.github.com/repos/ros2/design/issues/comments{/number}","contents_url":"https://api.github.com/repos/ros2/design/contents/{+path}","compare_url":"https://api.github.com/repos/ros2/design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ros2/design/merges","archive_url":"https://api.github.com/repos/ros2/design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ros2/design/downloads","issues_url":"https://api.github.com/repos/ros2/design/issues{/number}","pulls_url":"https://api.github.com/repos/ros2/design/pulls{/number}","milestones_url":"https://api.github.com/repos/ros2/design/milestones{/number}","notifications_url":"https://api.github.com/repos/ros2/design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ros2/design/labels{/name}","releases_url":"https://api.github.com/repos/ros2/design/releases{/id}","deployments_url":"https://api.github.com/repos/ros2/design/deployments","created_at":"2013-11-08T18:56:29Z","updated_at":"2018-09-10T13:41:53Z","pushed_at":"2018-09-12T21:11:51Z","git_url":"git://github.com/ros2/design.git","ssh_url":"git@github.com:ros2/design.git","clone_url":"https://github.com/ros2/design.git","svn_url":"https://github.com/ros2/design","homepage":"http://design.ros2.org/","size":1452,"stargazers_count":72,"watchers_count":72,"language":"JavaScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":81,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":81,"open_issues":29,"watchers":72,"default_branch":"gh-pages"}},"base":{"label":"ros2:gh-pages","ref":"gh-pages","sha":"0cf5be5594345cc8d808d8c398be3525d4212bff","user":{"login":"ros2","id":3979232,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5NzkyMzI=","avatar_url":"https://avatars1.githubusercontent.com/u/3979232?v=4","gravatar_id":"","url":"https://api.github.com/users/ros2","html_url":"https://github.com/ros2","followers_url":"https://api.github.com/users/ros2/followers","following_url":"https://api.github.com/users/ros2/following{/other_user}","gists_url":"https://api.github.com/users/ros2/gists{/gist_id}","starred_url":"https://api.github.com/users/ros2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ros2/subscriptions","organizations_url":"https://api.github.com/users/ros2/orgs","repos_url":"https://api.github.com/users/ros2/repos","events_url":"https://api.github.com/users/ros2/events{/privacy}","received_events_url":"https://api.github.com/users/ros2/received_events","type":"Organization","site_admin":false},"repo":{"id":14241623,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI0MTYyMw==","name":"design","full_name":"ros2/design","owner":{"login":"ros2","id":3979232,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5NzkyMzI=","avatar_url":"https://avatars1.githubusercontent.com/u/3979232?v=4","gravatar_id":"","url":"https://api.github.com/users/ros2","html_url":"https://github.com/ros2","followers_url":"https://api.github.com/users/ros2/followers","following_url":"https://api.github.com/users/ros2/following{/other_user}","gists_url":"https://api.github.com/users/ros2/gists{/gist_id}","starred_url":"https://api.github.com/users/ros2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ros2/subscriptions","organizations_url":"https://api.github.com/users/ros2/orgs","repos_url":"https://api.github.com/users/ros2/repos","events_url":"https://api.github.com/users/ros2/events{/privacy}","received_events_url":"https://api.github.com/users/ros2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ros2/design","description":"Design documentation for ROS 2.0 effort","fork":false,"url":"https://api.github.com/repos/ros2/design","forks_url":"https://api.github.com/repos/ros2/design/forks","keys_url":"https://api.github.com/repos/ros2/design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ros2/design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ros2/design/teams","hooks_url":"https://api.github.com/repos/ros2/design/hooks","issue_events_url":"https://api.github.com/repos/ros2/design/issues/events{/number}","events_url":"https://api.github.com/repos/ros2/design/events","assignees_url":"https://api.github.com/repos/ros2/design/assignees{/user}","branches_url":"https://api.github.com/repos/ros2/design/branches{/branch}","tags_url":"https://api.github.com/repos/ros2/design/tags","blobs_url":"https://api.github.com/repos/ros2/design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ros2/design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ros2/design/git/refs{/sha}","trees_url":"https://api.github.com/repos/ros2/design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ros2/design/statuses/{sha}","languages_url":"https://api.github.com/repos/ros2/design/languages","stargazers_url":"https://api.github.com/repos/ros2/design/stargazers","contributors_url":"https://api.github.com/repos/ros2/design/contributors","subscribers_url":"https://api.github.com/repos/ros2/design/subscribers","subscription_url":"https://api.github.com/repos/ros2/design/subscription","commits_url":"https://api.github.com/repos/ros2/design/commits{/sha}","git_commits_url":"https://api.github.com/repos/ros2/design/git/commits{/sha}","comments_url":"https://api.github.com/repos/ros2/design/comments{/number}","issue_comment_url":"https://api.github.com/repos/ros2/design/issues/comments{/number}","contents_url":"https://api.github.com/repos/ros2/design/contents/{+path}","compare_url":"https://api.github.com/repos/ros2/design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ros2/design/merges","archive_url":"https://api.github.com/repos/ros2/design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ros2/design/downloads","issues_url":"https://api.github.com/repos/ros2/design/issues{/number}","pulls_url":"https://api.github.com/repos/ros2/design/pulls{/number}","milestones_url":"https://api.github.com/repos/ros2/design/milestones{/number}","notifications_url":"https://api.github.com/repos/ros2/design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ros2/design/labels{/name}","releases_url":"https://api.github.com/repos/ros2/design/releases{/id}","deployments_url":"https://api.github.com/repos/ros2/design/deployments","created_at":"2013-11-08T18:56:29Z","updated_at":"2018-09-10T13:41:53Z","pushed_at":"2018-09-12T21:11:51Z","git_url":"git://github.com/ros2/design.git","ssh_url":"git@github.com:ros2/design.git","clone_url":"https://github.com/ros2/design.git","svn_url":"https://github.com/ros2/design","homepage":"http://design.ros2.org/","size":1452,"stargazers_count":72,"watchers_count":72,"language":"JavaScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":81,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":81,"open_issues":29,"watchers":72,"default_branch":"gh-pages"}},"_links":{"self":{"href":"https://api.github.com/repos/ros2/design/pulls/117"},"html":{"href":"https://github.com/ros2/design/pull/117"},"issue":{"href":"https://api.github.com/repos/ros2/design/issues/117"},"comments":{"href":"https://api.github.com/repos/ros2/design/issues/117/comments"},"review_comments":{"href":"https://api.github.com/repos/ros2/design/pulls/117/comments"},"review_comment":{"href":"https://api.github.com/repos/ros2/design/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ros2/design/pulls/117/commits"},"statuses":{"href":"https://api.github.com/repos/ros2/design/statuses/7d2ca06ce8f8dbd420f6e2e2ce2bc233c82e87a9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"sloretz"}}