{"push_id":1471021181,"size":20,"distinct_size":8,"ref":"refs/heads/190-fix-readonlyaddressbook","head":"4110a38551ce0a0416978f1f0f8bdb0cabb5a715","before":"b45ea5c902e78c9b26e05d0a886934c374a17c26","commits":[{"sha":"a8198d59f47468b83c73d79cc33b788abe0f9c6d","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Add section numbers to dev guide","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/a8198d59f47468b83c73d79cc33b788abe0f9c6d"},{"sha":"eaf2f21193a3256de70e0d5942b4341e34d05206","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Add captions for Dev Guide diagrams","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/eaf2f21193a3256de70e0d5942b4341e34d05206"},{"sha":"7195389ddd0cbdc4956b4baefa2a8da61a25542a","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Add section numbers to the user guide","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/7195389ddd0cbdc4956b4baefa2a8da61a25542a"},{"sha":"4bc46893c7d17b28c317c39492d046c86c25a7ad","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Rephrase method header comments to follow the coding style","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/4bc46893c7d17b28c317c39492d046c86c25a7ad"},{"sha":"cbf763bf0daa95e370ce3299eb0152fd8617b427","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Add authors to Dev Guide sections to be written individually","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/cbf763bf0daa95e370ce3299eb0152fd8617b427"},{"sha":"ee34067fad658c121745a87e31bd177a0ce51291","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Add template for Dev Guide: Product Survey","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/ee34067fad658c121745a87e31bd177a0ce51291"},{"sha":"7b1fc01915cbbec4318217496281325cf27bc4a3","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Refine NFRs in Dev Guide","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/7b1fc01915cbbec4318217496281325cf27bc4a3"},{"sha":"b7cd36fb51819d806f9c731ca4d05242bf982cec","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Fix GitHub page rendering of Dev Guide","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/b7cd36fb51819d806f9c731ca4d05242bf982cec"},{"sha":"a8493447cec673de1c54f2f375ce7253a76f44c1","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Fix github page rendering in User Guide","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/a8493447cec673de1c54f2f375ce7253a76f44c1"},{"sha":"6ca9b47712d7087b7ce708485deb602b53a1bf01","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Fix GitHub page rendering in LearningOutcomes.md","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/6ca9b47712d7087b7ce708485deb602b53a1bf01"},{"sha":"df3e2ca0fca50e31ed5d1d5615ea5ae2047c166f","author":{"name":"Damith C. Rajapakse","email":"962f9e179df0a204beb06f45f26c094eee4ac0cd@gmail.com"},"message":"Set theme jekyll-theme-cayman","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/df3e2ca0fca50e31ed5d1d5615ea5ae2047c166f"},{"sha":"15d91fd909ad422aaa0cc13039cbb297c199b448","author":{"name":"zzzzwen","email":"c58a1dc50155647b911a39e8a296ca15cadeec14@gmail.com"},"message":"[#233] Add unit test for CollectionUtil class (#234)\n\n* Add unit test for CollectionUtil class\r\n\r\n* Update comments","distinct":false,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/15d91fd909ad422aaa0cc13039cbb297c199b448"},{"sha":"6d39c1f1ed507e6f1df5cf6d9b56424e22b45942","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"PersonBuilder: don't propagate checked exceptions","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/6d39c1f1ed507e6f1df5cf6d9b56424e22b45942"},{"sha":"0ecd4a2cace624c00d3017aad9c4b1448feeb2c9","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"TypicalTestPersons: split up persons","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/0ecd4a2cace624c00d3017aad9c4b1448feeb2c9"},{"sha":"d144476fa243525dd426b0ecf0e7e6f7c725dd64","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"Remove redundant \"get empty address book\" methods\n\nIt seems strange that we have AddressBook#getEmptyAddressBook() and\nTestUtil#generateEmptyAddressBook() methods, when a simple\n`new AddressBook()` will give us what we want.","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/d144476fa243525dd426b0ecf0e7e6f7c725dd64"},{"sha":"e4afa4a98272fb95452c0d0fa35a6fef72866cca","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"ModelManager: merge two similar constructors\n\nBoth ModelManager(AddressBook, UserPrefs) and\nModelManager(ReadOnlyAddressBook, UserPrefs) both do exactly the same\nthing. Let's DRY up the code by merging them into one single\nconstructor.\n\nThe author notes that the `userPrefs` argument is currently not even\nused. However, fixing this is outside the scope of this commit.","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/e4afa4a98272fb95452c0d0fa35a6fef72866cca"},{"sha":"09faa8acfb88a2bad62bb3482e2f4850f40702fa","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"Fully encapsulate UniquePersonList and UniqueTagList within AddressBook\n\nReadOnlyAddressBook declares the following methods:\n\n* `UniqueTagList getUniqueTagList();`\n\n* `List<Tag> getTagList();`\n\n* `UniquePersonList getUniquePersonList();`\n\n* `List<ReadOnlyPerson> getPersonList();`\n\nAs we can see, there is some redundancy; both `getUniqueTagList()` and\n`getTagList()` conceptually do the same thing, and both\n`getUniquePersonList()` and `getPersonList()` conceptually do\nthe same thing as well.\n\nSo, to simplify the API we need to pick one set of APIs: either the ones\nthat return `UniqueXList`, or the ones that return `List<X>`.\n\nGoing with the API that returns `List<X>` is more beneficial than\n`UniqueXList`: Lists are widely used throughout our code and the\nstandard library, and thus returning a list would be much more\nconvenient for developers. `UniquePersonList` and `UniqueTagList`, on\nthe other hand, only implement the `Iterable` interface, and are thus\nslightly more annoying to write code with.\n\nHowever, there is a deeper problem as well: `UniquePersonList` and\n`UniqueTagList` both contain mutating methods, which violates the\ncontract of `ReadOnlyAddressBook` to provide a read-only view to the\naddress book. We could solve this by introducing\n`ReadOnlyUniquePersonList` and `ReadOnlyUniqueTagList` interfaces, but\nas argued above, by virtue of not implementing the `List`\ninterface these objects are more annoying to deal with and thus it is\nlikely better to not return them at all.\n\nAs such, this commit removes the `getUniqueTagList()` and\n`getUniquePersonList()` methods. In addition, we also remove all of the\nmethods of `AddressBook` that take a `UniquePersonList` or\n`UniqueTagList`, thus fully encapsulating these classes within\n`AddressBook`. This not only solves the contract violation problem as\ndiscussed above, it also reduces coupling as dependent classes will no\nlonger need to have knowledge of `UniquePersonList` or `UniqueTagList`\nany more, thus improving the quality of the API.","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/09faa8acfb88a2bad62bb3482e2f4850f40702fa"},{"sha":"162179b6d2e6c490fc9a7279134708d6dcad065d","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"AddressBook: replace getPersons() with getPersonList()\n\nReadOnlyAddressBook has a getPersonList() method which returns its list\nof persons as a List<ReadOnlyPerson>\n\nAddressBook has a getPersons() method which returns its list of persons\nas an ObservableList<Person>.\n\nSimplify the API by merging these methods together, by making\ngetPersonList() return an ObservableList<ReadOnlyPerson> and removing\ngetPersons().","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/162179b6d2e6c490fc9a7279134708d6dcad065d"},{"sha":"febf8784c87cf2d0d9e19205d2b85d4eac7a2910","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"ReadOnlyAddressBook: make getTagList() return an ObservableList\n\nEven though there are currently no callers that require the return value\nto be an ObservableList, this is still done for consistency with\ngetPersonList() and to make it easier to implement future UI features\nsuch as a listing of all tags.","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/febf8784c87cf2d0d9e19205d2b85d4eac7a2910"},{"sha":"4110a38551ce0a0416978f1f0f8bdb0cabb5a715","author":{"name":"Paul Tan","email":"47694dae389453634f0f8d3a618ffe16016d5f4c@gmail.com"},"message":"WIP","distinct":true,"url":"https://api.github.com/repos/pyokagan/addressbook-level4/commits/4110a38551ce0a0416978f1f0f8bdb0cabb5a715"}]}
{"actor":{"display_login":"pyokagan"}}