{"action":"created","comment":{"url":"https://api.github.com/repos/elixir-lang/elixir/pulls/comments/106390440","pull_request_review_id":27308496,"id":106390440,"diff_hunk":"@@ -258,4 +384,21 @@ defmodule Calendar.ISO do\n       _ -> :error\n     end\n   end\n+\n+  def valid_date?(year, month, day)\n+  def valid_date?(year, month, day) do\n+    :calendar.valid_date(year, month, day) and year <= 9999\n+  end\n+  def valid_date?(year, month, day), do: false","path":"lib/elixir/lib/calendar/iso.ex","position":151,"original_position":151,"commit_id":"03309112e109574e1438bfec7b2c42c9eb84c05a","original_commit_id":"03309112e109574e1438bfec7b2c42c9eb84c05a","user":{"login":"josevalim","id":9582,"avatar_url":"https://avatars3.githubusercontent.com/u/9582?v=3","gravatar_id":"","url":"https://api.github.com/users/josevalim","html_url":"https://github.com/josevalim","followers_url":"https://api.github.com/users/josevalim/followers","following_url":"https://api.github.com/users/josevalim/following{/other_user}","gists_url":"https://api.github.com/users/josevalim/gists{/gist_id}","starred_url":"https://api.github.com/users/josevalim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josevalim/subscriptions","organizations_url":"https://api.github.com/users/josevalim/orgs","repos_url":"https://api.github.com/users/josevalim/repos","events_url":"https://api.github.com/users/josevalim/events{/privacy}","received_events_url":"https://api.github.com/users/josevalim/received_events","type":"User","site_admin":false},"body":"This clause will never match. So this should be one clause instead of three.","created_at":"2017-03-16T11:07:22Z","updated_at":"2017-03-16T11:26:32Z","html_url":"https://github.com/elixir-lang/elixir/pull/5841#discussion_r106390440","pull_request_url":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841","_links":{"self":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/comments/106390440"},"html":{"href":"https://github.com/elixir-lang/elixir/pull/5841#discussion_r106390440"},"pull_request":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841"}}},"pull_request":{"url":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841","id":109172463,"html_url":"https://github.com/elixir-lang/elixir/pull/5841","diff_url":"https://github.com/elixir-lang/elixir/pull/5841.diff","patch_url":"https://github.com/elixir-lang/elixir/pull/5841.patch","issue_url":"https://api.github.com/repos/elixir-lang/elixir/issues/5841","number":5841,"state":"open","locked":false,"title":"Adds internal Calendar Rata Die format for conversions between Calendars","user":{"login":"Qqwy","id":5345745,"avatar_url":"https://avatars1.githubusercontent.com/u/5345745?v=3","gravatar_id":"","url":"https://api.github.com/users/Qqwy","html_url":"https://github.com/Qqwy","followers_url":"https://api.github.com/users/Qqwy/followers","following_url":"https://api.github.com/users/Qqwy/following{/other_user}","gists_url":"https://api.github.com/users/Qqwy/gists{/gist_id}","starred_url":"https://api.github.com/users/Qqwy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qqwy/subscriptions","organizations_url":"https://api.github.com/users/Qqwy/orgs","repos_url":"https://api.github.com/users/Qqwy/repos","events_url":"https://api.github.com/users/Qqwy/events{/privacy}","received_events_url":"https://api.github.com/users/Qqwy/received_events","type":"User","site_admin":false},"body":"This Pull Request is a follow-up from @kipcole9 's PR #5603 and the discussion in the [Calendars & Calendar Conversions topic](https://elixirforum.com/t/calendars-calendar-conversions/3119).\r\n\r\nThe current state of this PR is mainly to rekindle the discussions about this subject: There still are a few choices we must make before this functionality can be included into Elixir.\r\n\r\n\r\n----\r\n\r\nThis checklist will be kept updated as the discussion in this topic evolves.\r\n\r\n### Checklist:\r\n\r\n- [x] The types `Calendar.day_fraction :: {non_neg_integer, pos_integer, extra: %{}}` and `Calendar.rata_die :: {integer, day_fraction, extra :: %{}}` that are used as internal format to convert between times and datetimes, respectively. An in-day _fraction_ is used to ensure that precision is always high enough.\r\n- [x] The callbacks `Calendar.datetime_to_rata_die(year, month, day, hour, minute, second, millisecond, time_zone, zone_abbr, utc_offset, std_offset)` and `Calendar.datetime_from_rata_die(rata_die)`.\r\n- [x] The callbacks `Calendar.time_to_day_fraction(hour, min, second, millisecond)` and `Calendar.time_from_day_fraction(day_fraction)`.\r\n- [x] A `DateTime.compare/2` function that works across calendars by using `datetime_to_rata_die` instead of `to_unix` as is now the case.\r\n- [x] A `DateTime.diff/2` function that returns the difference between two datetimes (across calendars) in the `Calendar.rata_die` format.\r\n- [x] Change functions in new version of Calendar to work with bare arguments/tuples instead of structs to prevent cyclic dependencies.\r\n- [x] Make sure that the timekeeping types in Calendar are also overspecified (just like the datekeeping types already are).\r\n- [x] Add a :calendar field to %Time{}.\r\n- [x] Alter functions that create %Time{} structs to include the new `:calendar` field.\r\n- [x] Add `@callback day_rollover_relative_to_midnight_utc() :: day_fraction` to the Calendar behaviour, which is used to check if `Date`s and `NaiveDateTime`s (rather than only `DateTime`s) can be converted between two calendars.\r\n- [x] Change from_erl, from_iso8601, from_unix, utc_now, utc_today and their bang-variants to versions that take a second optional 'target calendar' argument (defaulting to Calendar.ISO). \r\n  - [x] DateTime\r\n  - [x] Date\r\n  - [x] Time\r\n  - [x] NaiveDateTime\r\n- [x] Change the `to_*` so they dispatch on their containing calendar's datetime_to_rata_die, before converting to the external format.\r\n  - [x] DateTime\r\n  - [x] Date\r\n  - [x] Time\r\n  - [x] NaiveDateTime\r\n- [x] Mechanism to prevent bogus times/dates: `valid_date?`, `valid_time?`, `valid_datetime?`, `valid_naive_datetime?`.\r\n- [x] Timezone information only handled by DateTime. (see `DateTime.apply_tz_offset`)\r\n- [ ] Documentation for `Date.compare, Time.compare, DateTime.compare, NaiveDateTime.compare` that explain when you can/cannot compare across calendars.\r\n- [ ] ~~~Alter the Rata Die format to contain a map with 'extra' data that can be used to keep metadata during the conversion if the source and target calendar both understand the given options.~~~\r\n- [ ] Expansive tests for the above, including another Calendar (visible during testing only) to convert between.\r\n- [ ] fixed specs for the altered and new functions.\r\n\r\n### To be discussed:\r\n\r\n- [x] Should we include a second (simple!) Calendar implementation to be able to test/explain (doctests) conversions properly?\r\n  - -> In tests only.\r\n- [x] How is checked that a newly-created (Naive)(Date)(Time)-struct is valid? Add `valid_datetime?` etc. to the Calendar behaviour?\r\n  - -> `valid_time?`, `valid_date?`, `valid_datetime?`, `valid_naive_datetime?`.\r\n- [x] Who is responsible for handling timezones: DateTime or the Calendar? Or a new Chronology module?\r\n  - -> Deferred to a later time when we have empirical evidence; keep this in DateTime for now.\r\n\r\n----\r\n\r\n### This Pull Request will add the following to Elixir:\r\n(This list is superseded by above checklist)\r\n\r\n- The types `Calendar.day_fraction :: {non_neg_integer, pos_integer}` and `Calendar.rata_die :: {integer, day_fraction}` that are used as internal format to convert between times and datetimes, respectively. An in-day fraction is used to ensure that precision is always high enough.\r\n- The callbacks `Calendar.datetime_to_rata_die(datetime)` and `Calendar.datetime_from_rata_die(rata_die)`.\r\n- The callbacks `Calendar.time_to_day_fraction(time)` and `Calendar.time_from_day_fraction(day_fraction)`. Note that these are not used by other code yet, as the `%Time{}` struct does not contain Calendar information. (See below).\r\n- A `DateTime.compare/2` function that works across calendars by using `datetime_to_rata_die` instead of `to_unix` as is now the case.\r\n- A `DateTime.diff/2` function that returns the difference between two datetimes (across calendars) in the `Calendar.rata_die` format.\r\n- ~~~Two functions in `Integer`, namely `Integer.div_mod/2` and `Integer.gcd/2` that are required in multiple places in the calendar code, so I extracted them there.~~~\r\n- Doctests for the above.\r\n\r\n### Important to note: \r\n\r\n- `Date`s are by design _not_ convertible across calendars. If you want to convert a date, you'll need to convert it to a DateTime (and thus pick some reference time to use). The reference time you pick matters, as not all calendars roll over to the next day on midnight (some do at noon, others at dusk, etc). Without specifying a reference time, the result might therefore be ambiguous. What reference time to pick is an explicit choice that the developer should make, in my opinion.\r\n- `NaiveDateTimes` are not convertible for exactly the same reason: They will only be unambiguous if their timezone is specified.\r\n- This PR explicitly does _not_ add all the behaviour that @kipcole9 ´s PR had. Iterating over days or other ranges of time etc. would be wonderful, but embellishment is only useful once we've agreed on the base. \r\n\r\n\r\n### Other things I've stumbled upon and would like to note:\r\n\r\n- In the current Elixir, `Time` does not contain nor use Calendar information at all. I think it would be a good idea to add this (staying backwards compatible of course), because this implicit, hard-coded dependency on it using Calendar.ISO underwater means that constructing functions like `NaiveDateTime.new(date, time)` do not make sense when used for other calendars. More importantly, it will make it possible to construct and compare times across calendars, etc, as Calendar can then dispatch to the proper Calendar behaviour based on the `:calendar` field of the map passed to its functions.\r\n- The implementation of `Calendar.ISO`'s `datetime_to_rata_die` and `datetime_from_rata_die` do not handle leap seconds, as there is no way for Elixir to know about them. The only possibility for a calendar that does support leap seconds that I can think of, is a 3rd party package that reads its info from the `:tzdata` package. Calendar.ISO's conversions will be off by at most `86400/864001`th of a day during a leap second day. (And will be correct again after that day).\r\n- Functions like `NaiveDateTime.compare(left, right)` and `Date.compare(left, right)` do not care if the calendars of `left` and `right` are the same. This is something that should be fixed (regardless of whatever happens to the rest of this Pull Request). (**EDIT:** #5842 was made)\r\n- There are multiple other functions in Date, Time and DateTime that implicitly depend on a Calendar.ISO format being used, such as `from_erl`, `to_erl`, `to_unix`, etc. This means that these modules are taking care of three different concerns right now. For instance, DateTime is:\r\n  - the module containing functions that only work on ISO DateTimes.\r\n  - the module containing functions that should work with any DateTimes, regardless of struct used (any map goes as long as it contains the expected fields).\r\n  - The module being responsible for the creation and manipulation of the `%DateTime{}` struct.\r\n\r\nWe might therefore want to split these modules, into e.g. `DateTime` and `Calendar.ISO.DateTime`. But this will be somewhat problematic in terms of backwards compatibility. Any ideas?\r\n\r\n-----\r\n\r\nAll help and feedback is greatly welcome! :-)\r\n\r\n\r\n\r\n\r\n","created_at":"2017-03-05T23:58:19Z","updated_at":"2017-03-16T11:26:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e4e20a37987be89a6c0a77bde3a805ed7bbe6fe6","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841/commits","review_comments_url":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841/comments","review_comment_url":"https://api.github.com/repos/elixir-lang/elixir/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elixir-lang/elixir/issues/5841/comments","statuses_url":"https://api.github.com/repos/elixir-lang/elixir/statuses/03309112e109574e1438bfec7b2c42c9eb84c05a","head":{"label":"Qqwy:calendar_rata_die","ref":"calendar_rata_die","sha":"03309112e109574e1438bfec7b2c42c9eb84c05a","user":{"login":"Qqwy","id":5345745,"avatar_url":"https://avatars1.githubusercontent.com/u/5345745?v=3","gravatar_id":"","url":"https://api.github.com/users/Qqwy","html_url":"https://github.com/Qqwy","followers_url":"https://api.github.com/users/Qqwy/followers","following_url":"https://api.github.com/users/Qqwy/following{/other_user}","gists_url":"https://api.github.com/users/Qqwy/gists{/gist_id}","starred_url":"https://api.github.com/users/Qqwy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qqwy/subscriptions","organizations_url":"https://api.github.com/users/Qqwy/orgs","repos_url":"https://api.github.com/users/Qqwy/repos","events_url":"https://api.github.com/users/Qqwy/events{/privacy}","received_events_url":"https://api.github.com/users/Qqwy/received_events","type":"User","site_admin":false},"repo":{"id":54333447,"name":"elixir","full_name":"Qqwy/elixir","owner":{"login":"Qqwy","id":5345745,"avatar_url":"https://avatars1.githubusercontent.com/u/5345745?v=3","gravatar_id":"","url":"https://api.github.com/users/Qqwy","html_url":"https://github.com/Qqwy","followers_url":"https://api.github.com/users/Qqwy/followers","following_url":"https://api.github.com/users/Qqwy/following{/other_user}","gists_url":"https://api.github.com/users/Qqwy/gists{/gist_id}","starred_url":"https://api.github.com/users/Qqwy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qqwy/subscriptions","organizations_url":"https://api.github.com/users/Qqwy/orgs","repos_url":"https://api.github.com/users/Qqwy/repos","events_url":"https://api.github.com/users/Qqwy/events{/privacy}","received_events_url":"https://api.github.com/users/Qqwy/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Qqwy/elixir","description":"Elixir is a dynamic, functional language designed for building scalable and maintainable applications","fork":true,"url":"https://api.github.com/repos/Qqwy/elixir","forks_url":"https://api.github.com/repos/Qqwy/elixir/forks","keys_url":"https://api.github.com/repos/Qqwy/elixir/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Qqwy/elixir/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Qqwy/elixir/teams","hooks_url":"https://api.github.com/repos/Qqwy/elixir/hooks","issue_events_url":"https://api.github.com/repos/Qqwy/elixir/issues/events{/number}","events_url":"https://api.github.com/repos/Qqwy/elixir/events","assignees_url":"https://api.github.com/repos/Qqwy/elixir/assignees{/user}","branches_url":"https://api.github.com/repos/Qqwy/elixir/branches{/branch}","tags_url":"https://api.github.com/repos/Qqwy/elixir/tags","blobs_url":"https://api.github.com/repos/Qqwy/elixir/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Qqwy/elixir/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Qqwy/elixir/git/refs{/sha}","trees_url":"https://api.github.com/repos/Qqwy/elixir/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Qqwy/elixir/statuses/{sha}","languages_url":"https://api.github.com/repos/Qqwy/elixir/languages","stargazers_url":"https://api.github.com/repos/Qqwy/elixir/stargazers","contributors_url":"https://api.github.com/repos/Qqwy/elixir/contributors","subscribers_url":"https://api.github.com/repos/Qqwy/elixir/subscribers","subscription_url":"https://api.github.com/repos/Qqwy/elixir/subscription","commits_url":"https://api.github.com/repos/Qqwy/elixir/commits{/sha}","git_commits_url":"https://api.github.com/repos/Qqwy/elixir/git/commits{/sha}","comments_url":"https://api.github.com/repos/Qqwy/elixir/comments{/number}","issue_comment_url":"https://api.github.com/repos/Qqwy/elixir/issues/comments{/number}","contents_url":"https://api.github.com/repos/Qqwy/elixir/contents/{+path}","compare_url":"https://api.github.com/repos/Qqwy/elixir/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Qqwy/elixir/merges","archive_url":"https://api.github.com/repos/Qqwy/elixir/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Qqwy/elixir/downloads","issues_url":"https://api.github.com/repos/Qqwy/elixir/issues{/number}","pulls_url":"https://api.github.com/repos/Qqwy/elixir/pulls{/number}","milestones_url":"https://api.github.com/repos/Qqwy/elixir/milestones{/number}","notifications_url":"https://api.github.com/repos/Qqwy/elixir/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Qqwy/elixir/labels{/name}","releases_url":"https://api.github.com/repos/Qqwy/elixir/releases{/id}","deployments_url":"https://api.github.com/repos/Qqwy/elixir/deployments","created_at":"2016-03-20T18:28:06Z","updated_at":"2016-03-20T18:28:08Z","pushed_at":"2017-03-16T00:52:54Z","git_url":"git://github.com/Qqwy/elixir.git","ssh_url":"git@github.com:Qqwy/elixir.git","clone_url":"https://github.com/Qqwy/elixir.git","svn_url":"https://github.com/Qqwy/elixir","homepage":"http://elixir-lang.org/","size":30643,"stargazers_count":0,"watchers_count":0,"language":"Elixir","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":"elixir-lang:master","ref":"master","sha":"6d122fa3527959f77838adcb8a424ae9981d981b","user":{"login":"elixir-lang","id":1481354,"avatar_url":"https://avatars2.githubusercontent.com/u/1481354?v=3","gravatar_id":"","url":"https://api.github.com/users/elixir-lang","html_url":"https://github.com/elixir-lang","followers_url":"https://api.github.com/users/elixir-lang/followers","following_url":"https://api.github.com/users/elixir-lang/following{/other_user}","gists_url":"https://api.github.com/users/elixir-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/elixir-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elixir-lang/subscriptions","organizations_url":"https://api.github.com/users/elixir-lang/orgs","repos_url":"https://api.github.com/users/elixir-lang/repos","events_url":"https://api.github.com/users/elixir-lang/events{/privacy}","received_events_url":"https://api.github.com/users/elixir-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":1234714,"name":"elixir","full_name":"elixir-lang/elixir","owner":{"login":"elixir-lang","id":1481354,"avatar_url":"https://avatars2.githubusercontent.com/u/1481354?v=3","gravatar_id":"","url":"https://api.github.com/users/elixir-lang","html_url":"https://github.com/elixir-lang","followers_url":"https://api.github.com/users/elixir-lang/followers","following_url":"https://api.github.com/users/elixir-lang/following{/other_user}","gists_url":"https://api.github.com/users/elixir-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/elixir-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elixir-lang/subscriptions","organizations_url":"https://api.github.com/users/elixir-lang/orgs","repos_url":"https://api.github.com/users/elixir-lang/repos","events_url":"https://api.github.com/users/elixir-lang/events{/privacy}","received_events_url":"https://api.github.com/users/elixir-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elixir-lang/elixir","description":"Elixir is a dynamic, functional language designed for building scalable and maintainable applications","fork":false,"url":"https://api.github.com/repos/elixir-lang/elixir","forks_url":"https://api.github.com/repos/elixir-lang/elixir/forks","keys_url":"https://api.github.com/repos/elixir-lang/elixir/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elixir-lang/elixir/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elixir-lang/elixir/teams","hooks_url":"https://api.github.com/repos/elixir-lang/elixir/hooks","issue_events_url":"https://api.github.com/repos/elixir-lang/elixir/issues/events{/number}","events_url":"https://api.github.com/repos/elixir-lang/elixir/events","assignees_url":"https://api.github.com/repos/elixir-lang/elixir/assignees{/user}","branches_url":"https://api.github.com/repos/elixir-lang/elixir/branches{/branch}","tags_url":"https://api.github.com/repos/elixir-lang/elixir/tags","blobs_url":"https://api.github.com/repos/elixir-lang/elixir/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elixir-lang/elixir/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elixir-lang/elixir/git/refs{/sha}","trees_url":"https://api.github.com/repos/elixir-lang/elixir/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elixir-lang/elixir/statuses/{sha}","languages_url":"https://api.github.com/repos/elixir-lang/elixir/languages","stargazers_url":"https://api.github.com/repos/elixir-lang/elixir/stargazers","contributors_url":"https://api.github.com/repos/elixir-lang/elixir/contributors","subscribers_url":"https://api.github.com/repos/elixir-lang/elixir/subscribers","subscription_url":"https://api.github.com/repos/elixir-lang/elixir/subscription","commits_url":"https://api.github.com/repos/elixir-lang/elixir/commits{/sha}","git_commits_url":"https://api.github.com/repos/elixir-lang/elixir/git/commits{/sha}","comments_url":"https://api.github.com/repos/elixir-lang/elixir/comments{/number}","issue_comment_url":"https://api.github.com/repos/elixir-lang/elixir/issues/comments{/number}","contents_url":"https://api.github.com/repos/elixir-lang/elixir/contents/{+path}","compare_url":"https://api.github.com/repos/elixir-lang/elixir/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elixir-lang/elixir/merges","archive_url":"https://api.github.com/repos/elixir-lang/elixir/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elixir-lang/elixir/downloads","issues_url":"https://api.github.com/repos/elixir-lang/elixir/issues{/number}","pulls_url":"https://api.github.com/repos/elixir-lang/elixir/pulls{/number}","milestones_url":"https://api.github.com/repos/elixir-lang/elixir/milestones{/number}","notifications_url":"https://api.github.com/repos/elixir-lang/elixir/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elixir-lang/elixir/labels{/name}","releases_url":"https://api.github.com/repos/elixir-lang/elixir/releases{/id}","deployments_url":"https://api.github.com/repos/elixir-lang/elixir/deployments","created_at":"2011-01-09T08:43:57Z","updated_at":"2017-03-16T09:51:45Z","pushed_at":"2017-03-16T08:50:45Z","git_url":"git://github.com/elixir-lang/elixir.git","ssh_url":"git@github.com:elixir-lang/elixir.git","clone_url":"https://github.com/elixir-lang/elixir.git","svn_url":"https://github.com/elixir-lang/elixir","homepage":"http://elixir-lang.org/","size":30878,"stargazers_count":9616,"watchers_count":9616,"language":"Elixir","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1323,"mirror_url":null,"open_issues_count":39,"forks":1323,"open_issues":39,"watchers":9616,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841"},"html":{"href":"https://github.com/elixir-lang/elixir/pull/5841"},"issue":{"href":"https://api.github.com/repos/elixir-lang/elixir/issues/5841"},"comments":{"href":"https://api.github.com/repos/elixir-lang/elixir/issues/5841/comments"},"review_comments":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841/comments"},"review_comment":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elixir-lang/elixir/pulls/5841/commits"},"statuses":{"href":"https://api.github.com/repos/elixir-lang/elixir/statuses/03309112e109574e1438bfec7b2c42c9eb84c05a"}}}}
{"actor":{"display_login":"josevalim"}}