{"id":13747356,"url":"https://github.com/basecamp/name_of_person","last_synced_at":"2025-07-20T03:31:13.765Z","repository":{"id":47288017,"uuid":"147034965","full_name":"basecamp/name_of_person","owner":"basecamp","description":"Presenting names of people in full, familiar, abbreviated, and initialized forms (but without titulation etc)","archived":false,"fork":false,"pushed_at":"2024-01-30T23:54:10.000Z","size":24,"stargazers_count":788,"open_issues_count":3,"forks_count":56,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-07-18T05:34:48.262Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/basecamp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-01T21:45:49.000Z","updated_at":"2025-07-16T16:46:59.000Z","dependencies_parsed_at":"2024-06-18T20:13:06.604Z","dependency_job_id":null,"html_url":"https://github.com/basecamp/name_of_person","commit_stats":{"total_commits":20,"total_committers":8,"mean_commits":2.5,"dds":0.35,"last_synced_commit":"f0884a4e98a823eddb50ac2e24f671683b7c12cb"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/basecamp/name_of_person","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fname_of_person","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fname_of_person/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fname_of_person/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fname_of_person/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basecamp","download_url":"https://codeload.github.com/basecamp/name_of_person/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fname_of_person/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266063095,"owners_count":23870716,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T06:01:25.921Z","updated_at":"2025-07-20T03:31:13.725Z","avatar_url":"https://github.com/basecamp.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# Name of Person\n\nPresenting names for English-language applications where a basic model of first and last name(s) combined is sufficient. This approach is not meant to cover all possible naming cases, deal with other languages, or even titulations. Just the basics.\n\n## Examples\n\n```ruby\n# Relies on Person having a schema with first_name and last_name columns.\nclass Person \u003c ApplicationRecord\n  has_person_name\nend\n\n# Saves a new record using { first_name: \"David\", last_name: \"Heinemeier Hansson\" }\nperson = Person.create! name: \"David Heinemeier Hansson\"\n\nperson.name.full        # =\u003e \"David Heinemeier Hansson\"\nperson.name.first       # =\u003e \"David\"\nperson.name.last        # =\u003e \"Heinemeier Hansson\"\nperson.name.initials    # =\u003e \"DHH\"\nperson.name.familiar    # =\u003e \"David H.\"\nperson.name.abbreviated # =\u003e \"D. Heinemeier Hansson\"\nperson.name.sorted      # =\u003e \"Heinemeier Hansson, David\"\nperson.name.mentionable # =\u003e \"davidh\"\nperson.name.possessive  # =\u003e \"David Heinemeier Hansson's\"\nperson.name.possessive(:first)  # =\u003e \"David's\"\nperson.name.possessive(:last)  # =\u003e \"Hansson's\"\nperson.name.possessive(:initials)  # =\u003e \"DHH's\"\nperson.name.possessive(:sorted)  # =\u003e \"Heinemeier Hansson, David's\"\nperson.name.possessive(:abbreviated)  # =\u003e \"D. Heinemeier Hansson's\"\n\n\n# Use directly\nname = NameOfPerson::PersonName.full(\"David Heinemeier Hansson\")\nname.first # =\u003e \"David\"\n```\n\n## Installation\n\n```ruby\n# Gemfile\ngem 'name_of_person'\n```\n\nIf you are using this outside of Rails, make sure `ActiveRecord` and/or `ActiveModel` are manually required.\n\n```ruby\nrequire 'active_record'\n# and/or\nrequire 'active_model'\n```\n\n## No further development is going to happen\n\nThis gem is essentially frozen, as the developers have decided to only deal with full names going forward in their applications. Feel free to fork this work, brand it under a new name, and continue development.\n\n## License\n\nName of Person is released under the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fname_of_person","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasecamp%2Fname_of_person","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fname_of_person/lists"}