initial commit

This commit is contained in:
2023-12-24 09:27:07 -06:00
commit b1ed7ee6c9
8 changed files with 604 additions and 0 deletions

56
Gruntfile.js Normal file
View File

@@ -0,0 +1,56 @@
module.exports = function( grunt ) {
'use strict';
// Project configuration
grunt.initConfig( {
pkg: grunt.file.readJSON( 'package.json' ),
addtextdomain: {
options: {
textdomain: 'test-plugin',
},
update_all_domains: {
options: {
updateDomains: true
},
src: [ '*.php', '**/*.php', '!\.git/**/*', '!bin/**/*', '!node_modules/**/*', '!tests/**/*' ]
}
},
wp_readme_to_markdown: {
your_target: {
files: {
'README.md': 'readme.txt'
}
},
},
makepot: {
target: {
options: {
domainPath: '/languages',
exclude: [ '\.git/*', 'bin/*', 'node_modules/*', 'tests/*' ],
mainFile: 'test-plugin.php',
potFilename: 'test-plugin.pot',
potHeaders: {
poedit: true,
'x-poedit-keywordslist': true
},
type: 'wp-plugin',
updateTimestamp: true
}
}
},
} );
grunt.loadNpmTasks( 'grunt-wp-i18n' );
grunt.loadNpmTasks( 'grunt-wp-readme-to-markdown' );
grunt.registerTask( 'default', [ 'i18n','readme' ] );
grunt.registerTask( 'i18n', ['addtextdomain', 'makepot'] );
grunt.registerTask( 'readme', ['wp_readme_to_markdown'] );
grunt.util.linefeed = '\n';
};

181
bin/install-wp-tests.sh Executable file
View File

@@ -0,0 +1,181 @@
#!/usr/bin/env bash
if [ $# -lt 3 ]; then
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation]"
exit 1
fi
DB_NAME=$1
DB_USER=$2
DB_PASS=$3
DB_HOST=${4-localhost}
WP_VERSION=${5-latest}
SKIP_DB_CREATE=${6-false}
TMPDIR=${TMPDIR-/tmp}
TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//")
WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib}
WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress}
download() {
if [ `which curl` ]; then
curl -s "$1" > "$2";
elif [ `which wget` ]; then
wget -nv -O "$2" "$1"
fi
}
if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then
WP_BRANCH=${WP_VERSION%\-*}
WP_TESTS_TAG="branches/$WP_BRANCH"
elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then
WP_TESTS_TAG="branches/$WP_VERSION"
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
WP_TESTS_TAG="tags/${WP_VERSION%??}"
else
WP_TESTS_TAG="tags/$WP_VERSION"
fi
elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
WP_TESTS_TAG="trunk"
else
# http serves a single offer, whereas https serves multiple. we only want one
download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
if [[ -z "$LATEST_VERSION" ]]; then
echo "Latest WordPress version could not be found"
exit 1
fi
WP_TESTS_TAG="tags/$LATEST_VERSION"
fi
set -ex
install_wp() {
if [ -d $WP_CORE_DIR ]; then
return;
fi
mkdir -p $WP_CORE_DIR
if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
mkdir -p $TMPDIR/wordpress-trunk
rm -rf $TMPDIR/wordpress-trunk/*
svn export --quiet https://core.svn.wordpress.org/trunk $TMPDIR/wordpress-trunk/wordpress
mv $TMPDIR/wordpress-trunk/wordpress/* $WP_CORE_DIR
else
if [ $WP_VERSION == 'latest' ]; then
local ARCHIVE_NAME='latest'
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
# https serves multiple offers, whereas http serves single.
download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
LATEST_VERSION=${WP_VERSION%??}
else
# otherwise, scan the releases and get the most up to date minor version of the major release
local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'`
LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1)
fi
if [[ -z "$LATEST_VERSION" ]]; then
local ARCHIVE_NAME="wordpress-$WP_VERSION"
else
local ARCHIVE_NAME="wordpress-$LATEST_VERSION"
fi
else
local ARCHIVE_NAME="wordpress-$WP_VERSION"
fi
download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz
tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR
fi
download https://raw.githubusercontent.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
}
install_test_suite() {
# portable in-place argument for both GNU sed and Mac OSX sed
if [[ $(uname -s) == 'Darwin' ]]; then
local ioption='-i.bak'
else
local ioption='-i'
fi
# set up testing suite if it doesn't yet exist
if [ ! -d $WP_TESTS_DIR ]; then
# set up testing suite
mkdir -p $WP_TESTS_DIR
rm -rf $WP_TESTS_DIR/{includes,data}
svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
fi
if [ ! -f wp-tests-config.php ]; then
download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
# remove all forward slashes in the end
WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
sed $ioption "s:__DIR__ . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
fi
}
recreate_db() {
shopt -s nocasematch
if [[ $1 =~ ^(y|yes)$ ]]
then
mysqladmin drop $DB_NAME -f --user="$DB_USER" --password="$DB_PASS"$EXTRA
create_db
echo "Recreated the database ($DB_NAME)."
else
echo "Leaving the existing database ($DB_NAME) in place."
fi
shopt -u nocasematch
}
create_db() {
mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
}
install_db() {
if [ ${SKIP_DB_CREATE} = "true" ]; then
return 0
fi
# parse DB_HOST for port or socket references
local PARTS=(${DB_HOST//\:/ })
local DB_HOSTNAME=${PARTS[0]};
local DB_SOCK_OR_PORT=${PARTS[1]};
local EXTRA=""
if ! [ -z $DB_HOSTNAME ] ; then
if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
EXTRA=" --socket=$DB_SOCK_OR_PORT"
elif ! [ -z $DB_HOSTNAME ] ; then
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
fi
fi
# create database
if [ $(mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA --execute='show databases;' | grep ^$DB_NAME$) ]
then
echo "Reinstalling will delete the existing test database ($DB_NAME)"
read -p 'Are you sure you want to proceed? [y/N]: ' DELETE_EXISTING_DB
recreate_db $DELETE_EXISTING_DB
else
create_db
fi
}
install_wp
install_test_suite
install_db

233
cimba.php Normal file
View File

@@ -0,0 +1,233 @@
<?php
/**
* @package cimba
* @version 1.7.4
/*
Plugin Name: cimba
*/
// Include other files here
require_once plugin_dir_path(__FILE__) . 'includes/functions.php';
class NewClass
{
public $metadata_before;
public $metadata_after;
public $post_before;
public $post_after;
public $sp_event_before;
public $sp_event_after;
public $sp_event_data_before;
public $sp_event_data_after;
function print_r_pre($data, $msg = "")
{
echo "<pre>\"$msg\"\n" . print_r($data, true) . "</pre>";
}
function onelevel_array(array $array)
{
$return = [];
array_walk_recursive($array, function ($a) use (&$return) {
$return[] = $a;
});
return $return;
}
function get_sp_event_data(SP_Event $sp_event)
{
$data = [
"results" => $sp_event->results(),
"main_results" => $sp_event->main_results(),
"outcome" => $sp_event->outcome(),
"status" => $sp_event->status(),
"format" => $sp_event->format(),
"status" => get_post_meta($sp_event->ID, "sp_status", false),
"venue" => get_the_terms($sp_event->ID, "sp_venue", true),
"date" => $sp_event->post->post_date,
"teams" => get_post_meta($sp_event->ID, "sp_team", false),
];
return $data;
}
public function __construct()
{
add_action("post_updated", [$this, "datachangecheck"], 10, 3);
}
/*
* datachangecheck
*
* This function is called upon hook post_updated.
* The function checks if data for updated post has been changed,
* and saves a file when data has been changed
*
* @param string $post_id id of post affected
* @param WP_Post $post_after WP_Post after post has been updated
* @param WP_Post $post_before WP_Post before post has been updated
* @return N/A
*
*/
function datachangecheck($post_id, $post_after, $post_before)
{
$this->post_before = $post_before;
$this->post_after = $post_after;
//Cast postobjects into arrays, so comparision is possible with builtin-php functions
$spf = (array) $post_before;
$spa = (array) $post_after;
//These would differ every update. so remove them for possible comparision
unset($spf["post_modified"]);
unset($spf["post_modified_gmt"]);
unset($spa["post_modified"]);
unset($spa["post_modified_gmt"]);
//Check if any difference between arrays (if empty no difference)
//If not empty, save file that tells plugin that data has been changed
$ard = array_diff($spf, $spa);
if (!empty($ard)) {
$this->datahaschanged_save($post_before, $post_after);
print_r_pre($this->sp_event_data_before);
} else {
//No change of post native data, check if any metapost data has been changed
//Remove edit_last and edit_lock because they could differ without data being changed
$this->metadata_before = get_post_meta($post_id);
$this->sp_event_before = new SP_Event($post_before);
$this->sp_event_data_before = $this->get_sp_event_data(
$this->sp_event_before
);
unset($this->metadata_before["_edit_last"]);
unset($this->metadata_before["_edit_lock"]);
add_action(
"updated_post_meta",
[$this, "checkmetadata_after"],
10,
2
);
}
return;
}
/*
* checkmetadata_after
*
* This function is called upon hook updated_post_meta when data has been update, but no change in native post data
* has been made and saves a file when data has been changed
*
* @param string $post_id id of post affected
* @param WP_Post $post_after WP_Post after post has been updated
* @param WP_Post $post_before WP_Post before post has been updated
* @return N/A
*
*/
function checkmetadata_after($meta_id, $post_id)
{
//Because updated_post_meta is used, now we can grab the actual updated values
//Remove edit_last and edit_lock because they could differ without data being changed
$this->metadata_after = get_post_meta($post_id);
$this->sp_event_after = new SP_Event($this->post_after);
$this->sp_event_data_after = $this->get_sp_event_data(
$this->sp_event_after
);
unset($this->metadata_after["_edit_last"]);
unset($this->metadata_after["_edit_lock"]);
//Make one-level index arrays of metadata
//so array_diff works correctly down below
$arr_mdb = $this->onelevel_array($this->metadata_before);
$arr_mda = $this->onelevel_array($this->metadata_after);
//Compare array with metapost values before and after
//If not empty, save file that tells plugin that data has been changed
$ard_metadata = array_diff($arr_mdb, $arr_mda);
if (!empty($ard_metadata)) {
$this->datahaschanged_save(
$this->metadata_before,
$this->metadata_after,
true
);
$this->metadata_before = [];
$this->metadata_after = [];
$this->post_before = [];
$this->post_after = [];
}
return;
}
// echo get_the_post_thumbnail_url( get_the_ID(), 'medium' );
function datahaschanged_save(
$before = null,
$after = null,
$metadata_haschange = false
) {
_log("metadata has changed");
// $this->print_r_pre($this->sp_event_data_before);
// $this->print_r_pre($this->sp_event_data_after['results']);
// _log($this->sp_event_data_before->main_results);
if (
$this->sp_event_data_before["main_results"] !=
$this->sp_event_data_after["main_results"]
) {
_log("Score has changed!");
_log($this->sp_event_data_after["results"]);
$message = [];
foreach (
$this->sp_event_data_after["outcome"]
as $team_id => $outcome
) {
// print_r_pre($outcome);
$team = get_post($team_id);
$runs = $this->sp_event_data_after["results"][$team_id]["r"];
// print_r_pre($team);
$message[] = "$team->post_title: $runs ($outcome)";
}
_log(join(", ", $message));
}
}
}
$_ = new NewClass();
// get_the_terms($sp_event->ID, 'sp_venue', true)
// array(1)
// 0:
// WP_Term
// term_id:
// 5
// name:
// "Southwest Park"
// slug:
// "southwest"
// term_group:
// 0
// term_taxonomy_id:
// 5
// taxonomy:
// "sp_venue"
// description:
// "Southwest Park spans 6.9 acres and was incorporated into the Park Ridge Park District in 1956. This public space offers various amenities, including a playground, ball fields, a football field, a basketball court, as well as practical features like drinking fountains and a bike rack. The park serves as a recreational hub for the community, accommodating diverse interests and activities."
// parent:
// 0
// count:
// 32
// filter:
function test_inline()
{
$id = sp_array_value($_POST, "post_id");
$wp_post = get_post($id);
if ("sp_event" == $wp_post->post_type) {
$old_post = new SP_Event($id);
$old_results = $old_post->main_results();
$new_results = sp_array_value($_POST, "results");
echo "hello";
}
}
add_action("wp_ajax_sp-save-inline-results", "test_inline");
?>

43
distignore Normal file
View File

@@ -0,0 +1,43 @@
# A set of files you probably don't want in your WordPress.org distribution
.babelrc
.deployignore
.distignore
.editorconfig
.eslintignore
.eslintrc
.git
.gitignore
.github
.gitlab-ci.yml
.travis.yml
.DS_Store
.*~
Thumbs.db
behat.yml
bitbucket-pipelines.yml
bin
.circleci/config.yml
composer.json
composer.lock
dependencies.yml
Gruntfile.js
package.json
package-lock.json
phpunit.xml
phpunit.xml.dist
multisite.xml
multisite.xml.dist
.phpcs.xml
phpcs.xml
.phpcs.xml.dist
phpcs.xml.dist
README.md
webpack.config.js
wp-cli.local.yml
yarn.lock
tests
vendor
node_modules
*.sql
*.tar.gz
*.zip

17
package.json Normal file
View File

@@ -0,0 +1,17 @@
{
"name": "cimba",
"version": "0.1.0",
"main": "Gruntfile.js",
"author": "Anthony Correa",
"scripts" : {
"start" : "grunt default" ,
"readme" : "grunt readme",
"i18n" : "grunt i18n"
},
"devDependencies": {
"grunt": "~0.4.5",
"grunt-wp-i18n": "~0.5.0",
"grunt-wp-readme-to-markdown": "~1.0.0"
}
}

16
phpunit.xml.dist Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<phpunit
bootstrap="tests/bootstrap.php"
backupGlobals="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
>
<testsuites>
<testsuite name="testing">
<directory prefix="test-" suffix=".php">./tests/</directory>
<exclude>./tests/test-sample.php</exclude>
</testsuite>
</testsuites>
</phpunit>

38
tests/bootstrap.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
/**
* PHPUnit bootstrap file.
*
* @package Test_Plugin
*/
$_tests_dir = getenv( 'WP_TESTS_DIR' );
if ( ! $_tests_dir ) {
$_tests_dir = rtrim( sys_get_temp_dir(), '/\\' ) . '/wordpress-tests-lib';
}
// Forward custom PHPUnit Polyfills configuration to PHPUnit bootstrap file.
$_phpunit_polyfills_path = getenv( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH' );
if ( false !== $_phpunit_polyfills_path ) {
define( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH', $_phpunit_polyfills_path );
}
if ( ! file_exists( "{$_tests_dir}/includes/functions.php" ) ) {
echo "Could not find {$_tests_dir}/includes/functions.php, have you run bin/install-wp-tests.sh ?" . PHP_EOL; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit( 1 );
}
// Give access to tests_add_filter() function.
require_once "{$_tests_dir}/includes/functions.php";
/**
* Manually load the plugin being tested.
*/
function _manually_load_plugin() {
require dirname( dirname( __FILE__ ) ) . '/test-plugin.php';
}
tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );
// Start up the WP testing environment.
require "{$_tests_dir}/includes/bootstrap.php";

20
tests/test-sample.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
/**
* Class SampleTest
*
* @package Test_Plugin
*/
/**
* Sample test case.
*/
class SampleTest extends WP_UnitTestCase {
/**
* A single example test.
*/
public function test_sample() {
// Replace this with some actual testing code.
$this->assertTrue( true );
}
}