This repository has been archived by the owner on Jul 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 144
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
113 changed files
with
5,065 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
<?php | ||
|
||
// autoload.php @generated by Composer | ||
|
||
require_once __DIR__ . '/composer/autoload_real.php'; | ||
|
||
return ComposerAutoloaderInitb096b6d0baa3bb33778efaa82be41842::getLoader(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
<?php | ||
/** | ||
* This file `autoload_packages.php`was generated by automattic/jetpack-autoloader. | ||
* | ||
* From your plugin include this file with: | ||
* require_once . plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php'; | ||
* | ||
* @package automattic/jetpack-autoloader | ||
*/ | ||
|
||
// phpcs:disable PHPCompatibility.LanguageConstructs.NewLanguageConstructs.t_ns_separatorFound | ||
// phpcs:disable PHPCompatibility.Keywords.NewKeywords.t_namespaceFound | ||
// phpcs:disable PHPCompatibility.Keywords.NewKeywords.t_ns_cFound | ||
|
||
namespace Automattic\Jetpack\Autoloader; | ||
|
||
if ( ! function_exists( __NAMESPACE__ . '\enqueue_package_class' ) ) { | ||
global $jetpack_packages_classes; | ||
|
||
if ( ! is_array( $jetpack_packages_classes ) ) { | ||
$jetpack_packages_classes = array(); | ||
} | ||
/** | ||
* Adds the version of a package to the $jetpack_packages global array so that | ||
* the autoloader is able to find it. | ||
* | ||
* @param string $class_name Name of the class that you want to autoload. | ||
* @param string $version Version of the class. | ||
* @param string $path Absolute path to the class so that we can load it. | ||
*/ | ||
function enqueue_package_class( $class_name, $version, $path ) { | ||
global $jetpack_packages_classes; | ||
|
||
if ( ! isset( $jetpack_packages_classes[ $class_name ] ) ) { | ||
$jetpack_packages_classes[ $class_name ] = array( | ||
'version' => $version, | ||
'path' => $path, | ||
); | ||
} | ||
// If we have a @dev version set always use that one! | ||
if ( 'dev-' === substr( $jetpack_packages_classes[ $class_name ]['version'], 0, 4 ) ) { | ||
return; | ||
} | ||
|
||
// Always favour the @dev version. Since that version is the same as bleeding edge. | ||
// We need to make sure that we don't do this in production! | ||
if ( 'dev-' === substr( $version, 0, 4 ) ) { | ||
$jetpack_packages_classes[ $class_name ] = array( | ||
'version' => $version, | ||
'path' => $path, | ||
); | ||
|
||
return; | ||
} | ||
// Set the latest version! | ||
if ( version_compare( $jetpack_packages_classes[ $class_name ]['version'], $version, '<' ) ) { | ||
$jetpack_packages_classes[ $class_name ] = array( | ||
'version' => $version, | ||
'path' => $path, | ||
); | ||
} | ||
} | ||
} | ||
|
||
if ( ! function_exists( __NAMESPACE__ . '\autoloader' ) ) { | ||
/** | ||
* Used for autoloading jetpack packages. | ||
* | ||
* @param string $class_name Class Name to load. | ||
*/ | ||
function autoloader( $class_name ) { | ||
global $jetpack_packages_classes; | ||
|
||
if ( isset( $jetpack_packages_classes[ $class_name ] ) ) { | ||
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { | ||
// TODO ideally we shouldn't skip any of these, see: https://github.com/Automattic/jetpack/pull/12646. | ||
$ignore = in_array( | ||
$class_name, | ||
array( | ||
'Automattic\Jetpack\JITM', | ||
'Automattic\Jetpack\Connection\Manager', | ||
'Automattic\Jetpack\Connection\Manager_Interface', | ||
'Automattic\Jetpack\Connection\XMLRPC_Connector', | ||
'Jetpack_IXR_Client', | ||
'Jetpack_Options', | ||
'Jetpack_Signature', | ||
'Jetpack_XMLRPC_Server', | ||
'Automattic\Jetpack\Sync\Main', | ||
'Automattic\Jetpack\Constants', | ||
'Automattic\Jetpack\Tracking', | ||
'Automattic\Jetpack\Plugin\Tracking', | ||
), | ||
true | ||
); | ||
if ( ! $ignore && function_exists( 'did_action' ) && ! did_action( 'plugins_loaded' ) ) { | ||
_doing_it_wrong( | ||
esc_html( $class_name ), | ||
sprintf( | ||
/* translators: %s Name of a PHP Class */ | ||
esc_html__( 'Not all plugins have loaded yet but we requested the class %s', 'jetpack' ), | ||
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped | ||
$class_name | ||
), | ||
esc_html( $jetpack_packages_classes[ $class_name ]['version'] ) | ||
); | ||
} | ||
} | ||
|
||
if ( file_exists( $jetpack_packages_classes[ $class_name ]['path'] ) ) { | ||
require_once $jetpack_packages_classes[ $class_name ]['path']; | ||
|
||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
// Add the jetpack autoloader. | ||
spl_autoload_register( __NAMESPACE__ . '\autoloader' ); | ||
} | ||
/** | ||
* Prepare all the classes for autoloading. | ||
*/ | ||
function enqueue_packages_59f05bae673fa686cd2f7de785d9af9b() { | ||
$class_map = require_once dirname( __FILE__ ) . '/composer/autoload_classmap_package.php'; | ||
foreach ( $class_map as $class_name => $class_info ) { | ||
enqueue_package_class( $class_name, $class_info['version'], $class_info['path'] ); | ||
} | ||
|
||
$autoload_file = __DIR__ . '/composer/autoload_files.php'; | ||
$includeFiles = file_exists( $autoload_file ) | ||
? require $autoload_file | ||
: []; | ||
|
||
foreach ( $includeFiles as $fileIdentifier => $file ) { | ||
if ( empty( $GLOBALS['__composer_autoload_files'][ $fileIdentifier ] ) ) { | ||
require $file; | ||
|
||
$GLOBALS['__composer_autoload_files'][ $fileIdentifier ] = true; | ||
} | ||
} | ||
} | ||
enqueue_packages_59f05bae673fa686cd2f7de785d9af9b(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
A custom autoloader for Composer | ||
===================================== | ||
|
||
This is a custom autoloader generator that uses a classmap to always load the latest version of a class. | ||
|
||
The problem this autoloader is trying to solve is conflicts that arise when two or more plugins use the same package, but one of the plugins uses an older version of said package. | ||
|
||
This is solved by keeping an in memory map of all the different classes that can be loaded, and updating the map with the path to the latest version of the package for the autoloader to find when we instantiate the class. | ||
This only works if we instantiate the class after all the plugins have loaded. That is why the class produces an error if the plugin calls a class but has not loaded all the plugins yet. | ||
|
||
It diverges from the default Composer autoloader setup in the following ways: | ||
|
||
* It creates an `autoload_classmap_package.php` file in the `vendor/composer` directory. | ||
* This file includes the version numbers from each package that is used. | ||
* The autoloader will only load the latest version of the library no matter what plugin loads the library. | ||
* Only call the library classes after all the plugins have loaded and the `plugins_loaded` action has fired. | ||
|
||
|
||
Usage | ||
----- | ||
|
||
In your project's `composer.json`, add the following lines: | ||
|
||
```json | ||
{ | ||
"require-dev": { | ||
"automattic/jetpack-autoloader": "^1" | ||
} | ||
} | ||
``` | ||
|
||
After the next update/install, you will have a `vendor/autoload_packages.php` file. | ||
Load the file in your plugin via main plugin file. | ||
|
||
In the main plugin you will also need to include the files like this. | ||
```php | ||
require_once . plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php'; | ||
``` | ||
|
||
|
||
Current Limitations | ||
----- | ||
|
||
We currently only support packages that autoload via psr-4 definition in their package. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
{ | ||
"name": "automattic/jetpack-autoloader", | ||
"description": "Creates a custom autoloader for a plugin or theme.", | ||
"type": "composer-plugin", | ||
"license": "GPL-2.0-or-later", | ||
"require": { | ||
"composer-plugin-api": "^1.1" | ||
}, | ||
"require-dev": { | ||
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5" | ||
}, | ||
"autoload": { | ||
"psr-4": { | ||
"Automattic\\Jetpack\\Autoloader\\": "src" | ||
} | ||
}, | ||
"extra": { | ||
"class": "Automattic\\Jetpack\\Autoloader\\CustomAutoloaderPlugin" | ||
}, | ||
"scripts": { | ||
"phpunit": [ | ||
"@composer install", | ||
"./vendor/phpunit/phpunit/phpunit --colors=always" | ||
] | ||
}, | ||
"minimum-stability": "dev", | ||
"prefer-stable": true | ||
} |
Oops, something went wrong.