Bgerstle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/194355

Change subject: fix for missing image info when URLs have extra path extension
......................................................................

fix for missing image info when URLs have extra path extension

Some images (e.g. svgs) have "src" URLs that have an extra path
extension. This caused imageinfo lookups to return empty results.

Fix:
- Modify `fileNameNoSizePrefix` to also strip extra path extensions
- Add unit tests to ensure previous and new functionality
  (WMFImageURLParsingTests)

Add'l fixes:
- "Uploader unknown" being displayed while image info was being
  retrieved
- Unit test target switched to "application test" target to prevent
  issues with compiling subset of app sources
- Removed "filePageURL" property of MWKImage which was unused, and
  unstable.

Bug: T90298
Change-Id: I00a20b837ce3275cc5ccd0217d7e759a07e52bad
---
M MediaWikiKit/MediaWikiKit/MWKImage.h
M MediaWikiKit/MediaWikiKit/MWKImage.m
M MediaWikiKit/MediaWikiKitTests/MWKImageInfo+MWKImageComparisonTests.m
M Wikipedia.xcodeproj/project.pbxproj
A WikipediaUnitTests/WMFImageURLParsingTests.m
M wikipedia/Networking/Fetchers/ArticleFetcher.m
M wikipedia/View Controllers/Image Gallery/WMFImageGalleryViewController.m
M wikipedia/mw-utils/WMFImageURLParsing.h
M wikipedia/mw-utils/WMFImageURLParsing.m
9 files changed, 146 insertions(+), 166 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia 
refs/changes/55/194355/1

diff --git a/MediaWikiKit/MediaWikiKit/MWKImage.h 
b/MediaWikiKit/MediaWikiKit/MWKImage.h
index 1bc2de1..0f6603b 100644
--- a/MediaWikiKit/MediaWikiKit/MWKImage.h
+++ b/MediaWikiKit/MediaWikiKit/MWKImage.h
@@ -32,13 +32,6 @@
 @property (copy) NSNumber* width;
 @property (copy) NSNumber* height;
 
-/**
- * A relative URL pointing at the file page associated with this image.
- * @discussion Typical format is: @c "/wiki/File:Image_file_Name".
- * @see -[ArticleFetcher createImageRecordsForSection:]
- */
-@property (copy) NSString* filePageURL;
-
 // Local storage status
 @property (readonly) BOOL isCached;
 
diff --git a/MediaWikiKit/MediaWikiKit/MWKImage.m 
b/MediaWikiKit/MediaWikiKit/MWKImage.m
index 2f37698..ca55ba8 100644
--- a/MediaWikiKit/MediaWikiKit/MWKImage.m
+++ b/MediaWikiKit/MediaWikiKit/MWKImage.m
@@ -11,13 +11,8 @@
 #import "MediaWikiKit.h"
 #import "WMFImageURLParsing.h"
 
-@interface MWKImage ()
-{
-    NSString* _fileNameNoSizePrefix;
-}
-@end
-
 @implementation MWKImage
+@synthesize fileNameNoSizePrefix = _fileNameNoSizePrefix;
 
 - (instancetype)initWithArticle:(MWKArticle*)article sourceURL:(NSString*)url {
     self = [super initWithSite:article.site];
@@ -45,7 +40,6 @@
         _mimeType         = [self optionalString:@"mimeType" dict:dict];
         _width            = [self optionalNumber:@"width" dict:dict];
         _height           = [self optionalNumber:@"height" dict:dict];
-        _filePageURL      = dict[@"filePageURL"];
     }
     return self;
 }
@@ -116,9 +110,7 @@
     if (self.height) {
         dict[@"height"] = self.height;
     }
-    if (self.filePageURL) {
-        dict[@"filePageURL"] = self.filePageURL;
-    }
+
     return [dict copy];
 }
 
diff --git 
a/MediaWikiKit/MediaWikiKitTests/MWKImageInfo+MWKImageComparisonTests.m 
b/MediaWikiKit/MediaWikiKitTests/MWKImageInfo+MWKImageComparisonTests.m
index 6336fd1..6e0b64d 100644
--- a/MediaWikiKit/MediaWikiKitTests/MWKImageInfo+MWKImageComparisonTests.m
+++ b/MediaWikiKit/MediaWikiKitTests/MWKImageInfo+MWKImageComparisonTests.m
@@ -41,10 +41,7 @@
     NSString* testFilename = @"some-file name";
     MWKImage* image        = [self imageAssociatedWithFilename:testFilename];
     MWKImageInfo* info     = [self infoAssociatedWithFilename:testFilename];
-    assertThat(image.infoAssociationValue,
-               is(allOf(equalTo(info.imageAssociationValue),
-                        equalTo([info 
valueForKeyPath:MWKImageAssociationKeyPath]),
-                        equalTo([image 
valueForKeyPath:MWKImageAssociationKeyPath]), nil)));
+    assertThat(image.infoAssociationValue, 
is(equalTo(info.imageAssociationValue)));
     XCTAssertTrue([info isAssociatedWithImage:image]);
     XCTAssertTrue([image isAssociatedWithInfo:info]);
 }
@@ -52,8 +49,7 @@
 - (void)testDisassociation {
     MWKImage* image    = [self imageAssociatedWithFilename:@"some-file name"];
     MWKImageInfo* info = [self infoAssociatedWithFilename:@"other file name"];
-    assertThat([image valueForKeyPath:MWKImageAssociationKeyPath],
-               isNot([info valueForKeyPath:MWKImageAssociationKeyPath]));
+    assertThat([image infoAssociationValue], isNot(equalTo([info 
imageAssociationValue])));
     XCTAssertFalse([info isAssociatedWithImage:image]);
 }
 
diff --git a/Wikipedia.xcodeproj/project.pbxproj 
b/Wikipedia.xcodeproj/project.pbxproj
index ad9226e..fb4a150 100644
--- a/Wikipedia.xcodeproj/project.pbxproj
+++ b/Wikipedia.xcodeproj/project.pbxproj
@@ -47,9 +47,7 @@
                042A5B36192591520095E172 /* TopMenuTextField.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 042A5B31192591520095E172 /* TopMenuTextField.m 
*/; };
                042B3996192EAEEA0066B270 /* ShareMenuSavePageActivity.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 042B3995192EAEEA0066B270 /* 
ShareMenuSavePageActivity.m */; };
                042BEAEF1A92EE66002CF320 /* UIWebView+WMFTrackingView.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 042BEAEE1A92EE66002CF320 /* 
UIWebView+WMFTrackingView.m */; };
-               042BEAF01A92EE66002CF320 /* UIWebView+WMFTrackingView.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 042BEAEE1A92EE66002CF320 /* 
UIWebView+WMFTrackingView.m */; };
                042E3B931AA16D6700BF8D66 /* 
UIViewController+WMFChildViewController.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 042E3B921AA16D6700BF8D66 /* UIViewController+WMFChildViewController.m 
*/; };
-               042E3B941AA16D6700BF8D66 /* 
UIViewController+WMFChildViewController.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 042E3B921AA16D6700BF8D66 /* UIViewController+WMFChildViewController.m 
*/; };
                0433542218A023FE009305F0 /* UIViewController+HideKeyboard.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0433542118A023FE009305F0 /* 
UIViewController+HideKeyboard.m */; };
                0433542618A093C5009305F0 /* UIView+RemoveConstraints.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0433542518A093C5009305F0 /* 
UIView+RemoveConstraints.m */; };
                0439317619FB092600386E8F /* UIWebView+LoadAssetsHtml.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0439317519FB092600386E8F /* 
UIWebView+LoadAssetsHtml.m */; };
@@ -91,25 +89,19 @@
                047E95511996DD030046A122 /* NearbyViewController.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 047E954E1996DD030046A122 /* 
NearbyViewController.m */; };
                047ED63918C13E4900442BE3 /* PreviewWebView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 047ED63818C13E4900442BE3 /* PreviewWebView.m */; 
};
                0480AE871AA4E61000A9950C /* WMFLegalFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE7D1AA4E61000A9950C /* 
WMFLegalFooterViewController.m */; };
-               0480AE881AA4E61000A9950C /* WMFLegalFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE7D1AA4E61000A9950C /* 
WMFLegalFooterViewController.m */; };
                0480AE891AA4E61000A9950C /* WMFLegalFooterViewController.xib in 
Resources */ = {isa = PBXBuildFile; fileRef = 0480AE7E1AA4E61000A9950C /* 
WMFLegalFooterViewController.xib */; };
                0480AE8A1AA4E61000A9950C /* WMFLegalFooterViewController.xib in 
Resources */ = {isa = PBXBuildFile; fileRef = 0480AE7E1AA4E61000A9950C /* 
WMFLegalFooterViewController.xib */; };
                0480AE8B1AA4E61000A9950C /* WMFOptionsFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE811AA4E61000A9950C /* 
WMFOptionsFooterViewController.m */; };
-               0480AE8C1AA4E61000A9950C /* WMFOptionsFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE811AA4E61000A9950C /* 
WMFOptionsFooterViewController.m */; };
                0480AE8D1AA4E61000A9950C /* WMFOptionsFooterViewController.xib 
in Resources */ = {isa = PBXBuildFile; fileRef = 0480AE821AA4E61000A9950C /* 
WMFOptionsFooterViewController.xib */; };
                0480AE8E1AA4E61000A9950C /* WMFOptionsFooterViewController.xib 
in Resources */ = {isa = PBXBuildFile; fileRef = 0480AE821AA4E61000A9950C /* 
WMFOptionsFooterViewController.xib */; };
                0480AE8F1AA4E61000A9950C /* WMFReadMoreViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE851AA4E61000A9950C /* 
WMFReadMoreViewController.m */; };
-               0480AE901AA4E61000A9950C /* WMFReadMoreViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE851AA4E61000A9950C /* 
WMFReadMoreViewController.m */; };
                0480AE911AA4E61000A9950C /* WMFReadMoreViewController.xib in 
Resources */ = {isa = PBXBuildFile; fileRef = 0480AE861AA4E61000A9950C /* 
WMFReadMoreViewController.xib */; };
                0480AE921AA4E61000A9950C /* WMFReadMoreViewController.xib in 
Resources */ = {isa = PBXBuildFile; fileRef = 0480AE861AA4E61000A9950C /* 
WMFReadMoreViewController.xib */; };
                0480AE961AA4E65D00A9950C /* WMFWebViewFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE941AA4E65D00A9950C /* 
WMFWebViewFooterViewController.m */; };
-               0480AE971AA4E65D00A9950C /* WMFWebViewFooterViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE941AA4E65D00A9950C /* 
WMFWebViewFooterViewController.m */; };
                0480AE981AA4E65D00A9950C /* WMFWebViewFooterViewController.xib 
in Resources */ = {isa = PBXBuildFile; fileRef = 0480AE951AA4E65D00A9950C /* 
WMFWebViewFooterViewController.xib */; };
                0480AE991AA4E65D00A9950C /* WMFWebViewFooterViewController.xib 
in Resources */ = {isa = PBXBuildFile; fileRef = 0480AE951AA4E65D00A9950C /* 
WMFWebViewFooterViewController.xib */; };
                0480AE9C1AA4F01600A9950C /* WMFWebViewFooterContainerView.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE9B1AA4F01600A9950C /* 
WMFWebViewFooterContainerView.m */; };
-               0480AE9D1AA4F01600A9950C /* WMFWebViewFooterContainerView.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0480AE9B1AA4F01600A9950C /* 
WMFWebViewFooterContainerView.m */; };
                0480AEA01AA4F4DA00A9950C /* 
WMFIntrinsicContentSizeAwareTableView.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 0480AE9F1AA4F4DA00A9950C /* WMFIntrinsicContentSizeAwareTableView.m 
*/; };
-               0480AEA11AA4F4DA00A9950C /* 
WMFIntrinsicContentSizeAwareTableView.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 0480AE9F1AA4F4DA00A9950C /* WMFIntrinsicContentSizeAwareTableView.m 
*/; };
                04821CD119895EDC007558F6 /* ReferenceGradientView.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 04821CD019895EDC007558F6 /* 
ReferenceGradientView.m */; };
                0484411E19FF15AF00FD26C5 /* AboutViewController.plist in 
Resources */ = {isa = PBXBuildFile; fileRef = 0484411D19FF15AF00FD26C5 /* 
AboutViewController.plist */; };
                0484E3DE19D9D19B0085D18D /* UIView+ConstraintsScale.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0484E3DD19D9D19B0085D18D /* 
UIView+ConstraintsScale.m */; };
@@ -154,7 +146,6 @@
                04B91AAB18E3D9E200FFAA1C /* 
NSString+FormattedAttributedString.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 04B91AAA18E3D9E200FFAA1C /* NSString+FormattedAttributedString.m */; 
};
                04B91AB718E4D5B200FFAA1C /* TabularScrollView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04B91AB618E4D5B200FFAA1C /* TabularScrollView.m 
*/; };
                04BA48A11A80062F00CB5CAE /* UIFont+WMFStyle.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04BA48A01A80062E00CB5CAE /* UIFont+WMFStyle.m 
*/; };
-               04BA48A21A80062F00CB5CAE /* UIFont+WMFStyle.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04BA48A01A80062E00CB5CAE /* UIFont+WMFStyle.m 
*/; };
                04C0A0781936786000D55325 /* UIViewController+ModalPresent.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 04C0A0771936786000D55325 /* 
UIViewController+ModalPresent.m */; };
                04C43AA4183440C1006C643B /* MWNetworkActivityIndicatorManager.m 
in Sources */ = {isa = PBXBuildFile; fileRef = 04C43AA1183440C1006C643B /* 
MWNetworkActivityIndicatorManager.m */; };
                04C43AAE18344131006C643B /* CommunicationBridge.m in Sources */ 
= {isa = PBXBuildFile; fileRef = 04C43AAB18344131006C643B /* 
CommunicationBridge.m */; };
@@ -208,43 +199,23 @@
                0EA4402E1AA6281200B09DBA /* NSDateFormatter+WMFExtensions.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 0EA4402D1AA6281200B09DBA /* 
NSDateFormatter+WMFExtensions.m */; };
                701FF5EE601DEA3FCAB7EFD3 /* libPods.a in Frameworks */ = {isa = 
PBXBuildFile; fileRef = D82982ED992F47428037BDF2 /* libPods.a */; };
                954BA118838BF8BA6B01C34A /* libPods-WikipediaUnitTests.a in 
Frameworks */ = {isa = PBXBuildFile; fileRef = 8CE61C6963F825760822A28A /* 
libPods-WikipediaUnitTests.a */; };
-               BC118C0F1A95894D0072E4D8 /* WikipediaAppUtils.m in Sources */ = 
{isa = PBXBuildFile; fileRef = C9180EC318AED30C006C1DCA /* WikipediaAppUtils.m 
*/; };
-               BC118C101A9589720072E4D8 /* AssetsFile.m in Sources */ = {isa = 
PBXBuildFile; fileRef = 04272E791940EEBC00CC682F /* AssetsFile.m */; };
                BC2CBB8E1AA10F400079A313 /* UIView+WMFFrameUtils.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BC2CBB8D1AA10F400079A313 /* 
UIView+WMFFrameUtils.m */; };
-               BC2CBB8F1AA10F400079A313 /* UIView+WMFFrameUtils.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BC2CBB8D1AA10F400079A313 /* 
UIView+WMFFrameUtils.m */; };
-               BC42735D1A7C73B300068882 /* NSArray+Predicate.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 04CBAC7219A9B786009F3D7E /* NSArray+Predicate.m 
*/; };
-               BC42735E1A7C73B300068882 /* NSArray+PredicateTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BC8309C81A7C370B003FC5C7 /* 
NSArray+PredicateTests.m */; };
                BC50C37F1A83C784006DC7AF /* WMFNetworkUtilities.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC50C37E1A83C784006DC7AF /* 
WMFNetworkUtilities.m */; };
-               BC50C3831A83C88F006DC7AF /* WMFJoinedPropertyParametersTests.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BC50C3821A83C88F006DC7AF /* 
WMFJoinedPropertyParametersTests.m */; };
-               BC50C3841A83C96D006DC7AF /* WMFNetworkUtilities.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC50C37E1A83C784006DC7AF /* 
WMFNetworkUtilities.m */; };
                BC50C3871A83CBDA006DC7AF /* MWKImageInfoResponseSerializer.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BC50C3861A83CBDA006DC7AF /* 
MWKImageInfoResponseSerializer.m */; };
-               BC6FEAE11A9B7EFD00A1D890 /* WMFCodingStyle.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BC6FEAE01A9B7EFD00A1D890 /* WMFCodingStyle.m */; 
};
                BC7DFCD61AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* 
WMFImageURLParsing.m */; };
-               BC7DFCD71AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* 
WMFImageURLParsing.m */; };
                BC86B9361A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B9351A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m */; };
                BC86B93D1A929CC500B4C039 /* 
UICollectionViewFlowLayout+NSCopying.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BC86B93C1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m 
*/; };
                BC86B9401A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B93F1A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m */; };
-               BC86B9411A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B93F1A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m */; };
                BC955BC71A82BEFD000EF9E4 /* MWKImageInfoFetcher.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC955BC61A82BEFD000EF9E4 /* 
MWKImageInfoFetcher.m */; };
                BC955BCF1A82C2FA000EF9E4 /* 
AFHTTPRequestOperationManager+WMFConfig.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BC955BCE1A82C2FA000EF9E4 /* AFHTTPRequestOperationManager+WMFConfig.m 
*/; };
                BCB58F441A890D9700465627 /* MWKImageInfo+MWKImageComparison.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB58F431A890D9700465627 /* 
MWKImageInfo+MWKImageComparison.m */; };
-               BCB58F451A890D9700465627 /* MWKImageInfo+MWKImageComparison.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB58F431A890D9700465627 /* 
MWKImageInfo+MWKImageComparison.m */; };
                BCB58F481A891FDB00465627 /* 
WebViewController+ImageGalleryPresentation.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB58F471A891FDB00465627 /* 
WebViewController+ImageGalleryPresentation.m */; };
                BCB58F541A894D3E00465627 /* WMFImageGalleryDetailOverlayView.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB58F531A894D3E00465627 /* 
WMFImageGalleryDetailOverlayView.m */; };
                BCB58F591A89747400465627 /* 
WMFImageGalleryDetailOverlayView.xib in Resources */ = {isa = PBXBuildFile; 
fileRef = BCB58F581A89747400465627 /* WMFImageGalleryDetailOverlayView.xib */; 
};
                BCB58F631A8A9F1000465627 /* MWKLicense.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB58F621A8A9F1000465627 /* MWKLicense.m */; };
-               BCB58F641A8A9F1000465627 /* MWKLicense.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB58F621A8A9F1000465627 /* MWKLicense.m */; };
                BCB58F671A8AA22200465627 /* MWKLicense+ToGlyph.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB58F661A8AA22200465627 /* 
MWKLicense+ToGlyph.m */; };
-               BCB58F681A8AA22200465627 /* MWKLicense+ToGlyph.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB58F661A8AA22200465627 /* 
MWKLicense+ToGlyph.m */; };
                BCB58F781A8D081E00465627 /* NSArray+BKIndex.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB58F771A8D081E00465627 /* NSArray+BKIndex.m 
*/; };
-               BCB58F791A8D081E00465627 /* NSArray+BKIndex.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB58F771A8D081E00465627 /* NSArray+BKIndex.m 
*/; };
-               BCB58F7C1A8D0C8E00465627 /* NSArray+BKIndexTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB58F7B1A8D0C8E00465627 /* 
NSArray+BKIndexTests.m */; };
-               BCB58F7E1A8D1B8400465627 /* 
MWKImageInfo+MWKImageComparisonTests.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BCB58F7D1A8D1B8400465627 /* MWKImageInfo+MWKImageComparisonTests.m 
*/; };
-               BCB669611A83D7B300C7B1FE /* WMFErrorForApiErrorObjectTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669601A83D7B300C7B1FE /* 
WMFErrorForApiErrorObjectTests.m */; };
-               BCB669631A83DB8F00C7B1FE /* MWKImageInfoResponseSerializer.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BC50C3861A83CBDA006DC7AF /* 
MWKImageInfoResponseSerializer.m */; };
                BCB669731A83F58600C7B1FE /* NSMutableDictionary+WMFMaybeSet.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB669721A83F58600C7B1FE /* 
NSMutableDictionary+WMFMaybeSet.m */; };
-               BCB669741A83F58600C7B1FE /* NSMutableDictionary+WMFMaybeSet.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB669721A83F58600C7B1FE /* 
NSMutableDictionary+WMFMaybeSet.m */; };
-               BCB669761A83F59300C7B1FE /* NSMutableDictionary+MaybeSetTests.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB669751A83F59300C7B1FE /* 
NSMutableDictionary+MaybeSetTests.m */; };
                BCB669A41A83F6C400C7B1FE /* MWKSite.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB669791A83F6C300C7B1FE /* MWKSite.m */; };
                BCB669A51A83F6C400C7B1FE /* MWKTitle.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB6697B1A83F6C300C7B1FE /* MWKTitle.m */; };
                BCB669A61A83F6C400C7B1FE /* MWKDataObject.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6697E1A83F6C300C7B1FE /* MWKDataObject.m */; 
};
@@ -265,8 +236,6 @@
                BCB669B51A83F6C400C7B1FE /* MWKUserDataStore.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6699D1A83F6C300C7B1FE /* MWKUserDataStore.m 
*/; };
                BCB669B61A83F6C400C7B1FE /* MWKImageList.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB6699F1A83F6C300C7B1FE /* MWKImageList.m */; };
                BCB669B71A83F6C400C7B1FE /* MWKSectionList.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669A11A83F6C300C7B1FE /* MWKSectionList.m */; 
};
-               BCB669D31A83F6D300C7B1FE /* MWKTestCase.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669BB1A83F6D300C7B1FE /* MWKTestCase.m */; };
-               BCB669D41A83F6D300C7B1FE /* MWKArticleStoreTestCase.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669BD1A83F6D300C7B1FE /* 
MWKArticleStoreTestCase.m */; };
                BCB669D51A83F6D300C7B1FE /* TemplateIcon2x.png in Resources */ 
= {isa = PBXBuildFile; fileRef = BCB669BE1A83F6D300C7B1FE /* TemplateIcon2x.png 
*/; };
                BCB669D61A83F6D300C7B1FE /* organization-anon.json in Resources 
*/ = {isa = PBXBuildFile; fileRef = BCB669BF1A83F6D300C7B1FE /* 
organization-anon.json */; };
                BCB669D71A83F6D300C7B1FE /* golden-gate.jpg in Resources */ = 
{isa = PBXBuildFile; fileRef = BCB669C01A83F6D300C7B1FE /* golden-gate.jpg */; 
};
@@ -277,42 +246,31 @@
                BCB669DC1A83F6D300C7B1FE /* protection-empty.json in Resources 
*/ = {isa = PBXBuildFile; fileRef = BCB669C51A83F6D300C7B1FE /* 
protection-empty.json */; };
                BCB669DD1A83F6D300C7B1FE /* section0.json in Resources */ = 
{isa = PBXBuildFile; fileRef = BCB669C61A83F6D300C7B1FE /* section0.json */; };
                BCB669DE1A83F6D300C7B1FE /* section1-end.json in Resources */ = 
{isa = PBXBuildFile; fileRef = BCB669C71A83F6D300C7B1FE /* section1-end.json 
*/; };
-               BCB669DF1A83F6D300C7B1FE /* MWKSiteTests.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669C91A83F6D300C7B1FE /* MWKSiteTests.m */; };
-               BCB669E01A83F6D300C7B1FE /* MWKTitleTests.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669CA1A83F6D300C7B1FE /* MWKTitleTests.m */; 
};
-               BCB669E11A83F6D300C7B1FE /* MWKUserTests.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669CB1A83F6D300C7B1FE /* MWKUserTests.m */; };
-               BCB669E21A83F6D300C7B1FE /* MWKProtectionStatusTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669CC1A83F6D300C7B1FE /* 
MWKProtectionStatusTests.m */; };
-               BCB669E31A83F6D300C7B1FE /* MWKDataStorePathTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB669CD1A83F6D300C7B1FE /* 
MWKDataStorePathTests.m */; };
-               BCB669E41A83F6D300C7B1FE /* MWKDataStoreStorageTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669CE1A83F6D300C7B1FE /* 
MWKDataStoreStorageTests.m */; };
-               BCB669E51A83F6D300C7B1FE /* MWKImageStorageTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB669CF1A83F6D300C7B1FE /* 
MWKImageStorageTests.m */; };
-               BCB669E61A83F6D300C7B1FE /* MWKHistoryListTests.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB669D01A83F6D300C7B1FE /* 
MWKHistoryListTests.m */; };
-               BCB669E71A83F71C00C7B1FE /* MWKSite.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB669791A83F6C300C7B1FE /* MWKSite.m */; };
-               BCB669E81A83F71C00C7B1FE /* MWKTitle.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB6697B1A83F6C300C7B1FE /* MWKTitle.m */; };
-               BCB669E91A83F71C00C7B1FE /* MWKDataObject.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6697E1A83F6C300C7B1FE /* MWKDataObject.m */; 
};
-               BCB669EA1A83F71C00C7B1FE /* MWKSiteDataObject.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669801A83F6C300C7B1FE /* MWKSiteDataObject.m 
*/; };
-               BCB669EB1A83F71C00C7B1FE /* MWKUser.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB669821A83F6C300C7B1FE /* MWKUser.m */; };
-               BCB669EC1A83F71C00C7B1FE /* MWKSection.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB669841A83F6C300C7B1FE /* MWKSection.m */; };
-               BCB669ED1A83F71C00C7B1FE /* MWKImage.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB669861A83F6C300C7B1FE /* MWKImage.m */; };
-               BCB669EE1A83F71C00C7B1FE /* MWKProtectionStatus.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB669881A83F6C300C7B1FE /* 
MWKProtectionStatus.m */; };
-               BCB669EF1A83F71C00C7B1FE /* MWKSavedPageEntry.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6698A1A83F6C300C7B1FE /* MWKSavedPageEntry.m 
*/; };
-               BCB669F01A83F71C00C7B1FE /* MWKSavedPageList.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6698C1A83F6C300C7B1FE /* MWKSavedPageList.m 
*/; };
-               BCB669F11A83F71C00C7B1FE /* MWKHistoryEntry.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6698E1A83F6C300C7B1FE /* MWKHistoryEntry.m 
*/; };
-               BCB669F21A83F71C00C7B1FE /* MWKHistoryList.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669901A83F6C300C7B1FE /* MWKHistoryList.m */; 
};
-               BCB669F31A83F71C00C7B1FE /* MWKRecentSearchEntry.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB669921A83F6C300C7B1FE /* 
MWKRecentSearchEntry.m */; };
-               BCB669F41A83F71C00C7B1FE /* MWKRecentSearchList.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB669941A83F6C300C7B1FE /* 
MWKRecentSearchList.m */; };
-               BCB669F51A83F71C00C7B1FE /* MWKImageInfo.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669971A83F6C300C7B1FE /* MWKImageInfo.m */; };
-               BCB669F61A83F71C00C7B1FE /* MWKDataStore.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669991A83F6C300C7B1FE /* MWKDataStore.m */; };
-               BCB669F71A83F71C00C7B1FE /* MWKArticle.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCB6699B1A83F6C300C7B1FE /* MWKArticle.m */; };
-               BCB669F81A83F71C00C7B1FE /* MWKUserDataStore.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB6699D1A83F6C300C7B1FE /* MWKUserDataStore.m 
*/; };
-               BCB669F91A83F71C00C7B1FE /* MWKImageList.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB6699F1A83F6C300C7B1FE /* MWKImageList.m */; };
-               BCB669FA1A83F71C00C7B1FE /* MWKSectionList.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669A11A83F6C300C7B1FE /* MWKSectionList.m */; 
};
-               BCB669FD1A84158200C7B1FE /* CircularBitwiseRotationTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669FC1A84158200C7B1FE /* 
CircularBitwiseRotationTests.m */; };
                BCB66A0C1A85183000C7B1FE /* NSString+WMFHTMLParsing.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB66A0B1A85183000C7B1FE /* 
NSString+WMFHTMLParsing.m */; };
-               BCB66A0D1A85183000C7B1FE /* NSString+WMFHTMLParsing.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB66A0B1A85183000C7B1FE /* 
NSString+WMFHTMLParsing.m */; };
-               BCB66A101A851C9B00C7B1FE /* MWKImageListTests.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB66A0F1A851C9B00C7B1FE /* MWKImageListTests.m 
*/; };
+               BCBDE0AF1AA76F3F006BD29A /* WMFCodingStyle.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BC6FEAE01A9B7EFD00A1D890 /* WMFCodingStyle.m */; 
};
+               BCBDE0B01AA76F3F006BD29A /* MWKTestCase.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669BB1A83F6D300C7B1FE /* MWKTestCase.m */; };
+               BCBDE0B11AA76F3F006BD29A /* MWKArticleStoreTestCase.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669BD1A83F6D300C7B1FE /* 
MWKArticleStoreTestCase.m */; };
+               BCBDE0B21AA76F3F006BD29A /* MWKSiteTests.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669C91A83F6D300C7B1FE /* MWKSiteTests.m */; };
+               BCBDE0B31AA76F3F006BD29A /* MWKTitleTests.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB669CA1A83F6D300C7B1FE /* MWKTitleTests.m */; 
};
+               BCBDE0B41AA76F3F006BD29A /* MWKUserTests.m in Sources */ = {isa 
= PBXBuildFile; fileRef = BCB669CB1A83F6D300C7B1FE /* MWKUserTests.m */; };
+               BCBDE0B51AA76F3F006BD29A /* MWKProtectionStatusTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669CC1A83F6D300C7B1FE /* 
MWKProtectionStatusTests.m */; };
+               BCBDE0B61AA76F3F006BD29A /* MWKDataStorePathTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB669CD1A83F6D300C7B1FE /* 
MWKDataStorePathTests.m */; };
+               BCBDE0B71AA76F3F006BD29A /* MWKDataStoreStorageTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669CE1A83F6D300C7B1FE /* 
MWKDataStoreStorageTests.m */; };
+               BCBDE0B81AA76F3F006BD29A /* MWKImageStorageTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB669CF1A83F6D300C7B1FE /* 
MWKImageStorageTests.m */; };
+               BCBDE0B91AA76F3F006BD29A /* MWKHistoryListTests.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCB669D01A83F6D300C7B1FE /* 
MWKHistoryListTests.m */; };
+               BCBDE0BA1AA76F3F006BD29A /* MWKImageListTests.m in Sources */ = 
{isa = PBXBuildFile; fileRef = BCB66A0F1A851C9B00C7B1FE /* MWKImageListTests.m 
*/; };
+               BCBDE0BB1AA76F3F006BD29A /* 
MWKImageInfo+MWKImageComparisonTests.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BCB58F7D1A8D1B8400465627 /* MWKImageInfo+MWKImageComparisonTests.m 
*/; };
+               BCBDE0BC1AA76F3F006BD29A /* NSArray+PredicateTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BC8309C81A7C370B003FC5C7 /* 
NSArray+PredicateTests.m */; };
+               BCBDE0BD1AA76F3F006BD29A /* WMFJoinedPropertyParametersTests.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BC50C3821A83C88F006DC7AF /* 
WMFJoinedPropertyParametersTests.m */; };
+               BCBDE0BE1AA76F3F006BD29A /* WMFErrorForApiErrorObjectTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669601A83D7B300C7B1FE /* 
WMFErrorForApiErrorObjectTests.m */; };
+               BCBDE0BF1AA76F3F006BD29A /* NSMutableDictionary+MaybeSetTests.m 
in Sources */ = {isa = PBXBuildFile; fileRef = BCB669751A83F59300C7B1FE /* 
NSMutableDictionary+MaybeSetTests.m */; };
+               BCBDE0C01AA76F3F006BD29A /* CircularBitwiseRotationTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCB669FC1A84158200C7B1FE /* 
CircularBitwiseRotationTests.m */; };
+               BCBDE0C11AA76F3F006BD29A /* NSArray+BKIndexTests.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BCB58F7B1A8D0C8E00465627 /* 
NSArray+BKIndexTests.m */; };
+               BCBDE0C21AA76F3F006BD29A /* NSString+WMFHTMLParsingTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = C983151B1AA5205700E25EE1 /* 
NSString+WMFHTMLParsingTests.m */; };
+               BCBDE0C31AA76F3F006BD29A /* WMFImageURLParsingTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BCBDE0AB1AA76EAC006BD29A /* 
WMFImageURLParsingTests.m */; };
                BCC185D81A9E5628005378F8 /* UILabel+WMFStyling.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCC185D71A9E5628005378F8 /* 
UILabel+WMFStyling.m */; };
                BCC185E01A9EC836005378F8 /* UIButton+FrameUtils.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BCC185DF1A9EC836005378F8 /* 
UIButton+FrameUtils.m */; };
                BCC185E81A9FA498005378F8 /* 
UICollectionViewFlowLayout+AttributeUtils.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCC185E71A9FA498005378F8 /* 
UICollectionViewFlowLayout+AttributeUtils.m */; };
-               BCC185E91A9FA498005378F8 /* 
UICollectionViewFlowLayout+AttributeUtils.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BCC185E71A9FA498005378F8 /* 
UICollectionViewFlowLayout+AttributeUtils.m */; };
                C42D947E1A937DAC00A4871A /* SavedArticlesFetcher.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = C42D947D1A937DAC00A4871A /* 
SavedArticlesFetcher.m */; };
                C42D94861A937DE000A4871A /* WMFBorderButton.m in Sources */ = 
{isa = PBXBuildFile; fileRef = C42D94831A937DE000A4871A /* WMFBorderButton.m 
*/; };
                C42D94871A937DE000A4871A /* WMFProgressLineView.m in Sources */ 
= {isa = PBXBuildFile; fileRef = C42D94851A937DE000A4871A /* 
WMFProgressLineView.m */; };
@@ -326,7 +284,6 @@
                C979727A1A731EAA00C6ED7A /* ShareOptions.xib in Resources */ = 
{isa = PBXBuildFile; fileRef = C97972791A731EAA00C6ED7A /* ShareOptions.xib */; 
};
                C979727D1A731F2D00C6ED7A /* WMFShareOptionsView.m in Sources */ 
= {isa = PBXBuildFile; fileRef = C979727C1A731F2D00C6ED7A /* 
WMFShareOptionsView.m */; };
                C982729B1A803DCC0039FAC3 /* Wikipedia_wordmark_gray.png in 
Resources */ = {isa = PBXBuildFile; fileRef = C982729A1A803DCC0039FAC3 /* 
Wikipedia_wordmark_gray.png */; };
-               C983151C1AA5205700E25EE1 /* NSString+WMFHTMLParsingTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = C983151B1AA5205700E25EE1 /* 
NSString+WMFHTMLParsingTests.m */; };
                C98990341A699DE000AF44FC /* WMFShareCardViewController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = C98990331A699DE000AF44FC /* 
WMFShareCardViewController.m */; };
                C98990361A699DFB00AF44FC /* ShareCard.xib in Resources */ = 
{isa = PBXBuildFile; fileRef = C98990351A699DFB00AF44FC /* ShareCard.xib */; };
                C99844571A8C1F23001D58FD /* UIWebView+WMFSuppressSelection.m in 
Sources */ = {isa = PBXBuildFile; fileRef = C99844561A8C1F23001D58FD /* 
UIWebView+WMFSuppressSelection.m */; };
@@ -367,6 +324,13 @@
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
+               BCBDE0AD1AA76F19006BD29A /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = D499142D181D51DE00E6073C /* Project 
object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = D4991434181D51DE00E6073C;
+                       remoteInfo = Wikipedia;
+               };
                D4E6D9151A5C65FA004916C1 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = D4F478441A48CD8500D8043C /* 
OldDataSchema.xcodeproj */;
@@ -847,6 +811,7 @@
                BCB66A0A1A85183000C7B1FE /* NSString+WMFHTMLParsing.h */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path 
= "NSString+WMFHTMLParsing.h"; sourceTree = "<group>"; };
                BCB66A0B1A85183000C7B1FE /* NSString+WMFHTMLParsing.m */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; 
path = "NSString+WMFHTMLParsing.m"; sourceTree = "<group>"; };
                BCB66A0F1A851C9B00C7B1FE /* MWKImageListTests.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= MWKImageListTests.m; sourceTree = "<group>"; };
+               BCBDE0AB1AA76EAC006BD29A /* WMFImageURLParsingTests.m */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; 
path = WMFImageURLParsingTests.m; sourceTree = "<group>"; };
                BCC185D61A9E5628005378F8 /* UILabel+WMFStyling.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"UILabel+WMFStyling.h"; sourceTree = "<group>"; };
                BCC185D71A9E5628005378F8 /* UILabel+WMFStyling.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= "UILabel+WMFStyling.m"; sourceTree = "<group>"; };
                BCC185DE1A9EC836005378F8 /* UIButton+FrameUtils.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"UIButton+FrameUtils.h"; sourceTree = "<group>"; };
@@ -1998,7 +1963,6 @@
                BC8309941A7BF935003FC5C7 /* WikipediaUnitTests */ = {
                        isa = PBXGroup;
                        children = (
-                               C983151B1AA5205700E25EE1 /* 
NSString+WMFHTMLParsingTests.m */,
                                BC7DFCCB1AA4BA8A000035C3 /* WMFCodingStyle.h */,
                                BC6FEAE01A9B7EFD00A1D890 /* WMFCodingStyle.m */,
                                BCB669D11A83F6D300C7B1FE /* MediaWikiKitTests 
*/,
@@ -2009,6 +1973,8 @@
                                BCB669751A83F59300C7B1FE /* 
NSMutableDictionary+MaybeSetTests.m */,
                                BCB669FC1A84158200C7B1FE /* 
CircularBitwiseRotationTests.m */,
                                BCB58F7B1A8D0C8E00465627 /* 
NSArray+BKIndexTests.m */,
+                               C983151B1AA5205700E25EE1 /* 
NSString+WMFHTMLParsingTests.m */,
+                               BCBDE0AB1AA76EAC006BD29A /* 
WMFImageURLParsingTests.m */,
                        );
                        path = WikipediaUnitTests;
                        sourceTree = "<group>";
@@ -2408,6 +2374,7 @@
                        buildRules = (
                        );
                        dependencies = (
+                               BCBDE0AE1AA76F19006BD29A /* PBXTargetDependency 
*/,
                        );
                        name = WikipediaUnitTests;
                        productName = WikipediaUnitTests;
@@ -2451,6 +2418,7 @@
                                TargetAttributes = {
                                        BC4273511A7C736800068882 = {
                                                CreatedOnToolsVersion = 6.1.1;
+                                               TestTargetID = 
D4991434181D51DE00E6073C;
                                        };
                                        D4991434181D51DE00E6073C = {
                                                DevelopmentTeam = AKK7J2GV64;
@@ -2815,70 +2783,27 @@
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
-                               BCB669611A83D7B300C7B1FE /* 
WMFErrorForApiErrorObjectTests.m in Sources */,
-                               BCB66A101A851C9B00C7B1FE /* MWKImageListTests.m 
in Sources */,
-                               BC6FEAE11A9B7EFD00A1D890 /* WMFCodingStyle.m in 
Sources */,
-                               BCB669FA1A83F71C00C7B1FE /* MWKSectionList.m in 
Sources */,
-                               042E3B941AA16D6700BF8D66 /* 
UIViewController+WMFChildViewController.m in Sources */,
-                               BCB669631A83DB8F00C7B1FE /* 
MWKImageInfoResponseSerializer.m in Sources */,
-                               BCB669761A83F59300C7B1FE /* 
NSMutableDictionary+MaybeSetTests.m in Sources */,
-                               0480AE971AA4E65D00A9950C /* 
WMFWebViewFooterViewController.m in Sources */,
-                               BC50C3831A83C88F006DC7AF /* 
WMFJoinedPropertyParametersTests.m in Sources */,
-                               BCB669E01A83F6D300C7B1FE /* MWKTitleTests.m in 
Sources */,
-                               C983151C1AA5205700E25EE1 /* 
NSString+WMFHTMLParsingTests.m in Sources */,
-                               BCB58F451A890D9700465627 /* 
MWKImageInfo+MWKImageComparison.m in Sources */,
-                               BC42735E1A7C73B300068882 /* 
NSArray+PredicateTests.m in Sources */,
-                               BCB669F01A83F71C00C7B1FE /* MWKSavedPageList.m 
in Sources */,
-                               BCB669FD1A84158200C7B1FE /* 
CircularBitwiseRotationTests.m in Sources */,
-                               BC7DFCD71AA4E5FE000035C3 /* 
WMFImageURLParsing.m in Sources */,
-                               BCB669D31A83F6D300C7B1FE /* MWKTestCase.m in 
Sources */,
-                               BCB669E51A83F6D300C7B1FE /* 
MWKImageStorageTests.m in Sources */,
-                               BCB669F51A83F71C00C7B1FE /* MWKImageInfo.m in 
Sources */,
-                               BCB669F71A83F71C00C7B1FE /* MWKArticle.m in 
Sources */,
-                               BCB669F91A83F71C00C7B1FE /* MWKImageList.m in 
Sources */,
-                               BCB669F81A83F71C00C7B1FE /* MWKUserDataStore.m 
in Sources */,
-                               BCB669F31A83F71C00C7B1FE /* 
MWKRecentSearchEntry.m in Sources */,
-                               BC118C0F1A95894D0072E4D8 /* WikipediaAppUtils.m 
in Sources */,
-                               BCB669F61A83F71C00C7B1FE /* MWKDataStore.m in 
Sources */,
-                               BCB669E71A83F71C00C7B1FE /* MWKSite.m in 
Sources */,
-                               BCB58F7C1A8D0C8E00465627 /* 
NSArray+BKIndexTests.m in Sources */,
-                               BCB58F7E1A8D1B8400465627 /* 
MWKImageInfo+MWKImageComparisonTests.m in Sources */,
-                               BC50C3841A83C96D006DC7AF /* 
WMFNetworkUtilities.m in Sources */,
-                               BCB669F11A83F71C00C7B1FE /* MWKHistoryEntry.m 
in Sources */,
-                               BC2CBB8F1AA10F400079A313 /* 
UIView+WMFFrameUtils.m in Sources */,
-                               BCB669EB1A83F71C00C7B1FE /* MWKUser.m in 
Sources */,
-                               BCB669ED1A83F71C00C7B1FE /* MWKImage.m in 
Sources */,
-                               0480AE8C1AA4E61000A9950C /* 
WMFOptionsFooterViewController.m in Sources */,
-                               BCB669E31A83F6D300C7B1FE /* 
MWKDataStorePathTests.m in Sources */,
-                               BCB669E11A83F6D300C7B1FE /* MWKUserTests.m in 
Sources */,
-                               BCB58F791A8D081E00465627 /* NSArray+BKIndex.m 
in Sources */,
-                               BCB669E91A83F71C00C7B1FE /* MWKDataObject.m in 
Sources */,
-                               BCB669EF1A83F71C00C7B1FE /* MWKSavedPageEntry.m 
in Sources */,
-                               BCB669E41A83F6D300C7B1FE /* 
MWKDataStoreStorageTests.m in Sources */,
-                               BCB669D41A83F6D300C7B1FE /* 
MWKArticleStoreTestCase.m in Sources */,
-                               BCB669E81A83F71C00C7B1FE /* MWKTitle.m in 
Sources */,
-                               BCB669E21A83F6D300C7B1FE /* 
MWKProtectionStatusTests.m in Sources */,
-                               0480AE9D1AA4F01600A9950C /* 
WMFWebViewFooterContainerView.m in Sources */,
-                               0480AE901AA4E61000A9950C /* 
WMFReadMoreViewController.m in Sources */,
-                               BCB669DF1A83F6D300C7B1FE /* MWKSiteTests.m in 
Sources */,
-                               BCB58F641A8A9F1000465627 /* MWKLicense.m in 
Sources */,
-                               BCB669F21A83F71C00C7B1FE /* MWKHistoryList.m in 
Sources */,
-                               BCB669E61A83F6D300C7B1FE /* 
MWKHistoryListTests.m in Sources */,
-                               BC42735D1A7C73B300068882 /* NSArray+Predicate.m 
in Sources */,
-                               BC118C101A9589720072E4D8 /* AssetsFile.m in 
Sources */,
-                               BCB669EA1A83F71C00C7B1FE /* MWKSiteDataObject.m 
in Sources */,
-                               0480AEA11AA4F4DA00A9950C /* 
WMFIntrinsicContentSizeAwareTableView.m in Sources */,
-                               BC86B9411A929D7900B4C039 /* 
UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */,
-                               0480AE881AA4E61000A9950C /* 
WMFLegalFooterViewController.m in Sources */,
-                               BCB669EC1A83F71C00C7B1FE /* MWKSection.m in 
Sources */,
-                               BCB58F681A8AA22200465627 /* 
MWKLicense+ToGlyph.m in Sources */,
-                               BCB66A0D1A85183000C7B1FE /* 
NSString+WMFHTMLParsing.m in Sources */,
-                               BCB669EE1A83F71C00C7B1FE /* 
MWKProtectionStatus.m in Sources */,
-                               BCB669F41A83F71C00C7B1FE /* 
MWKRecentSearchList.m in Sources */,
-                               BCC185E91A9FA498005378F8 /* 
UICollectionViewFlowLayout+AttributeUtils.m in Sources */,
-                               04BA48A21A80062F00CB5CAE /* UIFont+WMFStyle.m 
in Sources */,
-                               BCB669741A83F58600C7B1FE /* 
NSMutableDictionary+WMFMaybeSet.m in Sources */,
-                               042BEAF01A92EE66002CF320 /* 
UIWebView+WMFTrackingView.m in Sources */,
+                               BCBDE0B61AA76F3F006BD29A /* 
MWKDataStorePathTests.m in Sources */,
+                               BCBDE0B21AA76F3F006BD29A /* MWKSiteTests.m in 
Sources */,
+                               BCBDE0BC1AA76F3F006BD29A /* 
NSArray+PredicateTests.m in Sources */,
+                               BCBDE0BD1AA76F3F006BD29A /* 
WMFJoinedPropertyParametersTests.m in Sources */,
+                               BCBDE0BF1AA76F3F006BD29A /* 
NSMutableDictionary+MaybeSetTests.m in Sources */,
+                               BCBDE0B71AA76F3F006BD29A /* 
MWKDataStoreStorageTests.m in Sources */,
+                               BCBDE0AF1AA76F3F006BD29A /* WMFCodingStyle.m in 
Sources */,
+                               BCBDE0BB1AA76F3F006BD29A /* 
MWKImageInfo+MWKImageComparisonTests.m in Sources */,
+                               BCBDE0C11AA76F3F006BD29A /* 
NSArray+BKIndexTests.m in Sources */,
+                               BCBDE0B01AA76F3F006BD29A /* MWKTestCase.m in 
Sources */,
+                               BCBDE0C21AA76F3F006BD29A /* 
NSString+WMFHTMLParsingTests.m in Sources */,
+                               BCBDE0BE1AA76F3F006BD29A /* 
WMFErrorForApiErrorObjectTests.m in Sources */,
+                               BCBDE0B91AA76F3F006BD29A /* 
MWKHistoryListTests.m in Sources */,
+                               BCBDE0B51AA76F3F006BD29A /* 
MWKProtectionStatusTests.m in Sources */,
+                               BCBDE0BA1AA76F3F006BD29A /* MWKImageListTests.m 
in Sources */,
+                               BCBDE0B11AA76F3F006BD29A /* 
MWKArticleStoreTestCase.m in Sources */,
+                               BCBDE0C31AA76F3F006BD29A /* 
WMFImageURLParsingTests.m in Sources */,
+                               BCBDE0B81AA76F3F006BD29A /* 
MWKImageStorageTests.m in Sources */,
+                               BCBDE0B41AA76F3F006BD29A /* MWKUserTests.m in 
Sources */,
+                               BCBDE0C01AA76F3F006BD29A /* 
CircularBitwiseRotationTests.m in Sources */,
+                               BCBDE0B31AA76F3F006BD29A /* MWKTitleTests.m in 
Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
@@ -3109,6 +3034,11 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
+               BCBDE0AE1AA76F19006BD29A /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = D4991434181D51DE00E6073C /* Wikipedia */;
+                       targetProxy = BCBDE0AD1AA76F19006BD29A /* 
PBXContainerItemProxy */;
+               };
                D4F478761A48D1BB00D8043C /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        name = OldDataSchema;
@@ -3330,6 +3260,7 @@
                        isa = XCBuildConfiguration;
                        baseConfigurationReference = DC96DA4AAD521D734849D20F 
/* Pods-WikipediaUnitTests.debug.xcconfig */;
                        buildSettings = {
+                               BUNDLE_LOADER = "$(TEST_HOST)";
                                CLANG_WARN_UNREACHABLE_CODE = YES;
                                ENABLE_STRICT_OBJC_MSGSEND = YES;
                                FRAMEWORK_SEARCH_PATHS = (
@@ -3346,6 +3277,7 @@
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) 
@executable_path/Frameworks @loader_path/Frameworks";
                                MTL_ENABLE_DEBUG_INFO = YES;
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               TEST_HOST = 
"$(BUILT_PRODUCTS_DIR)/Wikipedia.app/Wikipedia";
                        };
                        name = Debug;
                };
@@ -3353,6 +3285,7 @@
                        isa = XCBuildConfiguration;
                        baseConfigurationReference = 17A2F22335C5256576CEDBDD 
/* Pods-WikipediaUnitTests.release.xcconfig */;
                        buildSettings = {
+                               BUNDLE_LOADER = "$(TEST_HOST)";
                                CLANG_WARN_UNREACHABLE_CODE = YES;
                                ENABLE_STRICT_OBJC_MSGSEND = YES;
                                FRAMEWORK_SEARCH_PATHS = (
@@ -3365,6 +3298,7 @@
                                LD_RUNPATH_SEARCH_PATHS = "$(inherited) 
@executable_path/Frameworks @loader_path/Frameworks";
                                MTL_ENABLE_DEBUG_INFO = NO;
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               TEST_HOST = 
"$(BUILT_PRODUCTS_DIR)/Wikipedia.app/Wikipedia";
                        };
                        name = Release;
                };
diff --git a/WikipediaUnitTests/WMFImageURLParsingTests.m 
b/WikipediaUnitTests/WMFImageURLParsingTests.m
new file mode 100644
index 0000000..dd8bd6b
--- /dev/null
+++ b/WikipediaUnitTests/WMFImageURLParsingTests.m
@@ -0,0 +1,40 @@
+//
+//  WMFImageURLParsingTests.m
+//  Wikipedia
+//
+//  Created by Brian Gerstle on 3/4/15.
+//  Copyright (c) 2015 Wikimedia Foundation. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import <XCTest/XCTest.h>
+#import "WMFImageURLParsing.h"
+
+#define HC_SHORTHAND 1
+#import <OCHamcrest/OCHamcrest.h>
+
+@interface WMFImageURLParsingTests : XCTestCase
+
+@end
+
+@implementation WMFImageURLParsingTests
+
+- (void)testNoPrefixExample {
+    NSString* testURL = 
@"//upload.wikimedia.org/wikipedia/commons/thumb/4/41/Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg/Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg";
+    assertThat(WMFParseImageNameFromSourceURL(testURL),
+               
is(equalTo(@"Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg")));
+}
+
+- (void)testImageWithOneExtensionExample {
+    NSString* testURL = 
@"//upload.wikimedia.org/wikipedia/commons/thumb/4/41/Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg/640px-Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg";
+    assertThat(WMFParseImageNameFromSourceURL(testURL),
+               
is(equalTo(@"Iceberg_with_hole_near_Sandersons_Hope_2007-07-28_2.jpg")));
+}
+
+- (void)testImageWithTwoExtensionsExample {
+    NSString* testURL = 
@"http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Access_to_drinking_water_in_third_world.svg/320px-Access_to_drinking_water_in_third_world.svg.png";;
+    assertThat(WMFParseImageNameFromSourceURL(testURL),
+               is(equalTo(@"Access_to_drinking_water_in_third_world.svg")));
+}
+
+@end
diff --git a/wikipedia/Networking/Fetchers/ArticleFetcher.m 
b/wikipedia/Networking/Fetchers/ArticleFetcher.m
index 2952303..e24906c 100644
--- a/wikipedia/Networking/Fetchers/ArticleFetcher.m
+++ b/wikipedia/Networking/Fetchers/ArticleFetcher.m
@@ -319,8 +319,6 @@
         }
 
         MWKImage* image = [self.article importImageURL:src 
sectionId:sectionId];
-        // update filepage url and then save
-        image.filePageURL = linkNode.attributes[@"href"];
         [image save];
 
         imageIndexInSection++;
diff --git a/wikipedia/View Controllers/Image 
Gallery/WMFImageGalleryViewController.m b/wikipedia/View Controllers/Image 
Gallery/WMFImageGalleryViewController.m
index 6f48042..712742b 100644
--- a/wikipedia/View Controllers/Image Gallery/WMFImageGalleryViewController.m
+++ b/wikipedia/View Controllers/Image Gallery/WMFImageGalleryViewController.m
@@ -80,6 +80,9 @@
 @end
 
 static NSAttributedString* ConcatOwnerAndLicense(NSString* owner, MWKLicense* 
license){
+    if (!owner && !license) {
+        return [[NSAttributedString alloc] initWithString:@"" attributes:nil];
+    }
     NSMutableAttributedString* result = [NSMutableAttributedString new];
     NSString* licenseGlyph            = [license toGlyph] ? : WIKIGLYPH_CITE;
     if (licenseGlyph) {
@@ -418,15 +421,17 @@
 
     cell.detailOverlayView.hidden = [self isChromeHidden];
 
-    cell.detailOverlayView.imageDescriptionLabel.text = 
infoForImage.imageDescription ? : @"";
 
-    [cell.detailOverlayView.ownerButton
-     setAttributedTitle:ConcatOwnerAndLicense(infoForImage.owner, 
infoForImage.license)
-               forState:UIControlStateNormal];
+    if (infoForImage) {
+        cell.detailOverlayView.imageDescriptionLabel.text = 
infoForImage.imageDescription;
 
-    cell.detailOverlayView.ownerTapCallback = ^{
-        [[UIApplication sharedApplication] openURL:infoForImage.license.URL];
-    };
+        NSAttributedString* ownerAndLicense = 
ConcatOwnerAndLicense(infoForImage.owner, infoForImage.license);
+        [cell.detailOverlayView.ownerButton setAttributedTitle:ownerAndLicense 
forState:UIControlStateNormal];
+
+        cell.detailOverlayView.ownerTapCallback = ^{
+            [[UIApplication sharedApplication] 
openURL:infoForImage.license.URL];
+        };
+    }
 
     [self updateImageForCell:cell atIndexPath:indexPath image:imageStub 
info:infoForImage];
 
diff --git a/wikipedia/mw-utils/WMFImageURLParsing.h 
b/wikipedia/mw-utils/WMFImageURLParsing.h
index 7d2036e..e83827c 100644
--- a/wikipedia/mw-utils/WMFImageURLParsing.h
+++ b/wikipedia/mw-utils/WMFImageURLParsing.h
@@ -1,5 +1,12 @@
 #import <Foundation/Foundation.h>
 
-FOUNDATION_EXPORT NSString* WMFParseImageNameFromSourceURL(NSURL* sourceURL) 
__attribute__((overloadable));
+/**
+ * Parse the file page title from an image's source URL.  See tests for 
examples.
+ * @param sourceURL The source URL for an image, i.e. the "src" attribute of 
the @c \<img\> element.
+ * @note This will remove any extra path extensions in @c sourceURL (e.g. 
".../10px-foo.svg.png" to "foo.svg").
+ * @warning This method does regex parsing, be sure to cache the result if 
possible.
+ */
+FOUNDATION_EXPORT NSString* WMFParseImageNameFromSourceURL(NSString* 
sourceURL) __attribute__((overloadable));
 
-FOUNDATION_EXPORT NSString* WMFParseImageNameFromSourceURL(NSString* 
sourceURL) __attribute__((overloadable));
\ No newline at end of file
+/// Convenience wrapper for @c WMFParseImageNameFromSourceURL(NSString*)
+FOUNDATION_EXPORT NSString* WMFParseImageNameFromSourceURL(NSURL* sourceURL) 
__attribute__((overloadable));
diff --git a/wikipedia/mw-utils/WMFImageURLParsing.m 
b/wikipedia/mw-utils/WMFImageURLParsing.m
index adb9483..75cb6b9 100644
--- a/wikipedia/mw-utils/WMFImageURLParsing.m
+++ b/wikipedia/mw-utils/WMFImageURLParsing.m
@@ -1,5 +1,19 @@
 #import "WMFImageURLParsing.h"
 
+static NSRegularExpression* WMFImageURLParsingRegex() {
+    static NSRegularExpression* imageNameFromURLRegex = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        // TODO: try to read serialized regex from disk to prevent needless 
pattern compilation on next app run
+        NSError* patternCompilationError;
+        imageNameFromURLRegex = [NSRegularExpression 
regularExpressionWithPattern:@"^\\d+px-([^.]*\\.[^.]*).*$"
+                                                                          
options:0
+                                                                            
error:&patternCompilationError];
+        NSCParameterAssert(!patternCompilationError);
+    });
+    return imageNameFromURLRegex;
+}
+
 NSString* WMFParseImageNameFromSourceURL(NSURL* sourceURL)  
__attribute__((overloadable)){
     return WMFParseImageNameFromSourceURL(sourceURL.absoluteString);
 }
@@ -8,8 +22,9 @@
     if (!sourceURL) {
         return nil;
     }
-    NSString* fileName      = [sourceURL lastPathComponent];
-    NSRegularExpression* re = [NSRegularExpression 
regularExpressionWithPattern:@"^\\d+px-(.*)$" options:0 error:nil];
-    NSArray* matches        = [re matchesInString:fileName options:0 
range:NSMakeRange(0, [fileName length])];
+    NSString* fileName = [sourceURL lastPathComponent];
+    NSArray* matches   = [WMFImageURLParsingRegex() matchesInString:fileName
+                                                            options:0
+                                                              
range:NSMakeRange(0, [fileName length])];
     return matches.count ? [fileName substringWithRange : [matches[0] 
rangeAtIndex:1]] : fileName;
 }
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/194355
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I00a20b837ce3275cc5ccd0217d7e759a07e52bad
Gerrit-PatchSet: 1
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Bgerstle <bgers...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to