Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fetch current user's issues & a specific repository's issues #28

Merged
merged 48 commits into from
Jul 20, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
8a08d9e
Add Issues model objects and setup test
Palleas May 24, 2016
d8a0755
Add endpoint to fetch issues from repository
Palleas May 25, 2016
33a83bf
Update fixtures
Palleas May 25, 2016
c78dd06
Add passing test for Issues
Palleas May 26, 2016
1913103
Add more complete Issue equal test
Palleas May 26, 2016
de69f68
Add locked and comments fields
Palleas May 26, 2016
461d623
Add updatedAt and createdAt
Palleas May 26, 2016
0febb59
WIP
Palleas Jun 7, 2016
ec91138
Fix User/UserInfo changes
Palleas Jul 8, 2016
32b3a8f
Add public method in client
Palleas Jul 8, 2016
0b529bb
Add method to fetch issues for a repository
Palleas Jul 8, 2016
1c00fed
Cleanup
Palleas Jul 8, 2016
8f7cdc2
Update fixtures
Palleas Jul 10, 2016
3ef97cf
Parse labels
Palleas Jul 10, 2016
41f7bef
Handle closed_at field
Palleas Jul 12, 2016
8761bb5
Handle assignee field
Palleas Jul 12, 2016
09edcc6
Really handle closed_at field
Palleas Jul 12, 2016
5622148
Add Milestone model object
Palleas Jul 13, 2016
3ddfc68
Add support for milestone
Palleas Jul 14, 2016
3dd12dc
Add second issue (a pull request) in the fixtures
Palleas Jul 14, 2016
f3c9356
Add support for pull request
Palleas Jul 14, 2016
523bfbf
Cleanup
Palleas Jul 14, 2016
73e94d1
Sort files alphabetically
Palleas Jul 15, 2016
509b6d1
issues → assignedIssues
Palleas Jul 15, 2016
7f47a7a
Use perPage argument
Palleas Jul 15, 2016
2dcacd9
issuesForRepositories → issuesInRepository
Palleas Jul 15, 2016
d2ac696
Fix indent
Palleas Jul 15, 2016
af3940b
Makes createdAt and updatedAt mandatory
Palleas Jul 15, 2016
46c0030
Add comments
Palleas Jul 15, 2016
314d6c5
Fix mapping
Palleas Jul 15, 2016
823a927
Include SWColors to map hex code to colors
Palleas Jul 15, 2016
d94fdc7
Fix tests by updating expected result
Palleas Jul 15, 2016
706046c
Make Milestone's ID a string
Palleas Jul 15, 2016
75cdca1
Rename some fields and remove useless API URLs
Palleas Jul 15, 2016
4f595f0
Fix formatting
Palleas Jul 16, 2016
2691f3c
Add comments
Palleas Jul 16, 2016
d6e353a
Add back SWColors that got removed during rebase
Palleas Jul 16, 2016
d96630c
Issues → AssignedIssues
Palleas Jul 18, 2016
71a9e44
Rename url → URL and fix indent
Palleas Jul 18, 2016
341353e
Remove dup file
Palleas Jul 18, 2016
d68bf73
Use assignees list
Palleas Jul 18, 2016
f331218
Reindent
Palleas Jul 18, 2016
74b091b
More ident fixes
Palleas Jul 19, 2016
0762aec
contentDescription -> body
Palleas Jul 19, 2016
b483033
Make milestone due date optional
Palleas Jul 19, 2016
500f8bd
Add doc in Milestone
Palleas Jul 19, 2016
4d99b2e
Rename count of things to match Swift's stdlib
Palleas Jul 19, 2016
3b99f04
Add custom color type
Palleas Jul 19, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Carthage/Checkouts/Curry
2 changes: 1 addition & 1 deletion Carthage/Checkouts/ReactiveCocoa
Submodule ReactiveCocoa updated 71 files
+1 −23 .travis.yml
+3 −3 CHANGELOG.md
+3 −2 CONTRIBUTING.md
+1 −1 Cartfile
+3 −3 Cartfile.private
+4 −4 Cartfile.resolved
+1 −1 Carthage/Checkouts/Nimble
+1 −1 Carthage/Checkouts/Quick
+1 −1 Carthage/Checkouts/Result
+1 −1 Carthage/Checkouts/xcconfigs
+4 −5 Documentation/BasicOperators.md
+3 −92 Documentation/DebuggingTechniques.md
+4 −4 Documentation/DesignGuidelines.md
+1 −1 Documentation/FrameworkOverview.md
+8 −46 README.md
+0 −241 ReactiveCocoa.playground/Pages/Signal.xcplaygroundpage/Contents.swift
+0 −796 ReactiveCocoa.playground/Pages/SignalProducer.xcplaygroundpage/Contents.swift
+0 −10 ReactiveCocoa.playground/Sources/PlaygroundUtility.swift
+0 −7 ReactiveCocoa.playground/contents.xcplayground
+31 −328 ReactiveCocoa.xcodeproj/project.pbxproj
+3 −65 ReactiveCocoa.xcodeproj/xcshareddata/xcschemes/ReactiveCocoa-tvOS.xcscheme
+0 −3 ReactiveCocoa.xcworkspace/contents.xcworkspacedata
+2 −2 ReactiveCocoa/Objective-C/NSControl+RACCommandSupport.h
+1 −1 ReactiveCocoa/Objective-C/NSObject+RACDescription.h
+1 −1 ReactiveCocoa/Objective-C/NSObject+RACDescription.m
+2 −1 ReactiveCocoa/Objective-C/NSObject+RACSelectorSignal.m
+4 −4 ReactiveCocoa/Objective-C/RACCommand.h
+15 −28 ReactiveCocoa/Objective-C/RACCompoundDisposable.m
+17 −0 ReactiveCocoa/Objective-C/RACObjCRuntime.h
+22 −0 ReactiveCocoa/Objective-C/RACObjCRuntime.m
+1 −2 ReactiveCocoa/Objective-C/RACSequence.h
+1 −5 ReactiveCocoa/Objective-C/RACSequence.m
+20 −34 ReactiveCocoa/Objective-C/RACSerialDisposable.m
+21 −12 ReactiveCocoa/Objective-C/RACSignal.m
+1 −0 ReactiveCocoa/Objective-C/RACStream.m
+2 −4 ReactiveCocoa/Objective-C/RACSubject.m
+2 −2 ReactiveCocoa/Objective-C/UIBarButtonItem+RACCommandSupport.h
+2 −2 ReactiveCocoa/Objective-C/UIButton+RACCommandSupport.h
+2 −5 ReactiveCocoa/Objective-C/UIControl+RACSignalSupport.m
+2 −2 ReactiveCocoa/Objective-C/UIRefreshControl+RACCommandSupport.h
+1 −2 ReactiveCocoa/ReactiveCocoa.h
+79 −25 ReactiveCocoa/Swift/Action.swift
+10 −17 ReactiveCocoa/Swift/Atomic.swift
+0 −82 ReactiveCocoa/Swift/CocoaAction.swift
+15 −32 ReactiveCocoa/Swift/Disposable.swift
+0 −85 ReactiveCocoa/Swift/DynamicProperty.swift
+0 −99 ReactiveCocoa/Swift/EventLogger.swift
+10 −396 ReactiveCocoa/Swift/Flatten.swift
+5 −14 ReactiveCocoa/Swift/FoundationExtensions.swift
+4 −4 ReactiveCocoa/Swift/ObjectiveCBridging.swift
+4 −24 ReactiveCocoa/Swift/Observer.swift
+92 −52 ReactiveCocoa/Swift/Property.swift
+24 −40 ReactiveCocoa/Swift/Scheduler.swift
+138 −386 ReactiveCocoa/Swift/Signal.swift
+92 −313 ReactiveCocoa/Swift/SignalProducer.swift
+4 −4 ReactiveCocoaTests/Objective-C/RACCommandSpec.m
+0 −13 ReactiveCocoaTests/Objective-C/RACSignalSpec.m
+2 −34 ReactiveCocoaTests/Objective-C/RACSubjectSpec.m
+58 −0 ReactiveCocoaTests/Swift/ActionSpec.swift
+0 −85 ReactiveCocoaTests/Swift/CocoaActionSpec.swift
+0 −840 ReactiveCocoaTests/Swift/FlattenSpec.swift
+1 −16 ReactiveCocoaTests/Swift/FoundationExtensionsSpec.swift
+7 −100 ReactiveCocoaTests/Swift/PropertySpec.swift
+3 −5 ReactiveCocoaTests/Swift/SchedulerSpec.swift
+3 −3 ReactiveCocoaTests/Swift/SignalLifetimeSpec.swift
+66 −251 ReactiveCocoaTests/Swift/SignalProducerLiftingSpec.swift
+70 −175 ReactiveCocoaTests/Swift/SignalProducerSpec.swift
+68 −371 ReactiveCocoaTests/Swift/SignalSpec.swift
+0 −25 ReactiveCocoaTests/Swift/TestLogger.swift
+0 −46 script/build
+0 −23 script/validate-playground.sh
66 changes: 62 additions & 4 deletions Tentacle.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,26 @@
619081891C8A2DB7001BE2F8 /* GitHubErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB0765E1C8A019A00ABD373 /* GitHubErrorTests.swift */; };
6190818A1C8A2DB7001BE2F8 /* ReleaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0F40A11C8909EB00E3B11A /* ReleaseTests.swift */; };
6190818B1C8A2DB7001BE2F8 /* (null) in Sources */ = {isa = PBXBuildFile; };
7A1A82561CF3DBAC0076E2DD /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82551CF3DBAC0076E2DD /* Issue.swift */; };
7A1A82581CF3DE4C0076E2DD /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82571CF3DE4C0076E2DD /* Label.swift */; };
7A1A825A1CF3DEEA0076E2DD /* Milestone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82591CF3DEEA0076E2DD /* Milestone.swift */; };
7A1A825E1CF3E5B60076E2DD /* PullRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A825D1CF3E5B60076E2DD /* PullRequest.swift */; };
7A1F20ED1D3E85BB00F275F8 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EC1D3E85BB00F275F8 /* Color.swift */; };
7A1F20EE1D3E862200F275F8 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EC1D3E85BB00F275F8 /* Color.swift */; };
7A1F20F01D3E86D900F275F8 /* ColorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EF1D3E86D900F275F8 /* ColorTests.swift */; };
7A1F20F11D3E872800F275F8 /* ColorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EF1D3E86D900F275F8 /* ColorTests.swift */; };
7A1F20F21D3E873500F275F8 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EC1D3E85BB00F275F8 /* Color.swift */; };
7A1F20F31D3E873600F275F8 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1F20EC1D3E85BB00F275F8 /* Color.swift */; };
7A2F66101CF527EB00463602 /* IssuesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAB00FC1CF51FC5005A7319 /* IssuesTests.swift */; };
7A2F66111CF527FB00463602 /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82551CF3DBAC0076E2DD /* Issue.swift */; };
7A2F66121CF5280200463602 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82571CF3DE4C0076E2DD /* Label.swift */; };
7A2F66131CF5280600463602 /* Milestone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A82591CF3DEEA0076E2DD /* Milestone.swift */; };
7A2F66141CF5281200463602 /* PullRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1A825D1CF3E5B60076E2DD /* PullRequest.swift */; };
7A2F66171CF53F6300463602 /* repos-Palleas-opensource-Sample-repository-issues.data in Resources */ = {isa = PBXBuildFile; fileRef = 7A2F660C1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.data */; };
7A2F66181CF53F6300463602 /* repos-Palleas-opensource-Sample-repository-issues.response in Resources */ = {isa = PBXBuildFile; fileRef = 7A2F660D1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.response */; };
7A2F66191CF53F6400463602 /* repos-Palleas-opensource-Sample-repository-issues.data in Resources */ = {isa = PBXBuildFile; fileRef = 7A2F660C1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.data */; };
7A2F661A1CF53F6400463602 /* repos-Palleas-opensource-Sample-repository-issues.response in Resources */ = {isa = PBXBuildFile; fileRef = 7A2F660D1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.response */; };
7AAB00FD1CF51FC5005A7319 /* IssuesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAB00FC1CF51FC5005A7319 /* IssuesTests.swift */; };
BE0F40A01C89098E00E3B11A /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0F409F1C89098E00E3B11A /* Fixture.swift */; };
BE0F40A21C8909EB00E3B11A /* ReleaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0F40A11C8909EB00E3B11A /* ReleaseTests.swift */; };
BE0F40A41C89135D00E3B11A /* Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0F40A31C89135D00E3B11A /* Decodable.swift */; };
Expand Down Expand Up @@ -121,6 +141,15 @@
/* Begin PBXFileReference section */
61377C6C1C8A2B2C0081FF24 /* Tentacle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Tentacle.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6190817D1C8A2D2B001BE2F8 /* Tentacle-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tentacle-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
7A1A82551CF3DBAC0076E2DD /* Issue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Issue.swift; sourceTree = "<group>"; };
7A1A82571CF3DE4C0076E2DD /* Label.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; };
7A1A82591CF3DEEA0076E2DD /* Milestone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Milestone.swift; sourceTree = "<group>"; };
7A1A825D1CF3E5B60076E2DD /* PullRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PullRequest.swift; sourceTree = "<group>"; };
7A1F20EC1D3E85BB00F275F8 /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
7A1F20EF1D3E86D900F275F8 /* ColorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorTests.swift; sourceTree = "<group>"; };
7A2F660C1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.data */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "repos-Palleas-opensource-Sample-repository-issues.data"; sourceTree = "<group>"; };
7A2F660D1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.response */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = "repos-Palleas-opensource-Sample-repository-issues.response"; sourceTree = "<group>"; };
7AAB00FC1CF51FC5005A7319 /* IssuesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssuesTests.swift; sourceTree = "<group>"; };
BE0F409F1C89098E00E3B11A /* Fixture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Fixture.swift; path = Tests/Fixture.swift; sourceTree = SOURCE_ROOT; };
BE0F40A11C8909EB00E3B11A /* ReleaseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReleaseTests.swift; sourceTree = "<group>"; };
BE0F40A31C89135D00E3B11A /* Decodable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Decodable.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -233,6 +262,8 @@
BE0F40961C8908CB00E3B11A /* Fixtures */ = {
isa = PBXGroup;
children = (
7A2F660C1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.data */,
7A2F660D1CF523F300463602 /* repos-Palleas-opensource-Sample-repository-issues.response */,
BE0F40D81C8CA13400E3B11A /* repos-Carthage-Carthage-releases-tags-0.15.data */,
BE0F40D91C8CA13400E3B11A /* repos-Carthage-Carthage-releases-tags-0.15.response */,
BE1E035A1C964F8B001296C2 /* repos-Carthage-Carthage-releases.page-1-per_page-30.data */,
Expand Down Expand Up @@ -282,19 +313,24 @@
BE88E7F41C88C6B30034A112 /* Tentacle */ = {
isa = PBXGroup;
children = (
BE88E7F51C88C6B30034A112 /* Tentacle.h */,
BEEE47441C91BB3A000FFC21 /* ArgoExtensions.swift */,
BE88E80C1C88C72B0034A112 /* Client.swift */,
7A1F20EC1D3E85BB00F275F8 /* Color.swift */,
BE0F40A31C89135D00E3B11A /* Decodable.swift */,
BECB8A8D1CBDD919005D70A6 /* FoundationExtensions.swift */,
BEB0765C1C8A001C00ABD373 /* GitHubError.swift */,
BE88E7F71C88C6B30034A112 /* Info.plist */,
7A1A82551CF3DBAC0076E2DD /* Issue.swift */,
7A1A82571CF3DE4C0076E2DD /* Label.swift */,
7A1A82591CF3DEEA0076E2DD /* Milestone.swift */,
7A1A825D1CF3E5B60076E2DD /* PullRequest.swift */,
BE88E8311C88D33D0034A112 /* Release.swift */,
BE88E82F1C88CDAB0034A112 /* Repository.swift */,
BEEE47411C91B8DF000FFC21 /* ResourceType.swift */,
BEEE474D1C92623E000FFC21 /* Response.swift */,
BE88E82C1C88C94D0034A112 /* Server.swift */,
BE88E7F51C88C6B30034A112 /* Tentacle.h */,
BECB8A8A1CBDCD17005D70A6 /* User.swift */,
BE88E7F71C88C6B30034A112 /* Info.plist */,
);
path = Tentacle;
sourceTree = "<group>";
Expand All @@ -303,15 +339,17 @@
isa = PBXGroup;
children = (
BE0F40961C8908CB00E3B11A /* Fixtures */,
BE0F409F1C89098E00E3B11A /* Fixture.swift */,
BE2B6A6B1C8B854F0080BFEB /* ClientTests.swift */,
BE0F409F1C89098E00E3B11A /* Fixture.swift */,
BEB0765E1C8A019A00ABD373 /* GitHubErrorTests.swift */,
BE88E8031C88C6B30034A112 /* Info.plist */,
7AAB00FC1CF51FC5005A7319 /* IssuesTests.swift */,
BE0F40A11C8909EB00E3B11A /* ReleaseTests.swift */,
BEA86F9C1C9F7E1E0049360B /* RepositoryTests.swift */,
BE1E036A1C9AD87F001296C2 /* ResponseTests.swift */,
BEA86F991C9F7C230049360B /* ServerTests.swift */,
BECB8AA11CBDDF0F005D70A6 /* UserTests.swift */,
BE88E8031C88C6B30034A112 /* Info.plist */,
7A1F20EF1D3E86D900F275F8 /* ColorTests.swift */,
);
path = Tests;
sourceTree = "<group>";
Expand Down Expand Up @@ -519,8 +557,10 @@
BECB8A9F1CBDDE4C005D70A6 /* users-test.data in Resources */,
BE0F40E61C8CA13900E3B11A /* repos-mdiep-NonExistent-releases-tags-tag.data in Resources */,
BECB8A9D1CBDDE4C005D70A6 /* users-mdiep.data in Resources */,
7A2F661A1CF53F6400463602 /* repos-Palleas-opensource-Sample-repository-issues.response in Resources */,
BE0F40E71C8CA13900E3B11A /* repos-mdiep-NonExistent-releases-tags-tag.response in Resources */,
BE0F40EF1C8CA1E100E3B11A /* repos-torvalds-linux-releases-tags-v4.4.response in Resources */,
7A2F66191CF53F6400463602 /* repos-Palleas-opensource-Sample-repository-issues.data in Resources */,
BE1E03671C964F98001296C2 /* repos-Carthage-Carthage-releases.page-1-per_page-30.response in Resources */,
BE1E03701C9CF849001296C2 /* repos-mdiep-MDPSplitView-releases-tags-1.0.2.data in Resources */,
BEAB175C1C9D0AB7009F8F58 /* repos-mdiep-MDPSplitView-releases-assets-433845.response in Resources */,
Expand Down Expand Up @@ -551,8 +591,10 @@
BECB8A9B1CBDDE4B005D70A6 /* users-test.data in Resources */,
BE0F40E21C8CA13800E3B11A /* repos-mdiep-NonExistent-releases-tags-tag.data in Resources */,
BECB8A991CBDDE4B005D70A6 /* users-mdiep.data in Resources */,
7A2F66181CF53F6300463602 /* repos-Palleas-opensource-Sample-repository-issues.response in Resources */,
BE0F40E31C8CA13800E3B11A /* repos-mdiep-NonExistent-releases-tags-tag.response in Resources */,
BE0F40ED1C8CA1E000E3B11A /* repos-torvalds-linux-releases-tags-v4.4.response in Resources */,
7A2F66171CF53F6300463602 /* repos-Palleas-opensource-Sample-repository-issues.data in Resources */,
BE1E03631C964F98001296C2 /* repos-Carthage-Carthage-releases.page-1-per_page-30.response in Resources */,
BE1E036F1C9CF849001296C2 /* repos-mdiep-MDPSplitView-releases-tags-1.0.2.data in Resources */,
BEAB175E1C9D0AB8009F8F58 /* repos-mdiep-MDPSplitView-releases-assets-433845.response in Resources */,
Expand Down Expand Up @@ -585,24 +627,32 @@
BEEE47461C91BB3A000FFC21 /* ArgoExtensions.swift in Sources */,
61377C791C8A2B760081FF24 /* Client.swift in Sources */,
BEEE47431C91B8DF000FFC21 /* ResourceType.swift in Sources */,
7A2F66141CF5281200463602 /* PullRequest.swift in Sources */,
61377C7C1C8A2B760081FF24 /* Release.swift in Sources */,
7A1F20EE1D3E862200F275F8 /* Color.swift in Sources */,
BEEE474F1C92623E000FFC21 /* Response.swift in Sources */,
7A2F66121CF5280200463602 /* Label.swift in Sources */,
7A2F66131CF5280600463602 /* Milestone.swift in Sources */,
61377C7D1C8A2B760081FF24 /* Repository.swift in Sources */,
BECB8A8F1CBDD91D005D70A6 /* FoundationExtensions.swift in Sources */,
61377C7B1C8A2B760081FF24 /* GitHubError.swift in Sources */,
61377C7E1C8A2B760081FF24 /* Server.swift in Sources */,
61377C7A1C8A2B760081FF24 /* Decodable.swift in Sources */,
BECB8A901CBDD920005D70A6 /* User.swift in Sources */,
7A2F66111CF527FB00463602 /* Issue.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
619081791C8A2D2B001BE2F8 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7A1F20F11D3E872800F275F8 /* ColorTests.swift in Sources */,
619081881C8A2DB7001BE2F8 /* Fixture.swift in Sources */,
BE2B6A6D1C8B854F0080BFEB /* ClientTests.swift in Sources */,
BEA86F9B1C9F7C230049360B /* ServerTests.swift in Sources */,
7A2F66101CF527EB00463602 /* IssuesTests.swift in Sources */,
7A1F20F31D3E873600F275F8 /* Color.swift in Sources */,
BEA86F9E1C9F7E1E0049360B /* RepositoryTests.swift in Sources */,
6190818B1C8A2DB7001BE2F8 /* (null) in Sources */,
619081891C8A2DB7001BE2F8 /* GitHubErrorTests.swift in Sources */,
Expand All @@ -619,27 +669,35 @@
BEEE47451C91BB3A000FFC21 /* ArgoExtensions.swift in Sources */,
BE88E82D1C88C94D0034A112 /* Server.swift in Sources */,
BEEE47421C91B8DF000FFC21 /* ResourceType.swift in Sources */,
7A1A825E1CF3E5B60076E2DD /* PullRequest.swift in Sources */,
BEB0765D1C8A001C00ABD373 /* GitHubError.swift in Sources */,
7A1F20ED1D3E85BB00F275F8 /* Color.swift in Sources */,
BEEE474E1C92623E000FFC21 /* Response.swift in Sources */,
7A1A82581CF3DE4C0076E2DD /* Label.swift in Sources */,
7A1A825A1CF3DEEA0076E2DD /* Milestone.swift in Sources */,
BE88E8321C88D33D0034A112 /* Release.swift in Sources */,
BE88E80D1C88C72B0034A112 /* Client.swift in Sources */,
BE0F40A41C89135D00E3B11A /* Decodable.swift in Sources */,
BECB8A8B1CBDCD17005D70A6 /* User.swift in Sources */,
BECB8A8E1CBDD919005D70A6 /* FoundationExtensions.swift in Sources */,
BE88E8301C88CDAB0034A112 /* Repository.swift in Sources */,
7A1A82561CF3DBAC0076E2DD /* Issue.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
BE88E7F81C88C6B30034A112 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7AAB00FD1CF51FC5005A7319 /* IssuesTests.swift in Sources */,
BE1E036B1C9AD87F001296C2 /* ResponseTests.swift in Sources */,
7A1F20F21D3E873500F275F8 /* Color.swift in Sources */,
BEA86F9D1C9F7E1E0049360B /* RepositoryTests.swift in Sources */,
BEB076601C8A019E00ABD373 /* GitHubErrorTests.swift in Sources */,
BE0F40A01C89098E00E3B11A /* Fixture.swift in Sources */,
BECB8AA31CBDDF0F005D70A6 /* UserTests.swift in Sources */,
BE2B6A6C1C8B854F0080BFEB /* ClientTests.swift in Sources */,
7A1F20F01D3E86D900F275F8 /* ColorTests.swift in Sources */,
BEA86F9A1C9F7C230049360B /* ServerTests.swift in Sources */,
BE0F40A21C8909EB00E3B11A /* ReleaseTests.swift in Sources */,
);
Expand Down
38 changes: 37 additions & 1 deletion Tentacle/ArgoExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import Argo
import Foundation
import Result


internal func decode<T: Decodable where T == T.DecodedType>(object: AnyObject) -> Result<T, DecodeError> {
let decoded: Decoded<T> = decode(object)
switch decoded {
Expand All @@ -35,10 +34,47 @@ internal func toString(number: Int) -> Decoded<String> {
return .Success(number.description)
}

internal func toInt(string: String) -> Decoded<Int> {
if let int = Int(string) {
return .Success(int)
} else {
return .Failure(.Custom("String is not a valid number"))
}
}

internal func toIssueState(string: String) -> Decoded<Issue.State> {
if let state = Issue.State(rawValue: string) {
return .Success(state)
} else {
return .Failure(.Custom("String \(string) does not represent a valid issue state"))
}
}

internal func toNSDate(string: String) -> Decoded<NSDate> {
if let date = NSDateFormatter.ISO8601.dateFromString(string) {
return .Success(date)
} else {
return .Failure(.Custom("Date is not ISO8601 formatted"))
}
}

internal func toOptionalNSDate(string: String?) -> Decoded<NSDate?> {
guard let string = string else { return .Success(nil) }
if let date = NSDateFormatter.ISO8601.dateFromString(string) {
return .Success(date)
} else {
return .Failure(.Custom("Date is not ISO8601 formatted"))
}
}

internal func toNSURL(string: String) -> Decoded<NSURL> {
if let url = NSURL(string: string) {
return .Success(url)
} else {
return .Failure(.Custom("URL is not properly formatted"))
}
}

internal func toColor(string: String) -> Decoded<Color> {
return .Success(Color(hex: string))
}
25 changes: 24 additions & 1 deletion Tentacle/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,12 @@ public final class Client {

// https://developer.github.com/v3/users/#get-a-single-user
case UserInfo(login: String)

// https://developer.github.com/v3/issues/#list-issues
case AssignedIssues

// https://developer.github.com/v3/issues/#list-issues-for-a-repository
case IssuesInRepository(owner: String, repository: String)

var path: String {
switch self {
Expand All @@ -170,6 +176,10 @@ public final class Client {
return "/repos/\(owner)/\(repo)/releases"
case let .UserInfo(login):
return "/users/\(login)"
case .AssignedIssues:
return "/issues"
case .IssuesInRepository(let owner, let repository):
return "/repos/\(owner)/\(repository)/issues"
}
}

Expand All @@ -181,6 +191,10 @@ public final class Client {
return owner.hashValue ^ repo.hashValue
case let .UserInfo(login):
return login.hashValue
case .AssignedIssues:
return "AssignedIssues".hashValue
case .IssuesInRepository(let owner, let repository):
return "Issues".hashValue ^ owner.hashValue ^ repository.hashValue
}
}

Expand Down Expand Up @@ -256,7 +270,16 @@ public final class Client {
public func userWithLogin(login: String) -> SignalProducer<(Response, UserInfo), Error> {
return fetchOne(.UserInfo(login: login))
}


public func assignedIssues(page: UInt = 1, perPage: UInt = 30) -> SignalProducer<(Response, [Issue]), Error> {
return fetchMany(.AssignedIssues, page: page, pageSize: perPage)
}

public func issuesInRepository(repository: Repository, page: UInt = 1, perPage: UInt = 30) -> SignalProducer<(Response, [Issue]), Error> {
precondition(repository.server == server)
return fetchMany(.IssuesInRepository(owner: repository.owner, repository: repository.name), page: page, pageSize: perPage)
}

/// Fetch an endpoint from the API.
private func fetch(endpoint: Endpoint, page: UInt?, pageSize: UInt?) -> SignalProducer<(Response, AnyObject), Error> {
let URL = NSURL(server, endpoint, page: page, pageSize: pageSize)
Expand Down
Loading