{"action":"closed","issue":{"url":"https://api.github.com/repos/dgilland/pydash/issues/39","labels_url":"https://api.github.com/repos/dgilland/pydash/issues/39/labels{/name}","comments_url":"https://api.github.com/repos/dgilland/pydash/issues/39/comments","events_url":"https://api.github.com/repos/dgilland/pydash/issues/39/events","html_url":"https://github.com/dgilland/pydash/issues/39","id":52487980,"number":39,"title":"Port underscore.string","user":{"login":"dgilland","id":1251349,"avatar_url":"https://avatars.githubusercontent.com/u/1251349?v=3","gravatar_id":"","url":"https://api.github.com/users/dgilland","html_url":"https://github.com/dgilland","followers_url":"https://api.github.com/users/dgilland/followers","following_url":"https://api.github.com/users/dgilland/following{/other_user}","gists_url":"https://api.github.com/users/dgilland/gists{/gist_id}","starred_url":"https://api.github.com/users/dgilland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dgilland/subscriptions","organizations_url":"https://api.github.com/users/dgilland/orgs","repos_url":"https://api.github.com/users/dgilland/repos","events_url":"https://api.github.com/users/dgilland/events{/privacy}","received_events_url":"https://api.github.com/users/dgilland/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/dgilland/pydash/labels/enhancement","name":"enhancement","color":"84b6eb"}],"state":"closed","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/dgilland/pydash/milestones/7","labels_url":"https://api.github.com/repos/dgilland/pydash/milestones/7/labels","id":924000,"number":7,"title":"v3.0.0","description":"v3.0.0 release","creator":{"login":"dgilland","id":1251349,"avatar_url":"https://avatars.githubusercontent.com/u/1251349?v=3","gravatar_id":"","url":"https://api.github.com/users/dgilland","html_url":"https://github.com/dgilland","followers_url":"https://api.github.com/users/dgilland/followers","following_url":"https://api.github.com/users/dgilland/following{/other_user}","gists_url":"https://api.github.com/users/dgilland/gists{/gist_id}","starred_url":"https://api.github.com/users/dgilland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dgilland/subscriptions","organizations_url":"https://api.github.com/users/dgilland/orgs","repos_url":"https://api.github.com/users/dgilland/repos","events_url":"https://api.github.com/users/dgilland/events{/privacy}","received_events_url":"https://api.github.com/users/dgilland/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":1,"state":"open","created_at":"2015-01-06T16:13:46Z","updated_at":"2015-01-14T14:57:44Z","due_on":null,"closed_at":null},"comments":0,"created_at":"2014-12-19T14:26:36Z","updated_at":"2015-01-14T14:57:44Z","closed_at":"2015-01-14T14:57:44Z","body":"Project: https://github.com/epeli/underscore.string\r\n\r\nFunctions:\r\n\r\n- [x] numberFormat\r\n- ~~levenshtein~~ (punting on this; will defer to other libraries which focus solely on this)\r\n- [x] capitalize\r\n- [x] decapitalize\r\n- [x] chop\r\n- [x] clean\r\n- [x] chars\r\n- [x] swapCase\r\n- [x] include (as `has_substr` since `include` already used in `collections`)\r\n- [x] count (as `count_substr` since `count` is too generic)\r\n- [x] escapeHTML (as `escape`)\r\n- [x] unescapeHTML (as `unescape`)\r\n- [x] insert (as `insert_substr`)\r\n- [x] replaceAll (as `replace`)\r\n- [x] isBlank\r\n- [x] join (as `implode`)\r\n- [x] lines\r\n- [x] reverse (in `pydash.arrays`; works for both lists and strings)\r\n- [x] splice\r\n- [x] startsWith\r\n- [x] endsWith\r\n- [x] pred\r\n- [x] succ\r\n- [x] titleize (as `title_case`)\r\n- [x] camelize (as `camel_case`)\r\n- [x] classify (as `class_case`)\r\n- [x] underscored (as `snake_case`)\r\n- ~~dasherize~~ (punting on this, it appears that `dasherize` behaves slightly different than `kebab_case` in that `dasherize` will append a `-` to the beginning of the string; consider adding `dash_case` as a separate function)\r\n- [x] humanize (as `human_case`)\r\n- [x] trim\r\n- [x] ltrim\r\n- [x] rtrim\r\n- [x] truncate\r\n- [x] prune\r\n- [x] words\r\n- ~~sprintf~~ (punting on this for now. Python already has string format functions but it may be worth having a chainable function for this)\r\n- [x] pad (functions as `lrpad`)\r\n- [x] lpad (as `pad_left`)\r\n- [x] rpad (as `pad_right`)\r\n- [x] lrpad (as `pad`)\r\n- [x] toNumber\r\n- [x] strRight (as `string_right`)\r\n- [x] strRightBack (as `string_right_back`)\r\n- [x] strLeft (as `string_left`)\r\n- [x] strLeftBack (as `string_left_back`)\r\n- [x] stripTags\r\n- [x] toSentence (as `series_phrase`)\r\n- [x] toSentenceSerial (as `series_phrase_serial`)\r\n- [x] repeat\r\n- [x] surround\r\n- [x] quote\r\n- [x] unquote\r\n- [x] slugify\r\n- ~~naturalCmp~~ (punting on this, there's a natural sort lib that does this: [natsort](https://github.com/SethMMorton/natsort))\r\n- [x] toBoolean\r\n"}}