{"action":"closed","number":56,"pull_request":{"url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56","id":40264858,"html_url":"https://github.com/rapid7/metasploit-cache/pull/56","diff_url":"https://github.com/rapid7/metasploit-cache/pull/56.diff","patch_url":"https://github.com/rapid7/metasploit-cache/pull/56.patch","issue_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/56","number":56,"state":"closed","locked":false,"title":"Metasploit::Cache::Encoder::Instance::Ephemeral and Metasploit::Cache::Encoder::Instance::Load","user":{"login":"limhoff-r7","id":2230482,"avatar_url":"https://avatars.githubusercontent.com/u/2230482?v=3","gravatar_id":"","url":"https://api.github.com/users/limhoff-r7","html_url":"https://github.com/limhoff-r7","followers_url":"https://api.github.com/users/limhoff-r7/followers","following_url":"https://api.github.com/users/limhoff-r7/following{/other_user}","gists_url":"https://api.github.com/users/limhoff-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/limhoff-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/limhoff-r7/subscriptions","organizations_url":"https://api.github.com/users/limhoff-r7/orgs","repos_url":"https://api.github.com/users/limhoff-r7/repos","events_url":"https://api.github.com/users/limhoff-r7/events{/privacy}","received_events_url":"https://api.github.com/users/limhoff-r7/received_events","type":"User","site_admin":false},"body":"MSP-12441\r\n\r\n`Metasploit::Cache::Encoder::Instance::Ephemeral#persist` copies attributes on an encoder Metasploit Module instance to attributes on a `Metasploit::Cache::Encoder::Instance` and synchronizes collection on the encoder Metasploit Module instance to associations on the `Metasploit::Cache::Encoder::Instance`.  \r\n\r\nSynchronization involves detecting added, removed, and unchanged associating using a unique key for each association. As `Metasploit::Cache::Auxiliary::Instance` was the first `*::Instance` class to get an `*::Ephemeral`, this PR involved writing and testing the synchronizers for each association it has that haven't been encountered in #53: architecturable_architectures and platformable_platforms.\r\n\r\nLater \"*::Instance::Ephemeral and *::Instance::Load\" stories won't have to reimplement and test synchronizers for those associations, but they will need to write and test any association where they are the first class to have them, such as referencable_references or targets.  This requirement that the first class that needs an association has to write the ephemeral cache to remain valid when loading means that the stories will become dependent on each other so that they don't have to reimplement the same synchronization code.\r\n\r\n# Pre-verification Steps\r\n- [x] Merge #54 \r\n\r\n# Verification Steps\r\n\r\n## Postgresql\r\n- [x] `rm Gemfile.lock`\r\n- [x] `bundle install --without sqlite3`\r\n- [x] `rake db:drop db:create db:migrate`\r\n\r\n### Test coverage\r\n- [x] `rake cucumber spec coverage`\r\n- [x] VERIFY no failures\r\n- [x] VERIFY 100% coverage\r\n\r\n### Documentation Coverage\r\n- [x] `rake yard:stats`\r\n- [x] VERIFY only `[warn]`ings are `@param` on scopes due to yard-activerecord bug.\r\n- [x] VERIFY no undocumented objects\r\n\r\n## Sqlite3\r\n- [x] `rm Gemfile.lock`\r\n- [x] `bundle install --without postgresql`\r\n- [x] `rake db:drop db:create db:migrate`\r\n\r\n### Test coverage\r\n- [x] `rake cucumber spec coverage`\r\n- [x] VERIFY no failures\r\n- [x] VERIFY 100% coverage\r\n\r\n### Documentation coverage\r\n- [x] `rake yard:stats`\r\n- [x] VERIFY only `[warn]`ings are for `@param` tags for scopes that `yard-activerecord` doesn't support.\r\n- [x] VERIFY no undocumented objects\r\n\r\n# Post-merge Steps\r\n\r\nPerform these steps prior to pushing to master or the build will be broken on master.\r\n\r\n## Version\r\n- [x] Edit `lib/metasploit/cache/version.rb`\r\n- [x] Remove `PRERELEASE` and its comment as `PRERELEASE` is not defined on master.\r\n\r\n## Gem build\r\n- [x] gem build *.gemspec\r\n- [x] VERIFY the gem has no '.pre' version suffix.\r\n\r\n## RSpec\r\n- [x] `rake spec`\r\n- [x] VERIFY version examples pass without failures\r\n\r\n## Commit & Push\r\n- [x] `git commit -a`\r\n- [x] `git push origin master`","created_at":"2015-07-17T19:43:35Z","updated_at":"2015-07-21T22:23:11Z","closed_at":"2015-07-21T22:23:11Z","merged_at":"2015-07-21T22:23:11Z","merge_commit_sha":"f432c28d8e554cc815ad20e41c346b9c04d59179","assignee":null,"milestone":{"url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones/1","html_url":"https://github.com/rapid7/metasploit-cache/milestones/v1.0.0","labels_url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones/1/labels","id":1209660,"number":1,"title":"v1.0.0","description":"All metasploit-framework Metasploit Modules can be completed loaded into the cache including ancestor, class, and instance data.","creator":{"login":"limhoff-r7","id":2230482,"avatar_url":"https://avatars.githubusercontent.com/u/2230482?v=3","gravatar_id":"","url":"https://api.github.com/users/limhoff-r7","html_url":"https://github.com/limhoff-r7","followers_url":"https://api.github.com/users/limhoff-r7/followers","following_url":"https://api.github.com/users/limhoff-r7/following{/other_user}","gists_url":"https://api.github.com/users/limhoff-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/limhoff-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/limhoff-r7/subscriptions","organizations_url":"https://api.github.com/users/limhoff-r7/orgs","repos_url":"https://api.github.com/users/limhoff-r7/repos","events_url":"https://api.github.com/users/limhoff-r7/events{/privacy}","received_events_url":"https://api.github.com/users/limhoff-r7/received_events","type":"User","site_admin":false},"open_issues":1,"closed_issues":5,"state":"open","created_at":"2015-07-15T16:05:27Z","updated_at":"2015-07-21T22:23:11Z","due_on":"2015-08-08T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56/commits","review_comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56/comments","review_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/56/comments","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/1a69221af4612b9d658c12b265a41740cf21df52","head":{"label":"rapid7:feature/MSP-12441/encoder-instance-ephemeral-and-load","ref":"feature/MSP-12441/encoder-instance-ephemeral-and-load","sha":"1a69221af4612b9d658c12b265a41740cf21df52","user":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"repo":{"id":27936087,"name":"metasploit-cache","full_name":"rapid7/metasploit-cache","owner":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rapid7/metasploit-cache","description":"Managing Metasploit content since 2015","fork":false,"url":"https://api.github.com/repos/rapid7/metasploit-cache","forks_url":"https://api.github.com/repos/rapid7/metasploit-cache/forks","keys_url":"https://api.github.com/repos/rapid7/metasploit-cache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapid7/metasploit-cache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapid7/metasploit-cache/teams","hooks_url":"https://api.github.com/repos/rapid7/metasploit-cache/hooks","issue_events_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/events{/number}","events_url":"https://api.github.com/repos/rapid7/metasploit-cache/events","assignees_url":"https://api.github.com/repos/rapid7/metasploit-cache/assignees{/user}","branches_url":"https://api.github.com/repos/rapid7/metasploit-cache/branches{/branch}","tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/tags","blobs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/{sha}","languages_url":"https://api.github.com/repos/rapid7/metasploit-cache/languages","stargazers_url":"https://api.github.com/repos/rapid7/metasploit-cache/stargazers","contributors_url":"https://api.github.com/repos/rapid7/metasploit-cache/contributors","subscribers_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscribers","subscription_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscription","commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/comments{/number}","contents_url":"https://api.github.com/repos/rapid7/metasploit-cache/contents/{+path}","compare_url":"https://api.github.com/repos/rapid7/metasploit-cache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapid7/metasploit-cache/merges","archive_url":"https://api.github.com/repos/rapid7/metasploit-cache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapid7/metasploit-cache/downloads","issues_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues{/number}","pulls_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls{/number}","milestones_url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones{/number}","notifications_url":"https://api.github.com/repos/rapid7/metasploit-cache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapid7/metasploit-cache/labels{/name}","releases_url":"https://api.github.com/repos/rapid7/metasploit-cache/releases{/id}","created_at":"2014-12-12T20:04:36Z","updated_at":"2015-05-25T15:12:37Z","pushed_at":"2015-07-21T22:23:11Z","git_url":"git://github.com/rapid7/metasploit-cache.git","ssh_url":"git@github.com:rapid7/metasploit-cache.git","clone_url":"https://github.com/rapid7/metasploit-cache.git","svn_url":"https://github.com/rapid7/metasploit-cache","homepage":"","size":17208,"stargazers_count":1,"watchers_count":1,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":1,"default_branch":"master"}},"base":{"label":"rapid7:master","ref":"master","sha":"3b7ffa56f0572c18bc65533cd0bb8c895a2f75f7","user":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"repo":{"id":27936087,"name":"metasploit-cache","full_name":"rapid7/metasploit-cache","owner":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rapid7/metasploit-cache","description":"Managing Metasploit content since 2015","fork":false,"url":"https://api.github.com/repos/rapid7/metasploit-cache","forks_url":"https://api.github.com/repos/rapid7/metasploit-cache/forks","keys_url":"https://api.github.com/repos/rapid7/metasploit-cache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapid7/metasploit-cache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapid7/metasploit-cache/teams","hooks_url":"https://api.github.com/repos/rapid7/metasploit-cache/hooks","issue_events_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/events{/number}","events_url":"https://api.github.com/repos/rapid7/metasploit-cache/events","assignees_url":"https://api.github.com/repos/rapid7/metasploit-cache/assignees{/user}","branches_url":"https://api.github.com/repos/rapid7/metasploit-cache/branches{/branch}","tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/tags","blobs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/{sha}","languages_url":"https://api.github.com/repos/rapid7/metasploit-cache/languages","stargazers_url":"https://api.github.com/repos/rapid7/metasploit-cache/stargazers","contributors_url":"https://api.github.com/repos/rapid7/metasploit-cache/contributors","subscribers_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscribers","subscription_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscription","commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/comments{/number}","contents_url":"https://api.github.com/repos/rapid7/metasploit-cache/contents/{+path}","compare_url":"https://api.github.com/repos/rapid7/metasploit-cache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapid7/metasploit-cache/merges","archive_url":"https://api.github.com/repos/rapid7/metasploit-cache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapid7/metasploit-cache/downloads","issues_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues{/number}","pulls_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls{/number}","milestones_url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones{/number}","notifications_url":"https://api.github.com/repos/rapid7/metasploit-cache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapid7/metasploit-cache/labels{/name}","releases_url":"https://api.github.com/repos/rapid7/metasploit-cache/releases{/id}","created_at":"2014-12-12T20:04:36Z","updated_at":"2015-05-25T15:12:37Z","pushed_at":"2015-07-21T22:23:11Z","git_url":"git://github.com/rapid7/metasploit-cache.git","ssh_url":"git@github.com:rapid7/metasploit-cache.git","clone_url":"https://github.com/rapid7/metasploit-cache.git","svn_url":"https://github.com/rapid7/metasploit-cache","homepage":"","size":17208,"stargazers_count":1,"watchers_count":1,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56"},"html":{"href":"https://github.com/rapid7/metasploit-cache/pull/56"},"issue":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/issues/56"},"comments":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/issues/56/comments"},"review_comments":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56/comments"},"review_comment":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/56/commits"},"statuses":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/1a69221af4612b9d658c12b265a41740cf21df52"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"gmikeska-r7","id":11615916,"avatar_url":"https://avatars.githubusercontent.com/u/11615916?v=3","gravatar_id":"","url":"https://api.github.com/users/gmikeska-r7","html_url":"https://github.com/gmikeska-r7","followers_url":"https://api.github.com/users/gmikeska-r7/followers","following_url":"https://api.github.com/users/gmikeska-r7/following{/other_user}","gists_url":"https://api.github.com/users/gmikeska-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/gmikeska-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmikeska-r7/subscriptions","organizations_url":"https://api.github.com/users/gmikeska-r7/orgs","repos_url":"https://api.github.com/users/gmikeska-r7/repos","events_url":"https://api.github.com/users/gmikeska-r7/events{/privacy}","received_events_url":"https://api.github.com/users/gmikeska-r7/received_events","type":"User","site_admin":false},"comments":0,"review_comments":0,"commits":13,"additions":2239,"deletions":5,"changed_files":25}}