{"id":28422254,"url":"https://github.com/turingschool-examples/museo","last_synced_at":"2026-01-20T17:26:30.472Z","repository":{"id":27561041,"uuid":"149043409","full_name":"turingschool-examples/museo","owner":"turingschool-examples","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-08T19:04:15.000Z","size":21,"stargazers_count":0,"open_issues_count":1,"forks_count":224,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-06-25T08:42:37.737Z","etag":null,"topics":["be-1","practice-assessment","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/turingschool-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null}},"created_at":"2018-09-16T23:08:44.000Z","updated_at":"2022-02-22T18:15:52.000Z","dependencies_parsed_at":"2025-06-25T08:36:19.461Z","dependency_job_id":"e12c14ac-812c-40c7-bc81-f38c8a95bf6a","html_url":"https://github.com/turingschool-examples/museo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/turingschool-examples/museo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turingschool-examples%2Fmuseo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turingschool-examples%2Fmuseo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turingschool-examples%2Fmuseo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turingschool-examples%2Fmuseo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/turingschool-examples","download_url":"https://codeload.github.com/turingschool-examples/museo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turingschool-examples%2Fmuseo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271991222,"owners_count":24854731,"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","status":"online","status_checked_at":"2025-08-24T02:00:11.135Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["be-1","practice-assessment","ruby"],"created_at":"2025-06-05T07:16:50.346Z","updated_at":"2026-01-20T17:26:30.444Z","avatar_url":"https://github.com/turingschool-examples.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Museo\n\n## Setup\n\n* Fork this Repository\n* Clone YOUR fork\n* Compete the activity below\n* Push your solution to your fork\n* Submit a pull request from your repository to the turingschool-examples repository\n  * Make sure to put your name in your PR!\n\n### Iteration 1\n\n```markdown\nThere are **3** points possible in Iteration 1:\n\n1.  Artist Creation (must include all attributes)\n2.  Photograph Creation (must include all attributes)\n3.  Artist #age_at_death\n```\n\nUse TDD to create a `Photograph` and an `Artist` class that respond to the following interaction pattern.\n\nFor `age_at_death`, assume an artist was born and died on the same day.\n\n```ruby\npry(main)\u003e require './lib/photograph'\n#=\u003e true\n\npry(main)\u003e require './lib/artist'\n#=\u003e true\n\npry(main)\u003e attributes = {\n  id: \"1\",\n  name: \"Rue Mouffetard, Paris (Boy with Bottles)\",\n  artist_id: \"4\",\n  year: \"1954\"\n}      \n\npry(main)\u003e photograph = Photograph.new(attributes)\n#=\u003e #\u003cPhotograph:0x00007fc2d1050c80...\u003e\n\npry(main)\u003e photograph.id\n#=\u003e \"1\"\n\npry(main)\u003e photograph.name\n#=\u003e \"Rue Mouffetard, Paris (Boy with Bottles)\"\n\npry(main)\u003e photograph.artist_id\n#=\u003e \"4\"\n\npry(main)\u003e photograph.year\n#=\u003e \"1954\"\n\npry(main)\u003e attributes = {\n  id: \"2\",\n  name: \"Ansel Adams\",\n  born: \"1902\",\n  died: \"1984\",\n  country: \"United States\"\n}\n\npry(main)\u003e artist = Artist.new(attributes)\n#=\u003e #\u003cArtist:0x00007fc2d0a6c080...\u003e\n\npry(main)\u003e artist.id\n#=\u003e \"2\"\n\npry(main)\u003e artist.name\n#=\u003e \"Ansel Adams\"\n\npry(main)\u003e artist.born\n#=\u003e \"1902\"\n\npry(main)\u003e artist.died\n#=\u003e \"1984\"\n\npry(main)\u003e artist.country\n#=\u003e \"United States\"\n\npry(main)\u003e artist.age_at_death\n#=\u003e 82\n```\n\n### Iteration 2\n\n```markdown\nThere are **3** points possible in Iteration 2:\n\n4. Curator Creation (must include all attributes)\n5. Curator #add_photograph \u0026 Curator #add_artist\n6. Curator #find_artist_by_id\n```\n\nUse TDD to create a `Curator` class that responds to the following interaction pattern:\n\n```ruby\npry(main)\u003e require './lib/photograph'\n# =\u003e true\n\npry(main)\u003e require './lib/artist'\n# =\u003e true\n\npry(main)\u003e require './lib/curator'\n# =\u003e true\n\npry(main)\u003e curator = Curator.new    \n# =\u003e #\u003cCurator:0x00007fb3d9111cc0...\u003e\n\npry(main)\u003e curator.photographs\n# =\u003e []\n\npry(main)\u003e photo_1 = Photograph.new({\n     id: \"1\",      \n     name: \"Rue Mouffetard, Paris (Boy with Bottles)\",      \n     artist_id: \"1\",      \n     year: \"1954\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fb3d8ea1cd8...\u003e\n\npry(main)\u003e photo_2 = Photograph.new({\n     id: \"2\",      \n     name: \"Moonrise, Hernandez\",      \n     artist_id: \"2\",      \n     year: \"1941\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fb3d8e0bfa8...\u003e\n\npry(main)\u003e curator.add_photograph(photo_1)\n\npry(main)\u003e curator.add_photograph(photo_2)\n\npry(main)\u003e curator.photographs\n# =\u003e [#\u003cPhotograph:0x00007fb3d8ea1cd8...\u003e, #\u003cPhotograph:0x00007fb3d8e0bfa8...\u003e]\n\npry(main)\u003e curator.artists\n# =\u003e []\n\npry(main)\u003e artist_1 = Artist.new({\n    id: \"1\",      \n    name: \"Henri Cartier-Bresson\",      \n    born: \"1908\",      \n    died: \"2004\",      \n    country: \"France\"      \n})        \n# =\u003e #\u003cArtist:0x00007fb3d8b4ed60...\u003e\n\npry(main)\u003e artist_2 = Artist.new({\n    id: \"2\",      \n    name: \"Ansel Adams\",      \n    born: \"1902\",      \n    died: \"1984\",      \n    country: \"United States\"      \n})        \n# =\u003e #\u003cArtist:0x00007fb3d90bb4b0...\u003e\n\npry(main)\u003e curator.add_artist(artist_1)\n\npry(main)\u003e curator.add_artist(artist_2)\n\npry(main)\u003e curator.artists\n# =\u003e [#\u003cArtist:0x00007fb3d8b4ed60...\u003e, #\u003cArtist:0x00007fb3d90bb4b0...\u003e]\n\npry(main)\u003e curator.find_artist_by_id(\"1\")\n# =\u003e #\u003cArtist:0x00007fb3d8b4ed60...\u003e\n```\n\n### Iteration 3\n\n```markdown\nThere are **3** points possible in Iteration 2:\n\n7. Curator #photographs_by_artist\n8. Curator #artists_with_multiple_photographs\n9. Curator #photographs_taken_by_artist_from\n```\n\nUse TDD to update your `Curator` class so that is supports the following methods:\n\n* `photographs_by_artist` - This method will return a hash with artists as keys, and an array of their photographs as values.\n* `artists_with_multiple_photographs` - This method returns an Array of names of artists who have more than one photograph\n* `photographs_taken_by_artists_from(string)` - This method takes a String representing a country. It returns an Array of `Photograph`s that were taken by a photographer from that country.\n\nThe `Curator` class should now respond to the following interaction pattern:\n\n```ruby\npry(main)\u003e require './lib/photograph'\n# =\u003e true\n\npry(main)\u003e require './lib/artist'\n# =\u003e true\n\npry(main)\u003e require './lib/curator'\n# =\u003e true\n\npry(main)\u003e curator = Curator.new\n# =\u003e #\u003cCurator:0x00007fabc6c2b680...\u003e\n\npry(main)\u003e photo_1 = Photograph.new({\n     id: \"1\",      \n     name: \"Rue Mouffetard, Paris (Boy with Bottles)\",      \n     artist_id: \"1\",      \n     year: \"1954\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fabc6933180...\u003e\n\npry(main)\u003e photo_2 = Photograph.new({    \n     id: \"2\",      \n     name: \"Moonrise, Hernandez\",      \n     artist_id: \"2\",      \n     year: \"1941\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fabc6c28e58...\u003e\n\npry(main)\u003e photo_3 = Photograph.new({    \n     id: \"3\",      \n     name: \"Identical Twins, Roselle, New Jersey\",      \n     artist_id: \"3\",      \n     year: \"1967\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fabc5bb9ef0...\u003e\n\npry(main)\u003e photo_4 = Photograph.new({    \n     id: \"4\",      \n     name: \"Monolith, The Face of Half Dome\",      \n     artist_id: \"3\",      \n     year: \"1927\"      \n})        \n# =\u003e #\u003cPhotograph:0x00007fabc6b931f0...\u003e\n\npry(main)\u003e artist_1 = Artist.new({    \n     id: \"1\",      \n     name: \"Henri Cartier-Bresson\",      \n     born: \"1908\",      \n     died: \"2004\",      \n     country: \"France\"      \n})        \n# =\u003e #\u003cArtist:0x00007fabc6a52340...\u003e\n\npry(main)\u003e artist_2 = Artist.new({    \n     id: \"2\",      \n     name: \"Ansel Adams\",      \n     born: \"1902\",      \n     died: \"1984\",      \n     country: \"United States\"      \n})        \n# =\u003e #\u003cArtist:0x00007fabc6c20870...\u003e\n\npry(main)\u003e artist_3 = Artist.new({    \n     id: \"3\",      \n     name: \"Diane Arbus\",      \n     born: \"1923\",      \n     died: \"1971\",      \n     country: \"United States\"      \n})        \n# =\u003e #\u003cArtist:0x00007fabc5ba0c70...\u003e\n\npry(main)\u003e curator.add_artist(artist_1)  \n\npry(main)\u003e curator.add_artist(artist_2)    \n\npry(main)\u003e curator.add_artist(artist_3)\n\npry(main)\u003e curator.add_photograph(photo_1)\n\npry(main)\u003e curator.add_photograph(photo_2)\n\npry(main)\u003e curator.add_photograph(photo_3)\n\npry(main)\u003e curator.add_photograph(photo_4)\n\npry(main)\u003e curator.photographs_by_artist\n# =\u003e {\n#        #\u003cArtist:0x00007fabc6a52340...\u003e =\u003e [#\u003cPhotograph:0x00007fabc6933180...\u003e],\n#        #\u003cArtist:0x00007fabc6c20870...\u003e =\u003e [#\u003cPhotograph:0x00007fabc6c28e58...\u003e],\n#        #\u003cArtist:0x00007fabc5ba0c70...\u003e =\u003e [#\u003cPhotograph:0x00007fabc5bb9ef0...\u003e, #\u003cPhotograph:0x00007fabc6b931f0...\u003e]\n#      }\n\npry(main)\u003e curator.artists_with_multiple_photographs\n# =\u003e [\"Diane Arbus\"]\n\npry(main)\u003e curator.photographs_taken_by_artist_from(\"United States\")\n# =\u003e [#\u003cPhotograph:0x00007fabc6c28e58...\u003e, #\u003cPhotograph:0x00007fabc5bb9ef0...\u003e, #\u003cPhotograph:0x00007fabc6b931f0...\u003e\n\npry(main)\u003e curator.photographs_taken_by_artist_from(\"Argentina\")\n# =\u003e []\n```\n\n### Iteration 4\n\n```markdown\nThere are **3** points possible in Iteration 2:\n\n10. Curator #load_photographs \u0026\u0026 #load_artists\n11. Curator #photographs_taken_between\n12. Curator #artists_photographs_by_age\n```\n\nUse TDD to add the following methods to your `Curator` class:\n\n* `load_photographs(file)` - This method takes a path to a CSV file containing photographs and adds them to the `Curator`. You may find the included `FileIO` class useful.\n* `load_artists(file)` - This method takes a path to a CSV file containing artists and adds them to the `Curator`. You may find the included `FileIO` class useful.\n* `photographs_taken_between(range)` - This method takes a range and returns an array of all photographs with a year that falls in that range.\n* `artists_photographs_by_age(artist)`- This method takes an `Artist` object and return a hash where the keys are the Artists age when they took a photograph, and the values are the names of the photographs.\n\n````ruby\npry(main)\u003e require './lib/curator'\n\npry(main)\u003e curator = Curator.new\n#=\u003e #\u003cCurator:0x00007fd98685b2b0...\u003e\n\npry(main)\u003e curator.load_photographs('./data/photographs.csv')\n\npry(main)\u003e curator.load_artists('./data/artists.csv')\n\npry(main)\u003e curator.photographs_taken_between(1950..1965)\n#=\u003e [#\u003cPhotograph:0x00007fd986254740...\u003e, #\u003cPhotograph:0x00007fd986254678...\u003e]\n\npry(main)\u003e diane_arbus = curator.find_artist_by_id(\"3\")    \n\npry(main)\u003e curator.artists_photographs_by_age(diane_arbus)\n=\u003e {44=\u003e\"Identical Twins, Roselle, New Jersey\", 39=\u003e\"Child with Toy Hand Grenade in Central Park\"}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturingschool-examples%2Fmuseo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fturingschool-examples%2Fmuseo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturingschool-examples%2Fmuseo/lists"}