From 9a7651b017f37d9118b1e8434b62a534d8fe9a03 Mon Sep 17 00:00:00 2001 From: Dylan Wagstaff Date: Mon, 11 Dec 2017 12:10:56 +1300 Subject: [PATCH 1/5] run the upgrader tool over the codebase to namespace the classes --- .upgrade.yml | 12 +++++++++ src/Filters/CachedContentFilter.php | 10 ++++++-- src/Filters/ContentFilter.php | 14 +++++++--- src/Filters/RateLimitFilter.php | 24 ++++++++++++----- src/VersionFeed.php | 23 +++++++++++++++++ src/VersionFeedController.php | 40 ++++++++++++++++++++++++----- src/VersionFeedSiteConfig.php | 20 +++++++++++++-- tests/VersionFeedFunctionalTest.php | 37 +++++++++++++++++++------- tests/VersionFeedTest.php | 14 ++++++++-- 9 files changed, 163 insertions(+), 31 deletions(-) create mode 100644 .upgrade.yml diff --git a/.upgrade.yml b/.upgrade.yml new file mode 100644 index 0000000..5872d59 --- /dev/null +++ b/.upgrade.yml @@ -0,0 +1,12 @@ +mappings: + VersionFeed: SilverStripe\VersionFeed\VersionFeed + VersionFeed_Controller: SilverStripe\VersionFeed\VersionFeedController + VersionFeedSiteConfig: SilverStripe\VersionFeed\VersionFeedSiteConfig + CachedContentFilter: SilverStripe\VersionFeed\Filters\CachedContentFilter + ContentFilter: SilverStripe\VersionFeed\Filters\ContentFilter + RateLimitFilter: SilverStripe\VersionFeed\Filters\RateLimitFilter + \VersionFeed\Filters\CachedContentFilter: SilverStripe\VersionFeed\Filters\CachedContentFilter + \VersionFeed\Filters\ContentFilter: SilverStripe\VersionFeed\Filters\ContentFilter + \VersionFeed\Filters\RateLimitFilter: SilverStripe\VersionFeed\Filters\RateLimitFilter + VersionFeedFunctionalTest: SilverStripe\VersionFeed\Tests\VersionFeedFunctionalTest + VersionFeedTest: SilverStripe\VersionFeed\Tests\VersionFeedTest diff --git a/src/Filters/CachedContentFilter.php b/src/Filters/CachedContentFilter.php index d9ccf05..73dc2a5 100644 --- a/src/Filters/CachedContentFilter.php +++ b/src/Filters/CachedContentFilter.php @@ -1,6 +1,12 @@ getCache(); // Return cached value if available - $cacheEnabled = \Config::inst()->get(get_class(), 'cache_enabled'); + $cacheEnabled = Config::inst()->get(get_class(), 'cache_enabled'); $result = (isset($_GET['flush']) || !$cacheEnabled) ? null : $cache->load($key); diff --git a/src/Filters/ContentFilter.php b/src/Filters/ContentFilter.php index be26b95..e2670f3 100644 --- a/src/Filters/ContentFilter.php +++ b/src/Filters/ContentFilter.php @@ -1,6 +1,14 @@ setOption('automatic_serialization', true); // Map 0 to null for unlimited lifetime - $lifetime = \Config::inst()->get(get_class($this), 'cache_lifetime') ?: null; + $lifetime = Config::inst()->get(get_class($this), 'cache_lifetime') ?: null; $cache->setLifetime($lifetime); return $cache; } diff --git a/src/Filters/RateLimitFilter.php b/src/Filters/RateLimitFilter.php index e79e00d..d6a232b 100644 --- a/src/Filters/RateLimitFilter.php +++ b/src/Filters/RateLimitFilter.php @@ -1,6 +1,16 @@ get(get_class(), 'lock_bypage')) { + if(Config::inst()->get(get_class(), 'lock_bypage')) { $key .= '_' . md5($itemkey); } // Add user-specific identifier - if(\Config::inst()->get(get_class(), 'lock_byuserip') && \Controller::has_curr()) { - $ip = \Controller::curr()->getRequest()->getIP(); + if(Config::inst()->get(get_class(), 'lock_byuserip') && Controller::has_curr()) { + $ip = Controller::curr()->getRequest()->getIP(); $key .= '_' . md5($ip); } @@ -76,7 +86,7 @@ class RateLimitFilter extends ContentFilter { public function getContent($key, $callback) { // Bypass rate limiting if flushing, or timeout isn't set - $timeout = \Config::inst()->get(get_class(), 'lock_timeout'); + $timeout = Config::inst()->get(get_class(), 'lock_timeout'); if(isset($_GET['flush']) || !$timeout) { return parent::getContent($key, $callback); } @@ -87,7 +97,7 @@ class RateLimitFilter extends ContentFilter { if($lockedUntil = $cache->load($limitKey)) { if(time() < $lockedUntil) { // Politely inform visitor of limit - $response = new \SS_HTTPResponse_Exception('Too Many Requests.', 429); + $response = new HTTPResponse_Exception('Too Many Requests.', 429); $response->getResponse()->addHeader('Retry-After', 1 + $lockedUntil - time()); throw $response; } @@ -100,7 +110,7 @@ class RateLimitFilter extends ContentFilter { $result = parent::getContent($key, $callback); // Reset rate limit with optional cooldown - if($cooldown = \Config::inst()->get(get_class(), 'lock_cooldown')) { + if($cooldown = Config::inst()->get(get_class(), 'lock_cooldown')) { // Set cooldown on successful query execution $cache->save(time() + $cooldown, $limitKey); } else { diff --git a/src/VersionFeed.php b/src/VersionFeed.php index 63f52b1..a13989b 100644 --- a/src/VersionFeed.php +++ b/src/VersionFeed.php @@ -1,5 +1,28 @@ get('VersionFeed', 'changes_enabled') + if(!Config::inst()->get(VersionFeed::class, 'changes_enabled') || !$this->owner->PublicHistory || $this->owner->Version == '' ) { @@ -59,7 +87,7 @@ class VersionFeed_Controller extends Extension { $target = $this->owner; $key = implode('_', array('changes', $this->owner->ID, $this->owner->Version)); $entries = $this->filterContent($key, function() use ($target) { - return $target->getDiffList(null, Config::inst()->get('VersionFeed', 'changes_limit')); + return $target->getDiffList(null, Config::inst()->get(VersionFeed::class, 'changes_limit')); }); // Generate the output. @@ -74,13 +102,13 @@ class VersionFeed_Controller extends Extension { */ public function allchanges() { // Check viewability of allchanges - if(!Config::inst()->get('VersionFeed', 'allchanges_enabled') + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled') || !SiteConfig::current_site_config()->AllChangesEnabled ) { return $this->owner->httpError(404, 'Global history not viewable'); } - $limit = (int)Config::inst()->get('VersionFeed', 'allchanges_limit'); + $limit = (int)Config::inst()->get(VersionFeed::class, 'allchanges_limit'); $latestChanges = DB::query(' SELECT * FROM "SiteTree_versions" WHERE "WasPublished" = \'1\' @@ -135,7 +163,7 @@ class VersionFeed_Controller extends Extension { * Generates and embeds the RSS header link for the page-specific version rss feed */ public function linkToPageRSSFeed() { - if (!Config::inst()->get('VersionFeed', 'changes_enabled') || !$this->owner->PublicHistory) { + if (!Config::inst()->get(VersionFeed::class, 'changes_enabled') || !$this->owner->PublicHistory) { return; } @@ -152,7 +180,7 @@ class VersionFeed_Controller extends Extension { * Generates and embeds the RSS header link for the global version rss feed */ public function linkToAllSiteRSSFeed() { - if(!Config::inst()->get('VersionFeed', 'allchanges_enabled') + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled') || !SiteConfig::current_site_config()->AllChangesEnabled ) { return; diff --git a/src/VersionFeedSiteConfig.php b/src/VersionFeedSiteConfig.php index 2320bc5..a646638 100644 --- a/src/VersionFeedSiteConfig.php +++ b/src/VersionFeedSiteConfig.php @@ -1,5 +1,21 @@ get('VersionFeed', 'allchanges_enabled')) return; + public function updateCMSFields(FieldList $fields) { + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled')) return; $fields->addFieldToTab('Root.Access', FieldGroup::create(new CheckboxField('AllChangesEnabled', $this->owner->fieldLabel('AllChangesEnabled'))) diff --git a/tests/VersionFeedFunctionalTest.php b/tests/VersionFeedFunctionalTest.php index c6fe994..e53be6e 100644 --- a/tests/VersionFeedFunctionalTest.php +++ b/tests/VersionFeedFunctionalTest.php @@ -1,10 +1,29 @@ array('VersionFeed'), - 'Page_Controller' => array('VersionFeed_Controller'), + 'Page' => array(VersionFeed::class), + 'Page_Controller' => array(VersionFeedController::class), ); protected $userIP; @@ -12,15 +31,15 @@ class VersionFeedFunctionalTest extends FunctionalTest { public function setUp() { parent::setUp(); - $cache = SS_Cache::factory('VersionFeed_Controller'); + $cache = SS_Cache::factory(VersionFeedController::class); $cache->clean(Zend_Cache::CLEANING_MODE_ALL); $this->userIP = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : null; Config::nest(); // Enable history by default - Config::inst()->update('VersionFeed', 'changes_enabled', true); - Config::inst()->update('VersionFeed', 'allchanges_enabled', true); + Config::inst()->update(VersionFeed::class, 'changes_enabled', true); + Config::inst()->update(VersionFeed::class, 'allchanges_enabled', true); // Disable caching and locking by default Config::inst()->update('VersionFeed\Filters\CachedContentFilter', 'cache_enabled', false); @@ -72,7 +91,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Artifically set cache lock Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', false); - $cache = SS_Cache::factory('VersionFeed_Controller'); + $cache = SS_Cache::factory(VersionFeedController::class); $cache->setOption('automatic_serialization', true); $cache->save(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX); @@ -89,7 +108,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { $key = implode('_', array( 'changes', $page1->ID, - Versioned::get_versionnumber_by_stage('SiteTree', 'Live', $page1->ID, false) + Versioned::get_versionnumber_by_stage(SiteTree::class, 'Live', $page1->ID, false) )); $key = \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5($key); $cache->save(time() + 10, $key); @@ -195,7 +214,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'changes' action foreach(array(true, false) as $publicHistory_Config) { - Config::inst()->update('VersionFeed', 'changes_enabled', $publicHistory_Config); + Config::inst()->update(VersionFeed::class, 'changes_enabled', $publicHistory_Config); $expectedResponse = $publicHistory_Page && $publicHistory_Config ? 200 : 404; $response = $this->get($page->RelativeLink('changes')); $this->assertEquals($expectedResponse, $response->getStatusCode()); @@ -204,7 +223,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'allchanges' action on each page foreach(array(true, false) as $allChanges_Config) { foreach(array(true, false) as $allChanges_SiteConfig) { - Config::inst()->update('VersionFeed', 'allchanges_enabled', $allChanges_Config); + Config::inst()->update(VersionFeed::class, 'allchanges_enabled', $allChanges_Config); $siteConfig = SiteConfig::current_site_config(); $siteConfig->AllChangesEnabled = $allChanges_SiteConfig; $siteConfig->write(); diff --git a/tests/VersionFeedTest.php b/tests/VersionFeedTest.php index f782c6f..48cb591 100644 --- a/tests/VersionFeedTest.php +++ b/tests/VersionFeedTest.php @@ -1,11 +1,21 @@ array('VersionFeed'), - 'ContentController' => array('VersionFeed_Controller'), + 'SiteTree' => array(VersionFeed::class), + 'ContentController' => array(VersionFeedController::class), ); protected $illegalExtensions = array( From 17699f2b8aa043f2024a6b5df56513abfabdab86 Mon Sep 17 00:00:00 2001 From: Dylan Wagstaff Date: Mon, 11 Dec 2017 12:50:45 +1300 Subject: [PATCH 2/5] Update from SS_Cache to Symfony/Cache --- src/Filters/CachedContentFilter.php | 5 ++- src/Filters/ContentFilter.php | 13 +++---- src/Filters/RateLimitFilter.php | 8 ++-- src/VersionFeed.php | 4 +- src/VersionFeedController.php | 20 ++-------- tests/VersionFeedFunctionalTest.php | 57 +++++++++++++++-------------- tests/VersionFeedTest.php | 2 +- 7 files changed, 49 insertions(+), 60 deletions(-) diff --git a/src/Filters/CachedContentFilter.php b/src/Filters/CachedContentFilter.php index 73dc2a5..acfb21f 100644 --- a/src/Filters/CachedContentFilter.php +++ b/src/Filters/CachedContentFilter.php @@ -28,12 +28,13 @@ class CachedContentFilter extends ContentFilter { $cacheEnabled = Config::inst()->get(get_class(), 'cache_enabled'); $result = (isset($_GET['flush']) || !$cacheEnabled) ? null - : $cache->load($key); + : $cache->get($key); if($result) return $result; // Fallback to generate result $result = parent::getContent($key, $callback); - $cache->save($result, $key); + $lifetime = Config::inst()->get(ContentFilter::class, 'cache_lifetime') ?: null; + $cache->set($result, $key, $lifetime); return $result; } } diff --git a/src/Filters/ContentFilter.php b/src/Filters/ContentFilter.php index e2670f3..e43edda 100644 --- a/src/Filters/ContentFilter.php +++ b/src/Filters/ContentFilter.php @@ -6,7 +6,8 @@ use SS_Cache; use SilverStripe\VersionFeed\VersionFeedController; use SilverStripe\Core\Config\Config; - +use Psr\SimpleCache\CacheInterface; +use SilverStripe\Core\Injector\Injector; @@ -41,13 +42,9 @@ abstract class ContentFilter { * @return Zend_Cache_Frontend */ protected function getCache() { - $cache = \SS_Cache::factory(VersionFeedController::class); - $cache->setOption('automatic_serialization', true); - - // Map 0 to null for unlimited lifetime - $lifetime = Config::inst()->get(get_class($this), 'cache_lifetime') ?: null; - $cache->setLifetime($lifetime); - return $cache; + return Injector::inst()->get( + CacheInterface::class . '.' . VersionFeedController::class + ); } /** diff --git a/src/Filters/RateLimitFilter.php b/src/Filters/RateLimitFilter.php index d6a232b..c03be35 100644 --- a/src/Filters/RateLimitFilter.php +++ b/src/Filters/RateLimitFilter.php @@ -94,7 +94,7 @@ class RateLimitFilter extends ContentFilter { // Generate result with rate limiting enabled $limitKey = $this->getCacheKey($key); $cache = $this->getCache(); - if($lockedUntil = $cache->load($limitKey)) { + if($lockedUntil = $cache->get($limitKey)) { if(time() < $lockedUntil) { // Politely inform visitor of limit $response = new HTTPResponse_Exception('Too Many Requests.', 429); @@ -102,9 +102,11 @@ class RateLimitFilter extends ContentFilter { throw $response; } } + + $lifetime = Config::inst()->get(ContentFilter::class, 'cache_lifetime') ?: null; // Apply rate limit - $cache->save(time() + $timeout, $limitKey); + $cache->set(time() + $timeout, $limitKey, $lifetime); // Generate results $result = parent::getContent($key, $callback); @@ -112,7 +114,7 @@ class RateLimitFilter extends ContentFilter { // Reset rate limit with optional cooldown if($cooldown = Config::inst()->get(get_class(), 'lock_cooldown')) { // Set cooldown on successful query execution - $cache->save(time() + $cooldown, $limitKey); + $cache->set(time() + $cooldown, $limitKey, $lifetime); } else { // Without cooldown simply disable lock $cache->remove($limitKey); diff --git a/src/VersionFeed.php b/src/VersionFeed.php index a13989b..3c71eb1 100644 --- a/src/VersionFeed.php +++ b/src/VersionFeed.php @@ -121,7 +121,7 @@ class VersionFeed extends SiteTreeExtension { $changed = true; } - // Copy the link so it can be cached by SS_Cache. + // Copy the link so it can be cached. $version->GeneratedLink = $version->AbsoluteLink(); } @@ -142,7 +142,7 @@ class VersionFeed extends SiteTreeExtension { $first = clone($previous); $first->DiffContent = new HTMLText(); $first->DiffContent->setValue('
' . $first->Content . '
'); - // Copy the link so it can be cached by SS_Cache. + // Copy the link so it can be cached. $first->GeneratedLink = $first->AbsoluteLink(); $changeList->push($first); } diff --git a/src/VersionFeedController.php b/src/VersionFeedController.php index bd551ca..6b6a0b4 100644 --- a/src/VersionFeedController.php +++ b/src/VersionFeedController.php @@ -2,17 +2,6 @@ namespace SilverStripe\VersionFeed; - - - - - - - - - - - use SilverStripe\Core\Config\Config; use SilverStripe\VersionFeed\VersionFeed; use SilverStripe\Control\RSS\RSSFeed; @@ -25,8 +14,7 @@ use SilverStripe\Versioned\Versioned_Version; use SilverStripe\Core\Convert; use SilverStripe\View\Requirements; use SilverStripe\Core\Extension; - - +use SilverStripe\VersionFeed\Filters\ContentFilter; class VersionFeed_Controller extends Extension { @@ -38,16 +26,16 @@ class VersionFeed_Controller extends Extension { /** * Content handler * - * @var \VersionFeed\Filters\ContentFilter + * @var ContentFilter */ protected $contentFilter; /** * Sets the content filter * - * @param \VersionFeed\Filters\ContentFilter $contentFilter + * @param ContentFilter $contentFilter */ - public function setContentFilter(\VersionFeed\Filters\ContentFilter $contentFilter) { + public function setContentFilter(ContentFilter $contentFilter) { $this->contentFilter = $contentFilter; } diff --git a/tests/VersionFeedFunctionalTest.php b/tests/VersionFeedFunctionalTest.php index e53be6e..e9a7344 100644 --- a/tests/VersionFeedFunctionalTest.php +++ b/tests/VersionFeedFunctionalTest.php @@ -2,16 +2,14 @@ namespace SilverStripe\VersionFeed\Tests; - -use SS_Cache; -use Zend_Cache; - - use Page; use SilverStripe\VersionFeed\VersionFeed; +use SilverStripe\VersionFeed\Filters\CachedContentFilter; +use SilverStripe\VersionFeed\Filters\RateLimitFilter; use SilverStripe\VersionFeed\VersionFeedController; use SilverStripe\Core\Config\Config; +use SilverStripe\Core\Injector\Injector; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Versioned\Versioned; use SilverStripe\SiteConfig\SiteConfig; @@ -21,7 +19,7 @@ use SilverStripe\Dev\FunctionalTest; class VersionFeedFunctionalTest extends FunctionalTest { protected $usesDatabase = true; - protected $requiredExtensions = array( + protected $required_extensions = array( 'Page' => array(VersionFeed::class), 'Page_Controller' => array(VersionFeedController::class), ); @@ -31,8 +29,10 @@ class VersionFeedFunctionalTest extends FunctionalTest { public function setUp() { parent::setUp(); - $cache = SS_Cache::factory(VersionFeedController::class); - $cache->clean(Zend_Cache::CLEANING_MODE_ALL); + $cache = Injector::inst()->get( + CacheInterface::class . '.' . VersionFeedController::class + ); + $cache->clear(); $this->userIP = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : null; @@ -42,11 +42,11 @@ class VersionFeedFunctionalTest extends FunctionalTest { Config::inst()->update(VersionFeed::class, 'allchanges_enabled', true); // Disable caching and locking by default - Config::inst()->update('VersionFeed\Filters\CachedContentFilter', 'cache_enabled', false); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_timeout', 0); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_bypage', false); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', false); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_cooldown', false); + Config::inst()->update(CachedContentFilter::class, 'cache_enabled', false); + Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 0); + Config::inst()->update(RateLimitFilter::class, 'lock_bypage', false); + Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); + Config::inst()->update(RateLimitFilter::class, 'lock_cooldown', false); } public function tearDown() { @@ -83,17 +83,18 @@ class VersionFeedFunctionalTest extends FunctionalTest { public function testRateLimiting() { // Re-enable locking just for this test - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_timeout', 20); - Config::inst()->update('VersionFeed\Filters\CachedContentFilter', 'cache_enabled', true); + Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 20); + Config::inst()->update(CachedContentFilter::class, 'cache_enabled', true); $page1 = $this->createPageWithChanges(array('PublicHistory' => true, 'Title' => 'Page1')); $page2 = $this->createPageWithChanges(array('PublicHistory' => true, 'Title' => 'Page2')); // Artifically set cache lock - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', false); - $cache = SS_Cache::factory(VersionFeedController::class); - $cache->setOption('automatic_serialization', true); - $cache->save(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX); + Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); + $cache = Injector::inst()->get( + CacheInterface::class . '.' . VersionFeedController::class + ); + $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX); // Test normal hit $response = $this->get($page1->RelativeLink('changes')); @@ -104,39 +105,39 @@ class VersionFeedFunctionalTest extends FunctionalTest { $this->assertGreaterThan(0, $response->getHeader('Retry-After')); // Test page specific lock - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_bypage', true); + Config::inst()->update(RateLimitFilter::class, 'lock_bypage', true); $key = implode('_', array( 'changes', $page1->ID, Versioned::get_versionnumber_by_stage(SiteTree::class, 'Live', $page1->ID, false) )); $key = \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5($key); - $cache->save(time() + 10, $key); + $cache->set(time() + 10, $key); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(429, $response->getStatusCode()); $this->assertGreaterThan(0, $response->getHeader('Retry-After')); $response = $this->get($page2->RelativeLink('changes')); $this->assertEquals(200, $response->getStatusCode()); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_bypage', false); + Config::inst()->update(RateLimitFilter::class, 'lock_bypage', false); // Test rate limit hit by IP - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', true); + Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', true); $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.1'; - $cache->save(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); + $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(429, $response->getStatusCode()); $this->assertGreaterThan(0, $response->getHeader('Retry-After')); // Test rate limit doesn't hit other IP $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.20'; - $cache->save(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); + $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(200, $response->getStatusCode()); // Restore setting - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', false); - Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_timeout', 0); - Config::inst()->update('VersionFeed\Filters\CachedContentFilter', 'cache_enabled', false); + Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); + Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 0); + Config::inst()->update(CachedContentFilter::class, 'cache_enabled', false); } public function testContainsChangesForPageOnly() { diff --git a/tests/VersionFeedTest.php b/tests/VersionFeedTest.php index 48cb591..ef45d19 100644 --- a/tests/VersionFeedTest.php +++ b/tests/VersionFeedTest.php @@ -13,7 +13,7 @@ class VersionFeedTest extends SapphireTest { protected $usesDatabase = true; - protected $requiredExtensions = array( + protected $required_extensions = array( 'SiteTree' => array(VersionFeed::class), 'ContentController' => array(VersionFeedController::class), ); From 229463547d2eb1d6999dc7bce60d566717711d94 Mon Sep 17 00:00:00 2001 From: Dylan Wagstaff Date: Mon, 11 Dec 2017 17:20:00 +1300 Subject: [PATCH 3/5] Edit updated things until the tests pass --- _config/versionfeed.yml | 24 +++++---- docs/en/developer.md | 2 +- src/Filters/CachedContentFilter.php | 2 +- src/Filters/ContentFilter.php | 8 +-- src/Filters/RateLimitFilter.php | 14 +++--- src/VersionFeed.php | 20 ++------ src/VersionFeedController.php | 2 +- tests/VersionFeedFunctionalTest.php | 77 +++++++++++++++-------------- tests/VersionFeedTest.php | 18 ++++--- 9 files changed, 84 insertions(+), 83 deletions(-) diff --git a/_config/versionfeed.yml b/_config/versionfeed.yml index d775357..66932c4 100644 --- a/_config/versionfeed.yml +++ b/_config/versionfeed.yml @@ -1,21 +1,25 @@ --- Name: versionedfeedconfig --- -Injector: - RateLimitFilter: \VersionFeed\Filters\RateLimitFilter +SilverStripe\Core\Injector\Injector: + RateLimitFilter: SilverStripe\VersionFeed\Filters\RateLimitFilter ContentFilter: - class: \VersionFeed\Filters\CachedContentFilter + class: SilverStripe\VersionFeed\Filters\CachedContentFilter constructor: - %$RateLimitFilter -SiteTree: + Psr\SimpleCache\CacheInterface.VersionFeedController: + factory: SilverStripe\Core\Cache\CacheFactory + constructor: + namespace: 'VersionFeedController' +SilverStripe\CMS\Model\SiteTree: extensions: - - VersionFeed -SiteConfig: + - SilverStripe\VersionFeed\VersionFeed +SilverStripe\SiteConfig\SiteConfig: extensions: - - VersionFeedSiteConfig -ContentController: + - SilverStripe\VersionFeed\VersionFeedSiteConfig +SilverStripe\CMS\Controllers\ContentController: extensions: - - VersionFeed_Controller -VersionFeed_Controller: + - SilverStripe\VersionFeed\VersionFeedController +SilverStripe\VersionFeed\VersionFeedController: dependencies: ContentFilter: %$ContentFilter diff --git a/docs/en/developer.md b/docs/en/developer.md index 645b41b..0203089 100644 --- a/docs/en/developer.md +++ b/docs/en/developer.md @@ -42,7 +42,7 @@ Two filters are applied on top of one another: server. This filter will only be applied if the `CachedContentFilter` does not have any cached record for a request. -Either one of these can be replaced, added to, or removed, by adjusting the `VersionFeed_Controller.dependencies` +Either one of these can be replaced, added to, or removed, by adjusting the `SilverStripe\VersionFeed\VersionFeedController.dependencies` config to point to a replacement (or no) filter. For smaller servers where it's reasonable to apply a strict approach to rate limiting the default diff --git a/src/Filters/CachedContentFilter.php b/src/Filters/CachedContentFilter.php index acfb21f..dc9d0af 100644 --- a/src/Filters/CachedContentFilter.php +++ b/src/Filters/CachedContentFilter.php @@ -34,7 +34,7 @@ class CachedContentFilter extends ContentFilter { // Fallback to generate result $result = parent::getContent($key, $callback); $lifetime = Config::inst()->get(ContentFilter::class, 'cache_lifetime') ?: null; - $cache->set($result, $key, $lifetime); + $cache->set($key, $result, $lifetime); return $result; } } diff --git a/src/Filters/ContentFilter.php b/src/Filters/ContentFilter.php index e43edda..e2339bd 100644 --- a/src/Filters/ContentFilter.php +++ b/src/Filters/ContentFilter.php @@ -2,10 +2,8 @@ namespace SilverStripe\VersionFeed\Filters; -use SS_Cache; - use SilverStripe\VersionFeed\VersionFeedController; -use SilverStripe\Core\Config\Config; +use SilverStripe\Core\Config\Configurable; use Psr\SimpleCache\CacheInterface; use SilverStripe\Core\Injector\Injector; @@ -16,6 +14,8 @@ use SilverStripe\Core\Injector\Injector; * of its execution. */ abstract class ContentFilter { + + use configurable; /** * Nested content filter @@ -43,7 +43,7 @@ abstract class ContentFilter { */ protected function getCache() { return Injector::inst()->get( - CacheInterface::class . '.' . VersionFeedController::class + CacheInterface::class . '.VersionFeedController' ); } diff --git a/src/Filters/RateLimitFilter.php b/src/Filters/RateLimitFilter.php index c03be35..8b2c536 100644 --- a/src/Filters/RateLimitFilter.php +++ b/src/Filters/RateLimitFilter.php @@ -70,12 +70,12 @@ class RateLimitFilter extends ContentFilter { $key = self::CACHE_PREFIX; // Add global identifier - if(Config::inst()->get(get_class(), 'lock_bypage')) { + if($this->config()->get('lock_bypage')) { $key .= '_' . md5($itemkey); } // Add user-specific identifier - if(Config::inst()->get(get_class(), 'lock_byuserip') && Controller::has_curr()) { + if($this->config()->get('lock_byuserip') && Controller::has_curr()) { $ip = Controller::curr()->getRequest()->getIP(); $key .= '_' . md5($ip); } @@ -86,7 +86,7 @@ class RateLimitFilter extends ContentFilter { public function getContent($key, $callback) { // Bypass rate limiting if flushing, or timeout isn't set - $timeout = Config::inst()->get(get_class(), 'lock_timeout'); + $timeout = $this->config()->get('lock_timeout'); if(isset($_GET['flush']) || !$timeout) { return parent::getContent($key, $callback); } @@ -106,18 +106,18 @@ class RateLimitFilter extends ContentFilter { $lifetime = Config::inst()->get(ContentFilter::class, 'cache_lifetime') ?: null; // Apply rate limit - $cache->set(time() + $timeout, $limitKey, $lifetime); + $cache->set($limitKey, time() + $timeout, $lifetime); // Generate results $result = parent::getContent($key, $callback); // Reset rate limit with optional cooldown - if($cooldown = Config::inst()->get(get_class(), 'lock_cooldown')) { + if($cooldown = $this->config()->get('lock_cooldown')) { // Set cooldown on successful query execution - $cache->set(time() + $cooldown, $limitKey, $lifetime); + $cache->set($limitKey, time() + $cooldown, $lifetime); } else { // Without cooldown simply disable lock - $cache->remove($limitKey); + $cache->delete($limitKey); } return $result; } diff --git a/src/VersionFeed.php b/src/VersionFeed.php index 3c71eb1..2ad0c46 100644 --- a/src/VersionFeed.php +++ b/src/VersionFeed.php @@ -2,16 +2,8 @@ namespace SilverStripe\VersionFeed; - - -use Diff; -use HTMLText; - - - - - - +use SilverStripe\ORM\FieldType\DBField; +use SilverStripe\View\Parsers\Diff; use SilverStripe\ORM\ArrayList; use SilverStripe\Forms\FieldList; use SilverStripe\Core\Config\Config; @@ -21,8 +13,6 @@ use SilverStripe\Forms\LiteralField; use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\CMS\Model\SiteTreeExtension; - - class VersionFeed extends SiteTreeExtension { private static $db = array( @@ -103,7 +93,7 @@ class VersionFeed extends SiteTreeExtension { if ($version->Title != $previous->Title) { $diffTitle = Diff::compareHTML($version->Title, $previous->Title); - $version->DiffTitle = new HTMLText(); + $version->DiffTitle = DBField::create_field('HTMLText', null); $version->DiffTitle->setValue( sprintf( '
%s ' . $diffTitle . '
', @@ -116,7 +106,7 @@ class VersionFeed extends SiteTreeExtension { if ($version->Content != $previous->Content) { $diffContent = Diff::compareHTML($version->Content, $previous->Content); - $version->DiffContent = new HTMLText(); + $version->DiffContent = DBField::create_field('HTMLText', null); $version->DiffContent->setValue('
'.$diffContent.'
'); $changed = true; } @@ -140,7 +130,7 @@ class VersionFeed extends SiteTreeExtension { // a diff on the initial version we will just get that version, verbatim. if ($previous && $versions->count()<$qLimit) { $first = clone($previous); - $first->DiffContent = new HTMLText(); + $first->DiffContent = DBField::create_field('HTMLText', null); $first->DiffContent->setValue('
' . $first->Content . '
'); // Copy the link so it can be cached. $first->GeneratedLink = $first->AbsoluteLink(); diff --git a/src/VersionFeedController.php b/src/VersionFeedController.php index 6b6a0b4..55c92f8 100644 --- a/src/VersionFeedController.php +++ b/src/VersionFeedController.php @@ -16,7 +16,7 @@ use SilverStripe\View\Requirements; use SilverStripe\Core\Extension; use SilverStripe\VersionFeed\Filters\ContentFilter; -class VersionFeed_Controller extends Extension { +class VersionFeedController extends Extension { private static $allowed_actions = array( 'changes', diff --git a/tests/VersionFeedFunctionalTest.php b/tests/VersionFeedFunctionalTest.php index e9a7344..bbbeed3 100644 --- a/tests/VersionFeedFunctionalTest.php +++ b/tests/VersionFeedFunctionalTest.php @@ -14,45 +14,50 @@ use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Versioned\Versioned; use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\Dev\FunctionalTest; +use SilverStripe\Control\Director; +use Psr\SimpleCache\CacheInterface; class VersionFeedFunctionalTest extends FunctionalTest { - protected $usesDatabase = true; + protected $usesDatabase = true; + + protected $baseURI = 'http://www.fakesite.test'; - protected $required_extensions = array( + protected static $required_extensions = array( 'Page' => array(VersionFeed::class), - 'Page_Controller' => array(VersionFeedController::class), + 'PageController' => array(VersionFeedController::class), ); protected $userIP; - public function setUp() { + protected function setUp() { + Director::config()->set('alternate_base_url', $this->baseURI); + parent::setUp(); $cache = Injector::inst()->get( - CacheInterface::class . '.' . VersionFeedController::class + CacheInterface::class . '.VersionFeedController' ); $cache->clear(); - $this->userIP = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : null; + $this->userIP = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; - Config::nest(); // Enable history by default - Config::inst()->update(VersionFeed::class, 'changes_enabled', true); - Config::inst()->update(VersionFeed::class, 'allchanges_enabled', true); + Config::modify()->set(VersionFeed::class, 'changes_enabled', true); + Config::modify()->set(VersionFeed::class, 'allchanges_enabled', true); // Disable caching and locking by default - Config::inst()->update(CachedContentFilter::class, 'cache_enabled', false); - Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 0); - Config::inst()->update(RateLimitFilter::class, 'lock_bypage', false); - Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); - Config::inst()->update(RateLimitFilter::class, 'lock_cooldown', false); + Config::modify()->set(CachedContentFilter::class, 'cache_enabled', false); + Config::modify()->set(RateLimitFilter::class, 'lock_timeout', 0); + Config::modify()->set(RateLimitFilter::class, 'lock_bypage', false); + Config::modify()->set(RateLimitFilter::class, 'lock_byuserip', false); + Config::modify()->set(RateLimitFilter::class, 'lock_cooldown', false); } public function tearDown() { - Config::unnest(); - - $_SERVER['HTTP_CLIENT_IP'] = $this->userIP; + Director::config()->set('alternate_base_url', null); + + $_SERVER['REMOTE_ADDR'] = $this->userIP; parent::tearDown(); } @@ -83,18 +88,18 @@ class VersionFeedFunctionalTest extends FunctionalTest { public function testRateLimiting() { // Re-enable locking just for this test - Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 20); - Config::inst()->update(CachedContentFilter::class, 'cache_enabled', true); + Config::modify()->set(RateLimitFilter::class, 'lock_timeout', 20); + Config::modify()->set(CachedContentFilter::class, 'cache_enabled', true); $page1 = $this->createPageWithChanges(array('PublicHistory' => true, 'Title' => 'Page1')); $page2 = $this->createPageWithChanges(array('PublicHistory' => true, 'Title' => 'Page2')); // Artifically set cache lock - Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); + Config::modify()->set(RateLimitFilter::class, 'lock_byuserip', false); $cache = Injector::inst()->get( - CacheInterface::class . '.' . VersionFeedController::class + CacheInterface::class . '.VersionFeedController' ); - $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX); + $cache->set(RateLimitFilter::CACHE_PREFIX, time() + 10); // Test normal hit $response = $this->get($page1->RelativeLink('changes')); @@ -105,39 +110,39 @@ class VersionFeedFunctionalTest extends FunctionalTest { $this->assertGreaterThan(0, $response->getHeader('Retry-After')); // Test page specific lock - Config::inst()->update(RateLimitFilter::class, 'lock_bypage', true); + Config::modify()->set(RateLimitFilter::class, 'lock_bypage', true); $key = implode('_', array( 'changes', $page1->ID, Versioned::get_versionnumber_by_stage(SiteTree::class, 'Live', $page1->ID, false) )); - $key = \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5($key); - $cache->set(time() + 10, $key); + $key = RateLimitFilter::CACHE_PREFIX . '_' . md5($key); + $cache->set($key, time() + 10); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(429, $response->getStatusCode()); $this->assertGreaterThan(0, $response->getHeader('Retry-After')); $response = $this->get($page2->RelativeLink('changes')); $this->assertEquals(200, $response->getStatusCode()); - Config::inst()->update(RateLimitFilter::class, 'lock_bypage', false); + Config::modify()->set(RateLimitFilter::class, 'lock_bypage', false); // Test rate limit hit by IP - Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', true); - $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.1'; - $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); + Config::modify()->set(RateLimitFilter::class, 'lock_byuserip', true); + $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; + $cache->set(RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1'), time() + 10); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(429, $response->getStatusCode()); $this->assertGreaterThan(0, $response->getHeader('Retry-After')); // Test rate limit doesn't hit other IP - $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.20'; - $cache->set(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1')); + $_SERVER['REMOTE_ADDR'] = '127.0.0.20'; + $cache->set(RateLimitFilter::CACHE_PREFIX . '_' . md5('127.0.0.1'), time() + 10); $response = $this->get($page1->RelativeLink('changes')); $this->assertEquals(200, $response->getStatusCode()); // Restore setting - Config::inst()->update(RateLimitFilter::class, 'lock_byuserip', false); - Config::inst()->update(RateLimitFilter::class, 'lock_timeout', 0); - Config::inst()->update(CachedContentFilter::class, 'cache_enabled', false); + Config::modify()->set(RateLimitFilter::class, 'lock_byuserip', false); + Config::modify()->set(RateLimitFilter::class, 'lock_timeout', 0); + Config::modify()->set(CachedContentFilter::class, 'cache_enabled', false); } public function testContainsChangesForPageOnly() { @@ -215,7 +220,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'changes' action foreach(array(true, false) as $publicHistory_Config) { - Config::inst()->update(VersionFeed::class, 'changes_enabled', $publicHistory_Config); + Config::modify()->set(VersionFeed::class, 'changes_enabled', $publicHistory_Config); $expectedResponse = $publicHistory_Page && $publicHistory_Config ? 200 : 404; $response = $this->get($page->RelativeLink('changes')); $this->assertEquals($expectedResponse, $response->getStatusCode()); @@ -224,7 +229,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'allchanges' action on each page foreach(array(true, false) as $allChanges_Config) { foreach(array(true, false) as $allChanges_SiteConfig) { - Config::inst()->update(VersionFeed::class, 'allchanges_enabled', $allChanges_Config); + Config::modify()->set(VersionFeed::class, 'allchanges_enabled', $allChanges_Config); $siteConfig = SiteConfig::current_site_config(); $siteConfig->AllChangesEnabled = $allChanges_SiteConfig; $siteConfig->write(); diff --git a/tests/VersionFeedTest.php b/tests/VersionFeedTest.php index ef45d19..0384456 100644 --- a/tests/VersionFeedTest.php +++ b/tests/VersionFeedTest.php @@ -7,20 +7,22 @@ use Page; use SilverStripe\VersionFeed\VersionFeed; use SilverStripe\VersionFeed\VersionFeedController; use SilverStripe\Dev\SapphireTest; +use SilverStripe\CMS\Model\SiteTree; +use SilverStripe\CMS\Controllers\ContentController; class VersionFeedTest extends SapphireTest { protected $usesDatabase = true; - protected $required_extensions = array( - 'SiteTree' => array(VersionFeed::class), - 'ContentController' => array(VersionFeedController::class), - ); + protected static $required_extensions = [ + SiteTree::class => [VersionFeed::class], + ContentController::class => [VersionFeedController::class], + ]; - protected $illegalExtensions = array( - 'SiteTree' => array('Translatable') - ); + protected $illegalExtensions = [ + 'SiteTree' => ['Translatable'] + ]; public function testDiffedChangesExcludesRestrictedItems() { $this->markTestIncomplete(); @@ -31,7 +33,7 @@ class VersionFeedTest extends SapphireTest { } public function testDiffedChangesTitle() { - $page = new Page(array('Title' => 'My Title')); + $page = new Page(['Title' => 'My Title']); $page->write(); $page->publish('Stage', 'Live'); From fe2b6597b389f9f97b7a8cf39a732c3df0fdd2f1 Mon Sep 17 00:00:00 2001 From: Dylan Wagstaff Date: Tue, 12 Dec 2017 09:43:12 +1300 Subject: [PATCH 4/5] FIX update CI setting files --- .scrutinizer.yml | 8 +++++++- .travis.yml | 45 +++++++++++++++++++++++---------------------- changelog.md | 29 ----------------------------- codecov.yml | 1 + license.md | 2 +- phpcs.xml.dist | 9 +++++++++ phpunit.xml.dist | 13 +++++++++++++ 7 files changed, 54 insertions(+), 53 deletions(-) delete mode 100644 changelog.md create mode 100644 codecov.yml create mode 100644 phpcs.xml.dist create mode 100644 phpunit.xml.dist diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 61b0c9f..1707b92 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,9 +1,15 @@ inherit: true +build: + nodes: + analysis: + tests: + override: [php-scrutinizer-run] + checks: php: code_rating: true duplication: true filter: - paths: [code/*, tests/*] + paths: [src/*, tests/*] \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 85a08d1..0af9272 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,34 +1,35 @@ -# See https://github.com/silverstripe/silverstripe-travis-support for setup details - -sudo: false - language: php -php: - - 5.3 - - 5.4 - - 5.5 - env: - - DB=MYSQL CORE_RELEASE=3.5 + global: + - COMPOSER_ROOT_VERSION=2.0.x-dev matrix: include: - php: 5.6 - env: DB=MYSQL CORE_RELEASE=3 - - php: 5.6 - env: DB=MYSQL CORE_RELEASE=3.1 - - php: 5.6 - env: DB=PGSQL CORE_RELEASE=3.2 + env: DB=MYSQL PHPCS_TEST=1 PHPUNIT_TEST=1 + - php: 7.0 + env: DB=MYSQL PHPUNIT_TEST=1 - php: 7.1 - env: DB=MYSQL CORE_RELEASE=3.6 + env: DB=PGSQL PHPUNIT_COVERAGE_TEST=1 + - php: 7.2 + env: DB=MYSQL PHPUNIT_TEST=1 before_script: - - composer self-update || true - - git clone git://github.com/silverstripe/silverstripe-travis-support.git ~/travis-support - - php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss - - cd ~/builds/ss - - composer install + # Init PHP + - phpenv rehash + - phpenv config-rm xdebug.ini + + # Install composer dependencies + - composer validate + - composer require --no-update silverstripe/recipe-core:1.0.x-dev + - if [[ $DB == PGSQL ]]; then composer require --no-update silverstripe/postgresql 2.0.x-dev; fi + - composer install --prefer-dist --no-interaction --no-progress --no-suggest --optimize-autoloader --verbose --profile script: - - vendor/bin/phpunit versionfeed/tests + - if [[ $PHPUNIT_TEST ]]; then vendor/bin/phpunit; fi + - if [[ $PHPUNIT_COVERAGE_TEST ]]; then phpdbg -qrr vendor/bin/phpunit --coverage-clover=coverage.xml; fi + - if [[ $PHPCS_TEST ]]; then vendor/bin/phpcs src/ tests/; fi + +after_success: + - if [[ $PHPUNIT_COVERAGE_TEST ]]; then bash <(curl -s https://codecov.io/bash) -f coverage.xml; fi \ No newline at end of file diff --git a/changelog.md b/changelog.md deleted file mode 100644 index 059f45d..0000000 --- a/changelog.md +++ /dev/null @@ -1,29 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -This project adheres to [Semantic Versioning](http://semver.org/). - -## [1.2.2] - -* Consistent sorting for getDiffList() - -## [1.2.1] - -* Updated userguide documentation -* Added standard Scrutinizer config -* Added standard code of conduct -* Added standard gitattributes -* Added standard editor config -* Added standard license -* Added standard Travis config -* Updated license year -* Updated translations - -## [1.2.0] - -* Changelog added. -* Added Scrutinizer support -* Add `ContentFilter.cache_lifetime` config to set the cache lifetime. -* Update alternate xml link tag to be W3 compliant -* Added CWP keyword diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..69cb760 --- /dev/null +++ b/codecov.yml @@ -0,0 +1 @@ +comment: false diff --git a/license.md b/license.md index 9445c8e..8794670 100644 --- a/license.md +++ b/license.md @@ -1,4 +1,4 @@ -Copyright (c) 2016, SilverStripe Limited +Copyright (c) 2017, SilverStripe Limited All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..fdf26a6 --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,9 @@ + + + CodeSniffer ruleset for SilverStripe coding conventions. + + + + + + \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..004ca3a --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,13 @@ + + + tests/ + + + + src/ + + tests/ + + + + \ No newline at end of file From 23f2f45705fd0aeed09d6a429ad35fb02f1f7009 Mon Sep 17 00:00:00 2001 From: Dylan Wagstaff Date: Tue, 12 Dec 2017 10:31:47 +1300 Subject: [PATCH 5/5] FIX Capitalisation of trait usage --- src/Filters/ContentFilter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Filters/ContentFilter.php b/src/Filters/ContentFilter.php index e2339bd..0bda97d 100644 --- a/src/Filters/ContentFilter.php +++ b/src/Filters/ContentFilter.php @@ -15,7 +15,7 @@ use SilverStripe\Core\Injector\Injector; */ abstract class ContentFilter { - use configurable; + use Configurable; /** * Nested content filter