{"id":16701700,"url":"https://github.com/coryodaniel/dm-property-manager","last_synced_at":"2025-10-05T22:16:57.035Z","repository":{"id":559791,"uuid":"190666","full_name":"coryodaniel/dm-property-manager","owner":"coryodaniel","description":"Model ancestry and property management","archived":false,"fork":false,"pushed_at":"2009-10-02T01:38:44.000Z","size":84,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-21T01:26:22.285Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/coryodaniel/dm-property-manager","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/coryodaniel.png","metadata":{"files":{"readme":"README.markdown","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}},"created_at":"2009-05-02T04:24:00.000Z","updated_at":"2019-08-13T14:23:06.000Z","dependencies_parsed_at":"2022-07-04T23:31:01.972Z","dependency_job_id":null,"html_url":"https://github.com/coryodaniel/dm-property-manager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coryodaniel%2Fdm-property-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coryodaniel%2Fdm-property-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coryodaniel%2Fdm-property-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coryodaniel%2Fdm-property-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coryodaniel","download_url":"https://codeload.github.com/coryodaniel/dm-property-manager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243538121,"owners_count":20307101,"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-10-12T18:45:14.104Z","updated_at":"2025-10-05T22:16:52.001Z","avatar_url":"https://github.com/coryodaniel.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"Compatible w/ DM \u003e= 0.9.11\n \nDM PropertyManager is useful when you have similar models with identical properties/relationships between the two.\n\nWhenever a model manages another model it also gets a few factory methods: \n * new_*model_name* : creates an unsaved instance\n * create_*model_name* : creates a saved instance\n * create_*model_name*_and_destroy : creates a saved instance and destroy the object you are working with\n \nThe factory methods will populate the created instance with all the values of the property of the managing\ninstance.\n\nExample: Rsvp.manage(:seat){...do_something...}\nRsvp.new.respond_to? :new_seat #=\u003e true\n\nTODOS\n======\n  * #has relationships should auto populate, see hack below\n  * #belongs_to relationships should auto populate, see hack below\n\n# Simple Example #\n\n    class Rsvp\n      include DataMapper::Resource\n      include DataMapper::PropertyManager\n\n      property :id, Serial\n\n      manage(:seat) do\n        belongs_to :room #some other model\n  \n        property :confirmation, String\n        property :section, String\n        property :number, String\n      end\n    end\n\n    class Seat\n      include DataMapper::Resource\n\n      property :id, Serial\n      property :arrived_at, DateTime\n    end\n\n    @rsvp = Rsvp.new\n    @rsvp.confirmation = \"209fa9bj9jaa\"\n    @rsvp.section = \"Orchestra\"\n    @rsvp.number  = \"10A\"\n    @rsvp.save\n\n    @seat = @rsvp.new_seat(:arrived_at=\u003eTime.now)\n    @seat.section #=\u003e \"Orchestra\"\n    @seat.arrived_at = \"Fri May 01 21:18:24 -0700 2009\"\n\n  \n\n# Delegation #\nDelegation is useful when you have similar models, and you'd like to declare the like properties/relationships\nin one place and delegate the control of the 'managed models' to another model.\n  \nFor the example we have a ticket system with three types of tickets (yeah its a stupid example):\n * Unsold Tickets\n * Sold Tickets\n * Stubs \n\n    class UnsoldTicket\n      include DataMapper::Resource\n      include DataMapper::PropertyManager\n\n      property :id,     Serial\n  \n      manage(:sold_tickets =\u003e :stub) do\n        belongs_to :concert\n        property :seat,     String\n        property :section,  Enum[:pit, :dance_floor, :really_far_back]\n        property :price,    Float\n      end\n    end\n\n    class SoldTicket\n      include DataMapper::Resource\n      include DataMapper::PropertyManager\n\n      property :id,     Serial\n    end\n\n    class Stub\n      include DataMapper::Resource\n      include DataMapper::PropertyManager\n\n      property :id,     Serial\n    end\n    \n    @unsold_ticket = UnsoldTicket.new\n    @unsold_ticket.concert = Concert.get(\"Britney Spears, Live from your butthole\")\n    @unsold_ticket.seat     = \"33A\"\n    @unsold_ticket.section  = :pit\n    @unsold_ticket.price    = 1.30\n    @unsold_ticket.save\n    \n    @unsold_ticket.new_sold_ticket #=\u003e an unsaved new ticket with the same properties\n    @unsold_ticket.create_sold_ticket #=\u003e a saved ticket with the same properties\n    @unsold_ticket.create_sold_ticket(:price=\u003e2.50) #=\u003e a saved ticket overriding the price\n    @unsold_ticket.create_sold_ticket_and_destroy #=\u003e a saved ticket and destroy the unsold one\n    \n    @sold_ticket = @unsold_ticket.create_sold_ticket_and_destroy(:price =\u003e 25.30)\n    \n    # the concert comes and goes...\n    @stub = @sold_ticket.create_stub_and_destroy #=\u003e destroyes the sold ticket and makes it a ticket stub.\n\n\n# Auto Archiver #\nPropertyManager can be used to manage properties between a model and some archived version of the model\n  \n    class User\n      include DataMapper::Resource\n      include DataMapper::PropertyManager\n\n      property :id,     Serial  \n  \n      manage(:archived_user) do\n        property :name,   String\n        property :email,  String\n        property :password,  String\n        property :created_at, DateTime\n      end\n  \n      def archive!\n        @au = new_archived_user\n        @au.deleted_at = Time.now\n        @au.save\n        self.destroy\n    \n        @au\n      end\n  \n    end\n\n    class ArchivedUser\n      include DataMapper::Resource\n  \n      def self.default_repository_name\n        :my_archive_repository\n      end\n      property :id, Serial\n      property :deleted_at, DateTime\n    end\n\n    user = User.new\n    user.name = \"Cory Odaniel\"\n    user.email = \"propmanager@coryodaniel.com\"\n    user.password = \"secretz\"\n    user.save\n\n    # Move the user to the archive_users repo\n    user.archive!                         \n    \n# Hack for auto populating relationships #\n    class Dad\n      include DataMapper::Resource\n      property :id, Serial\n      property :first_name, String\n      \n      manage(:kid) do\n        belongs_to :dad   \n        property :dad_id,     Integer\n        property :last_name,  String\n      end\n    end\n    \n    class Kid\n      include DataMapper::Resource\n      property :id, Serial\n      property :first_name, String\n    end\n    \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoryodaniel%2Fdm-property-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoryodaniel%2Fdm-property-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoryodaniel%2Fdm-property-manager/lists"}