summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorMaurice Svay <maurice@svay.com>2012-08-07 05:40:38 -0700
committerMaurice Svay <maurice@svay.com>2012-08-07 05:40:38 -0700
commit95b878f51f45b37e5b684c490776d778653f179b (patch)
treec06bbcaf2c7840c009e0b742f180583b7417c784 /app
parentdb48a9346007e565aa45317ad23450962de2e0ff (diff)
parent1af18af0150f51215f20cb3cd4c51c36e86145cd (diff)
downloadplanet-95b878f51f45b37e5b684c490776d778653f179b.tar
planet-95b878f51f45b37e5b684c490776d778653f179b.tar.gz
planet-95b878f51f45b37e5b684c490776d778653f179b.tar.bz2
planet-95b878f51f45b37e5b684c490776d778653f179b.tar.xz
planet-95b878f51f45b37e5b684c490776d778653f179b.zip
Merge pull request #50 from rdalverny/filter_by_tag
Option to show only posts that have a specific tag or category.
Diffstat (limited to 'app')
-rw-r--r--app/classes/Planet.class.php41
-rw-r--r--app/classes/PlanetConfig.php17
-rw-r--r--app/lib/testmore.php343
3 files changed, 401 insertions, 0 deletions
diff --git a/app/classes/Planet.class.php b/app/classes/Planet.class.php
index 4dcfbba..81a71fe 100644
--- a/app/classes/Planet.class.php
+++ b/app/classes/Planet.class.php
@@ -58,6 +58,10 @@ class Planet
*/
public function getItems()
{
+ $this->items = $this->_filterItemsByCategory(
+ $this->items,
+ $this->config->getCategories());
+
return $this->items;
}
@@ -152,4 +156,41 @@ class Planet
{
usort($this->items, array('PlanetItem','compare'));
}
+
+ /**
+ * Filter out items that do not match at least one
+ * of the defined categories.
+ *
+ * If there's no category, return all items.
+ *
+ * @param array $items to filter
+ * @param string $categories to filter against; may be a single word
+ * or a comma-separated list of words.
+ *
+ * @return array resulting list of items
+ */
+ public function _filterItemsByCategory($items, $categories = null)
+ {
+ $categories = trim($categories);
+
+ if (empty($categories))
+ return $items;
+
+ $categories = array_map('trim', explode(',', strtolower($categories)));
+ $cb_category_filter =
+ function ($item) use ($categories)
+ {
+ if (!is_array($item_categories = $item->get_categories()))
+ return false;
+
+ $item_categories = array_map(
+ function ($i) { return strtolower($i->get_label()); },
+ $item_categories
+ );
+
+ return array_intersect($categories, $item_categories);
+ };
+
+ return array_values(array_filter($items, $cb_category_filter));
+ }
}
diff --git a/app/classes/PlanetConfig.php b/app/classes/PlanetConfig.php
index a31938e..709bc2e 100644
--- a/app/classes/PlanetConfig.php
+++ b/app/classes/PlanetConfig.php
@@ -81,8 +81,25 @@ class PlanetConfig
return $this->conf['postmaxlength'];
}
+ public function getCategories()
+ {
+ return $this->conf['categories'];
+ }
+
public function toYaml()
{
return Spyc::YAMLDump($this->conf,4);
}
+
+ /**
+ * Generic accessor for config.
+ */
+ public function __get($key)
+ {
+ $key = strtolower($key);
+
+ return array_key_exists($key, $this->conf) ?
+ $this->conf[$key] :
+ null;
+ }
}
diff --git a/app/lib/testmore.php b/app/lib/testmore.php
new file mode 100644
index 0000000..aa06161
--- /dev/null
+++ b/app/lib/testmore.php
@@ -0,0 +1,343 @@
+<?php
+
+/*******************************************************************\
+* PROJECT INFORMATION *
+* *
+* Project: Apache-Test *
+* URL: http://perl.apache.org/Apache-Test/ *
+* Notice: Copyright (c) 2006 The Apache Software Foundation *
+* *
+*********************************************************************
+* LICENSE INFORMATION *
+* *
+* Licensed under the Apache License, Version 2.0 (the "License"); *
+* you may not use this file except in compliance with the *
+* License. You may obtain a copy of the License at: *
+* *
+* http://www.apache.org/licenses/LICENSE-2.0 *
+* *
+* Unless required by applicable law or agreed to in writing, *
+* software distributed under the License is distributed on an "AS *
+* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either *
+* express or implied. See the License for the specific language *
+* governing permissions and limitations under the License. *
+* *
+*********************************************************************
+* MODULE INFORMATION *
+* *
+* This is a PHP implementation of Test::More: *
+* *
+* http://search.cpan.org/dist/Test-Simple/lib/Test/More.pm *
+* *
+*********************************************************************
+* CREDITS *
+* *
+* Originally inspired by work from Andy Lester. Written and *
+* maintained by Chris Shiflett. For contact information, see: *
+* *
+* http://shiflett.org/contact *
+* *
+\*******************************************************************/
+
+header('Content-Type: text/plain');
+register_shutdown_function('_test_end');
+
+$_no_plan = FALSE;
+$_num_failures = 0;
+$_num_skips = 0;
+$_test_num = 0;
+
+function plan($plan)
+{
+ /*
+ plan('no_plan');
+ plan('skip_all');
+ plan(array('skip_all' => 'My reason is...'));
+ plan(23);
+ */
+
+ global $_no_plan;
+ global $_skip_all;
+
+ switch ($plan) {
+ case 'no_plan':
+ $_no_plan = TRUE;
+ break;
+
+ case 'skip_all':
+ echo "1..0\n";
+ break;
+
+ default:
+ if (is_array($plan)) {
+ echo "1..0 # Skip {$plan['skip_all']}\n";
+ exit;
+ }
+
+ echo "1..$plan\n";
+ break;
+ }
+}
+
+function ok($pass, $test_name = '')
+{
+ global $_test_num;
+ global $_num_failures;
+ global $_num_skips;
+
+ $_test_num++;
+
+ if ($_num_skips) {
+ $_num_skips--;
+ return TRUE;
+ }
+
+ if (!empty($test_name) && $test_name[0] != '#') {
+ $test_name = "- $test_name";
+ }
+
+ if ($pass) {
+ echo "ok $_test_num $test_name\n";
+ } else {
+ echo "not ok $_test_num $test_name\n";
+
+ $_num_failures++;
+ $caller = debug_backtrace();
+
+ if (strstr($caller['0']['file'], $_SERVER['PHP_SELF'])) {
+ $file = $caller['0']['file'];
+ $line = $caller['0']['line'];
+ } else {
+ $file = $caller['1']['file'];
+ $line = $caller['1']['line'];
+ }
+
+ if (isset($_SERVER['SERVER_ROOT'])){
+ $file = str_replace($_SERVER['SERVER_ROOT'], 't', $file);
+ }
+
+ diag(" Failed test ($file at line $line)");
+ }
+
+ return $pass;
+}
+
+function is($this, $that, $test_name = '')
+{
+ $pass = ($this == $that);
+
+ ok($pass, $test_name);
+
+ if (!$pass) {
+ diag(" got: '$this'");
+ diag(" expected: '$that'");
+ }
+
+ return $pass;
+}
+
+function isnt($this, $that, $test_name = '')
+{
+ $pass = ($this != $that);
+
+ ok($pass, $test_name);
+
+ if (!$pass) {
+ diag(" '$this'");
+ diag(' !=');
+ diag(" '$that'");
+ }
+
+ return $pass;
+}
+
+function like($string, $pattern, $test_name = '')
+{
+ $pass = preg_match($pattern, $string);
+
+ ok($pass, $test_name);
+
+ if (!$pass) {
+ diag(" '$string'");
+ diag(" doesn't match '$pattern'");
+ }
+
+ return $pass;
+}
+
+function unlike($string, $pattern, $test_name = '')
+{
+ $pass = !preg_match($pattern, $string);
+
+ ok($pass, $test_name);
+
+ if (!$pass) {
+ diag(" '$string'");
+ diag(" matches '$pattern'");
+ }
+
+ return $pass;
+}
+
+function cmp_ok($this, $operator, $that, $test_name = '')
+{
+ eval("\$pass = (\$this $operator \$that);");
+
+ ob_start();
+ var_dump($this);
+ $_this = trim(ob_get_clean());
+
+ ob_start();
+ var_dump($that);
+ $_that = trim(ob_get_clean());
+
+ ok($pass, $test_name);
+
+ if (!$pass) {
+ diag(" got: $_this");
+ diag(" expected: $_that");
+ }
+
+ return $pass;
+}
+
+function can_ok($object, $methods)
+{
+ $pass = TRUE;
+ $errors = array();
+
+ foreach ($methods as $method) {
+ if (!method_exists($object, $method)) {
+ $pass = FALSE;
+ $errors[] = " method_exists(\$object, $method) failed";
+ }
+ }
+
+ if ($pass) {
+ ok(TRUE, "method_exists(\$object, ...)");
+ } else {
+ ok(FALSE, "method_exists(\$object, ...)");
+ diag($errors);
+ }
+
+ return $pass;
+}
+
+function isa_ok($object, $expected_class, $object_name = 'The object')
+{
+ $got_class = get_class($object);
+
+ if (version_compare(phpversion(), '5', '>=')) {
+ $pass = ($got_class == $expected_class);
+ } else {
+ $pass = ($got_class == strtolower($expected_class));
+ }
+
+ if ($pass) {
+ ok(TRUE, "$object_name isa $expected_class");
+ } else {
+ ok(FALSE, "$object_name isn't a '$expected_class' it's a '$got_class'");
+ }
+
+ return $pass;
+}
+
+function pass($test_name = '')
+{
+ return ok(TRUE, $test_name);
+}
+
+function fail($test_name = '')
+{
+ return ok(FALSE, $test_name);
+}
+
+function diag($message)
+{
+ if (is_array($message)) {
+ foreach($message as $current) {
+ echo "# $current\n";
+ }
+ } else {
+ echo "# $message\n";
+ }
+}
+
+function include_ok($module)
+{
+ $pass = ((include $module) == 1);
+ return ok($pass);
+}
+
+function require_ok($module)
+{
+ $pass = ((require $module) == 1);
+ return ok($pass);
+}
+
+function skip($message, $num)
+{
+ global $_num_skips;
+
+ if ($num < 0) {
+ $num = 0;
+ }
+
+ for ($i = 0; $i < $num; $i++) {
+ pass("# SKIP $message");
+ }
+
+ $_num_skips = $num;
+}
+
+function is_deeply($got_struct, $expected_struct, $test_name = '')
+{
+ $got_flat = var_export($got_struct, true);
+ $expected_flat = var_export($expected_struct, true);
+
+ is($got_flat, $expected_flat, $test_name);
+}
+
+
+/*
+
+TODO:
+
+function todo()
+{
+}
+
+function todo_skip()
+{
+}
+
+function eq_array()
+{
+}
+
+function eq_hash()
+{
+}
+
+function eq_set()
+{
+}
+
+*/
+
+function _test_end()
+{
+ global $_no_plan;
+ global $_num_failures;
+ global $_test_num;
+
+ if ($_no_plan) {
+ echo "1..$_test_num\n";
+ }
+
+ if ($_num_failures) {
+ diag("Looks like you failed $_num_failures tests of $_test_num.");
+ }
+}
+
+?>