Chep Kart
This commit is contained in:
parent
84efa2fe15
commit
f1b278f27d
143
assets/css/custom.css
Normal file
143
assets/css/custom.css
Normal file
@ -0,0 +1,143 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;900&display=swap');
|
||||
|
||||
:root {
|
||||
--primary-color: #5A67D8;
|
||||
--secondary-color: #38B2AC;
|
||||
--text-color: #2D3748;
|
||||
--bg-gradient-start: #f5f7fa;
|
||||
--bg-gradient-end: #c3cfe2;
|
||||
--card-bg: rgba(255, 255, 255, 0.6);
|
||||
--card-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.1);
|
||||
--card-border: rgba(255, 255, 255, 0.18);
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
background: linear-gradient(135deg, var(--bg-gradient-start) 0%, var(--bg-gradient-end) 100%);
|
||||
color: var(--text-color);
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.navbar-sticky {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1020;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
border-bottom: 1px solid rgba(0,0,0,.1);
|
||||
transition: background 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.navbar-sticky.scrolled {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
font-weight: 900;
|
||||
font-size: 1.75rem;
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
.hero-section {
|
||||
padding: 6rem 0;
|
||||
}
|
||||
|
||||
.hero-title {
|
||||
font-weight: 900;
|
||||
font-size: 3.5rem;
|
||||
}
|
||||
|
||||
.hero-subtitle {
|
||||
font-size: 1.25rem;
|
||||
color: #4A5568;
|
||||
}
|
||||
|
||||
.search-bar-wrapper {
|
||||
position: relative;
|
||||
max-width: 600px;
|
||||
margin: 2rem auto;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
border-radius: 50px;
|
||||
border: 1px solid #E2E8F0;
|
||||
padding: 1rem 2rem 1rem 3.5rem;
|
||||
font-size: 1.1rem;
|
||||
transition: all 0.3s ease-in-out;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
|
||||
}
|
||||
|
||||
.search-input:focus {
|
||||
box-shadow: 0 8px 25px rgba(0,0,0,0.1);
|
||||
transform: translateY(-2px);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 1.25rem;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
color: #A0AEC0;
|
||||
}
|
||||
|
||||
.category-card {
|
||||
background: var(--card-bg);
|
||||
border-radius: 1rem;
|
||||
border: 1px solid var(--card-border);
|
||||
box-shadow: var(--card-shadow);
|
||||
backdrop-filter: blur(8px);
|
||||
-webkit-backdrop-filter: blur(8px);
|
||||
padding: 2rem;
|
||||
text-align: center;
|
||||
transition: all 0.3s ease-in-out;
|
||||
text-decoration: none;
|
||||
color: var(--text-color);
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.category-card:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
left: -50%;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
background: radial-gradient(circle, rgba(255,255,255,0.4) 0%, rgba(255,255,255,0) 60%);
|
||||
transform: scale(0);
|
||||
transition: transform 0.5s ease;
|
||||
}
|
||||
|
||||
|
||||
.category-card:hover {
|
||||
transform: translateY(-10px) scale(1.03);
|
||||
box-shadow: 0 16px 40px rgba(31, 38, 135, 0.15);
|
||||
}
|
||||
|
||||
.category-card:hover:before {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.category-card .card-icon {
|
||||
font-size: 3rem;
|
||||
margin-bottom: 1rem;
|
||||
color: var(--primary-color);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.category-card:hover .card-icon {
|
||||
color: var(--secondary-color);
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-weight: 700;
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
.footer {
|
||||
background: transparent;
|
||||
border-top: 1px solid rgba(0,0,0,.05);
|
||||
}
|
||||
13
assets/js/main.js
Normal file
13
assets/js/main.js
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const navbar = document.querySelector('.navbar-sticky');
|
||||
if (navbar) {
|
||||
window.addEventListener('scroll', function () {
|
||||
if (window.scrollY > 20) {
|
||||
navbar.classList.add('scrolled');
|
||||
} else {
|
||||
navbar.classList.remove('scrolled');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
170
category.php
Normal file
170
category.php
Normal file
@ -0,0 +1,170 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/db/config.php';
|
||||
|
||||
$category_slug = $_GET['name'] ?? '';
|
||||
|
||||
if (empty($category_slug)) {
|
||||
die("Category not specified.");
|
||||
}
|
||||
|
||||
$pdo = db();
|
||||
|
||||
// Get category details
|
||||
$stmt = $pdo->prepare("SELECT * FROM categories WHERE slug = ?");
|
||||
$stmt->execute([$category_slug]);
|
||||
$category = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$category) {
|
||||
die("Category not found.");
|
||||
}
|
||||
|
||||
$sort = $_GET['sort'] ?? 'popularity'; // New default for categories
|
||||
$filter_brand = $_GET['filter_brand'] ?? '';
|
||||
|
||||
$results = [];
|
||||
$brands = [];
|
||||
|
||||
// Get all products in this category
|
||||
$sql = "SELECT p.id, p.name, p.brand, p.image_url FROM products p WHERE p.category_id = ?";
|
||||
$params = [$category['id']];
|
||||
|
||||
// Get all possible brands for the current category
|
||||
$brand_stmt = $pdo->prepare("SELECT DISTINCT brand FROM products WHERE category_id = ? AND brand IS NOT NULL ORDER BY brand");
|
||||
$brand_stmt->execute([$category['id']]);
|
||||
$brands = $brand_stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
// Add brand filter
|
||||
if (!empty($filter_brand)) {
|
||||
$sql .= " AND p.brand = ?";
|
||||
$params[] = $filter_brand;
|
||||
}
|
||||
|
||||
// Sorting logic for category page
|
||||
switch ($sort) {
|
||||
case 'price_asc':
|
||||
$sql .= " ORDER BY (SELECT MIN(effective_price) FROM product_listings WHERE product_id = p.id) ASC";
|
||||
break;
|
||||
case 'price_desc':
|
||||
$sql .= " ORDER BY (SELECT MIN(effective_price) FROM product_listings WHERE product_id = p.id) DESC";
|
||||
break;
|
||||
case 'rating':
|
||||
$sql .= " ORDER BY (SELECT AVG(rating) FROM product_listings WHERE product_id = p.id) DESC";
|
||||
break;
|
||||
default: // Popularity/relevance for categories could be based on number of listings or other metrics
|
||||
$sql .= " ORDER BY p.id DESC"; // Simple default: newest products first
|
||||
break;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$product_ids = array_column($products, 'id');
|
||||
if (!empty($product_ids)) {
|
||||
$placeholders = implode(',', array_fill(0, count($product_ids), '?'));
|
||||
$stmt = $pdo->prepare("SELECT *, pl.id as listing_id, plat.name as platform_name FROM product_listings pl JOIN platforms plat ON pl.platform_id = plat.id WHERE pl.product_id IN ($placeholders)");
|
||||
$stmt->execute($product_ids);
|
||||
$listings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$listings_by_product = [];
|
||||
foreach ($listings as $listing) {
|
||||
$listings_by_product[$listing['product_id']][] = $listing;
|
||||
}
|
||||
|
||||
foreach ($products as $product) {
|
||||
$product['listings'] = $listings_by_product[$product['id']] ?? [];
|
||||
if (!empty($product['listings'])) {
|
||||
$cheapest = array_reduce($product['listings'], fn($c, $i) => ($c === null || $i['effective_price'] < $c['effective_price']) ? $i : $c);
|
||||
$product['cheapest_price'] = $cheapest['effective_price'];
|
||||
$product['badge'] = $cheapest['badge'];
|
||||
}
|
||||
$results[] = $product;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><?php echo htmlspecialchars($category['name']); ?> - XUPER MALL</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container mt-5">
|
||||
<a href="index.php" class="text-decoration-none">← Back to Home</a>
|
||||
<h1 class="my-4"><?php echo htmlspecialchars($category['name']); ?></h1>
|
||||
|
||||
<form method="GET" action="category.php" class="row g-3 mb-4 align-items-center bg-light p-3 rounded">
|
||||
<input type="hidden" name="name" value="<?php echo htmlspecialchars($category_slug); ?>">
|
||||
<div class="col-md-4">
|
||||
<label for="sort" class="form-label">Sort by</label>
|
||||
<select name="sort" id="sort" class="form-select">
|
||||
<option value="popularity" <?php if ($sort == 'popularity') echo 'selected'; ?>>Popularity</option>
|
||||
<option value="price_asc" <?php if ($sort == 'price_asc') echo 'selected'; ?>>Price: Low to High</option>
|
||||
<option value="price_desc" <?php if ($sort == 'price_desc') echo 'selected'; ?>>Price: High to Low</option>
|
||||
<option value="rating" <?php if ($sort == 'rating') echo 'selected'; ?>>Rating</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="filter_brand" class="form-label">Brand</label>
|
||||
<select name="filter_brand" id="filter_brand" class="form-select">
|
||||
<option value="">All Brands</option>
|
||||
<?php foreach ($brands as $brand): ?>
|
||||
<option value="<?php echo htmlspecialchars($brand); ?>" <?php if ($filter_brand == $brand) echo 'selected'; ?>><?php echo htmlspecialchars($brand); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary w-100">Apply</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<?php if (empty($results)): ?>
|
||||
<div class="alert alert-info">No products found in this category yet.</div>
|
||||
<?php else: ?>
|
||||
<div class="row g-4">
|
||||
<?php foreach ($results as $product): ?>
|
||||
<div class="col-12">
|
||||
<div class="card product-card-list">
|
||||
<div class="row g-0">
|
||||
<div class="col-md-2">
|
||||
<img src="<?php echo htmlspecialchars($product['image_url'] ?? 'https://via.placeholder.com/150'); ?>" class="img-fluid rounded-start" alt="<?php echo htmlspecialchars($product['name']); ?>">
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><?php echo htmlspecialchars($product['name']); ?></h5>
|
||||
<p class="card-text text-muted"><?php echo htmlspecialchars($product['brand']); ?></p>
|
||||
<p class="card-text">From: <span class="fw-bold text-success">$<?php echo htmlspecialchars($product['cheapest_price'] ?? 'N/A'); ?></span></p>
|
||||
<?php if (!empty($product['badge'])): ?>
|
||||
<span class="badge bg-info"><?php echo htmlspecialchars($product['badge']); ?></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card-body">
|
||||
<h6 class="mb-2">Available on:</h6>
|
||||
<ul class="list-group list-group-flush">
|
||||
<?php foreach ($product['listings'] as $listing): ?>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<a href="<?php echo htmlspecialchars($listing['product_url']); ?>" target="_blank" rel="noopener noreferrer">
|
||||
<?php echo htmlspecialchars($listing['platform_name']); ?>
|
||||
</a>
|
||||
<span class="fw-bold">$<?php echo htmlspecialchars($listing['effective_price']); ?></span>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
5
composer.json
Normal file
5
composer.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"require": {
|
||||
"fakerphp/faker": "^1.24"
|
||||
}
|
||||
}
|
||||
202
composer.lock
generated
Normal file
202
composer.lock
generated
Normal file
@ -0,0 +1,202 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "0ac0340f2120a65e4928bde600db496b",
|
||||
"packages": [
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
"version": "2.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/container.git",
|
||||
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Container\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "https://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||
"homepage": "https://github.com/php-fig/container",
|
||||
"keywords": [
|
||||
"PSR-11",
|
||||
"container",
|
||||
"container-interface",
|
||||
"container-interop",
|
||||
"psr"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/php-fig/container/issues",
|
||||
"source": "https://github.com/php-fig/container/tree/2.0.2"
|
||||
},
|
||||
"time": "2021-11-05T16:47:00+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
"version": "v3.6.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/deprecation-contracts.git",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.1"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"thanks": {
|
||||
"url": "https://github.com/symfony/contracts",
|
||||
"name": "symfony/contracts"
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-main": "3.6-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"function.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "A generic function and convention to trigger deprecation notices",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-09-25T14:21:43+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {},
|
||||
"platform-dev": {},
|
||||
"plugin-api-version": "2.9.0"
|
||||
}
|
||||
BIN
composer.phar
Executable file
BIN
composer.phar
Executable file
Binary file not shown.
71
db/migrations/001_initial_schema.php
Normal file
71
db/migrations/001_initial_schema.php
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../config.php';
|
||||
|
||||
function migrate_001_initial_schema() {
|
||||
$pdo = db();
|
||||
$sql = <<<SQL
|
||||
CREATE TABLE IF NOT EXISTS `categories` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`slug` VARCHAR(255) NOT NULL UNIQUE,
|
||||
`icon_url` VARCHAR(255),
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `products` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`brand` VARCHAR(255),
|
||||
`category_id` INT,
|
||||
`subcategory` VARCHAR(255),
|
||||
`image_url` VARCHAR(255),
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE SET NULL,
|
||||
FULLTEXT KEY `ft_name_brand` (`name`, `brand`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `platforms` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`slug` VARCHAR(255) NOT NULL UNIQUE,
|
||||
`logo_url` VARCHAR(255),
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `product_listings` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`product_id` INT NOT NULL,
|
||||
`platform_id` INT NOT NULL,
|
||||
`original_price` DECIMAL(10, 2),
|
||||
`discounted_price` DECIMAL(10, 2),
|
||||
`coupon_price` DECIMAL(10, 2),
|
||||
`effective_price` DECIMAL(10, 2),
|
||||
`rating` FLOAT,
|
||||
`final_score` FLOAT,
|
||||
`badge` ENUM('CHEAPEST', 'TOP RATED', 'BEST DEAL'),
|
||||
`product_url` TEXT,
|
||||
`last_synced_at` TIMESTAMP NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`platform_id`) REFERENCES `platforms`(`id`) ON DELETE CASCADE,
|
||||
INDEX `idx_effective_price` (`effective_price`),
|
||||
INDEX `idx_rating` (`rating`)
|
||||
);
|
||||
SQL;
|
||||
|
||||
try {
|
||||
$pdo->exec($sql);
|
||||
echo "Database schema created successfully." . PHP_EOL;
|
||||
} catch (PDOException $e) {
|
||||
die("Error creating schema: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// If this script is run directly, execute the migration.
|
||||
if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
|
||||
migrate_001_initial_schema();
|
||||
}
|
||||
23
db/seeders/seed_categories.php
Normal file
23
db/seeders/seed_categories.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../config.php';
|
||||
|
||||
function seed_categories() {
|
||||
$pdo = db();
|
||||
$categories = [
|
||||
['name' => 'E-Commerce', 'slug' => 'ecommerce', 'icon_url' => 'shopping-bag'],
|
||||
['name' => 'Food Delivery', 'slug' => 'food', 'icon_url' => 'coffee'],
|
||||
['name' => 'Movie Tickets', 'slug' => 'movies', 'icon_url' => 'film'],
|
||||
['name' => '30-Min Delivery', 'slug' => 'delivery', 'icon_url' => 'truck'],
|
||||
];
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO categories (name, slug, icon_url) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE name=VALUES(name)");
|
||||
|
||||
foreach ($categories as $category) {
|
||||
$stmt->execute([$category['name'], $category['slug'], $category['icon_url']]);
|
||||
}
|
||||
echo "Categories seeded successfully." . PHP_EOL;
|
||||
}
|
||||
|
||||
if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
|
||||
seed_categories();
|
||||
}
|
||||
30
db/seeders/seed_platforms.php
Normal file
30
db/seeders/seed_platforms.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../config.php';
|
||||
|
||||
function seed_platforms() {
|
||||
$pdo = db();
|
||||
$platforms = [
|
||||
['name' => 'Amazon', 'slug' => 'amazon', 'logo_url' => 'assets/images/logos/amazon.png'],
|
||||
['name' => 'Flipkart', 'slug' => 'flipkart', 'logo_url' => 'assets/images/logos/flipkart.png'],
|
||||
['name' => 'Myntra', 'slug' => 'myntra', 'logo_url' => 'assets/images/logos/myntra.png'],
|
||||
['name' => 'Zomato', 'slug' => 'zomato', 'logo_url' => 'assets/images/logos/zomato.png'],
|
||||
['name' => 'Swiggy', 'slug' => 'swiggy', 'logo_url' => 'assets/images/logos/swiggy.png'],
|
||||
['name' => 'Magicpin', 'slug' => 'magicpin', 'logo_url' => 'assets/images/logos/magicpin.png'],
|
||||
['name' => 'Blinkit', 'slug' => 'blinkit', 'logo_url' => 'assets/images/logos/blinkit.png'],
|
||||
['name' => 'Jiomart', 'slug' => 'jiomart', 'logo_url' => 'assets/images/logos/jiomart.png'],
|
||||
['name' => 'Instamart', 'slug' => 'instamart', 'logo_url' => 'assets/images/logos/instamart.png'],
|
||||
['name' => 'BookMyShow', 'slug' => 'bookmyshow', 'logo_url' => 'assets/images/logos/bookmyshow.png'],
|
||||
['name' => 'PaytmMovies', 'slug' => 'paytmmovies', 'logo_url' => 'assets/images/logos/paytmmovies.png'],
|
||||
['name' => 'PVR', 'slug' => 'pvr', 'logo_url' => 'assets/images/logos/pvr.png'],
|
||||
];
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO platforms (name, slug, logo_url) VALUES (:name, :slug, :logo_url) ON DUPLICATE KEY UPDATE name=VALUES(name), slug=VALUES(slug), logo_url=VALUES(logo_url)");
|
||||
|
||||
foreach ($platforms as $platform) {
|
||||
$stmt->execute($platform);
|
||||
}
|
||||
|
||||
echo "Platforms seeded successfully.\n";
|
||||
}
|
||||
|
||||
seed_platforms();
|
||||
54
db/seeders/seed_product_listings.php
Normal file
54
db/seeders/seed_product_listings.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../config.php';
|
||||
|
||||
function seed_product_listings() {
|
||||
$faker = Faker\Factory::create();
|
||||
$pdo = db();
|
||||
|
||||
// Fetch product and platform IDs
|
||||
$product_ids = $pdo->query("SELECT id FROM products")->fetchAll(PDO::FETCH_COLUMN);
|
||||
$platform_ids = $pdo->query("SELECT id FROM platforms")->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
if (empty($product_ids) || empty($platform_ids)) {
|
||||
echo "Please seed products and platforms first.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$listings = [];
|
||||
foreach ($product_ids as $product_id) {
|
||||
$num_listings = rand(1, count($platform_ids));
|
||||
$used_platforms = [];
|
||||
for ($i = 0; $i < $num_listings; $i++) {
|
||||
$platform_id = $platform_ids[array_rand($platform_ids)];
|
||||
if (in_array($platform_id, $used_platforms)) {
|
||||
continue;
|
||||
}
|
||||
$used_platforms[] = $platform_id;
|
||||
|
||||
$original_price = $faker->randomFloat(2, 10, 1000);
|
||||
$discounted_price = $original_price - $faker->randomFloat(2, 0, $original_price * 0.5);
|
||||
$coupon_price = $discounted_price - $faker->randomFloat(2, 0, $discounted_price * 0.2);
|
||||
|
||||
$listings[] = [
|
||||
'product_id' => $product_id,
|
||||
'platform_id' => $platform_id,
|
||||
'original_price' => $original_price,
|
||||
'discounted_price' => $discounted_price,
|
||||
'coupon_price' => $coupon_price,
|
||||
'rating' => $faker->randomFloat(1, 1, 5),
|
||||
'product_url' => $faker->url,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO product_listings (product_id, platform_id, original_price, discounted_price, coupon_price, rating, product_url) VALUES (:product_id, :platform_id, :original_price, :discounted_price, :coupon_price, :rating, :product_url)");
|
||||
|
||||
foreach ($listings as $listing) {
|
||||
$stmt->execute($listing);
|
||||
}
|
||||
|
||||
echo count($listings) . " product listings seeded successfully.\n";
|
||||
}
|
||||
|
||||
seed_product_listings();
|
||||
39
db/seeders/seed_products.php
Normal file
39
db/seeders/seed_products.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../config.php';
|
||||
|
||||
function seed_products() {
|
||||
$faker = Faker\Factory::create();
|
||||
$pdo = db();
|
||||
|
||||
// Fetch category IDs
|
||||
$stmt = $pdo->query("SELECT id FROM categories");
|
||||
$category_ids = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
if (empty($category_ids)) {
|
||||
echo "Please seed categories first.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$products = [];
|
||||
for ($i = 0; $i < 300; $i++) {
|
||||
$products[] = [
|
||||
'name' => $faker->words(3, true),
|
||||
'brand' => $faker->company,
|
||||
'category_id' => $category_ids[array_rand($category_ids)],
|
||||
'subcategory' => $faker->word,
|
||||
'image_url' => $faker->imageUrl(640, 480, 'technics', true),
|
||||
];
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO products (name, brand, category_id, subcategory, image_url) VALUES (:name, :brand, :category_id, :subcategory, :image_url)");
|
||||
|
||||
foreach ($products as $product) {
|
||||
$stmt->execute($product);
|
||||
}
|
||||
|
||||
echo "300 products seeded successfully.\n";
|
||||
}
|
||||
|
||||
seed_products();
|
||||
|
||||
250
index.php
250
index.php
@ -1,150 +1,112 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
@ini_set('display_errors', '1');
|
||||
@error_reporting(E_ALL);
|
||||
@date_default_timezone_set('UTC');
|
||||
|
||||
$phpVersion = PHP_VERSION;
|
||||
$now = date('Y-m-d H:i:s');
|
||||
?>
|
||||
<!doctype html>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>New Style</title>
|
||||
<?php
|
||||
// Read project preview data from environment
|
||||
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? '';
|
||||
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
?>
|
||||
<?php if ($projectDescription): ?>
|
||||
<!-- Meta description -->
|
||||
<meta name="description" content='<?= htmlspecialchars($projectDescription) ?>' />
|
||||
<!-- Open Graph meta tags -->
|
||||
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
|
||||
<!-- Twitter meta tags -->
|
||||
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
|
||||
<?php endif; ?>
|
||||
<?php if ($projectImageUrl): ?>
|
||||
<!-- Open Graph image -->
|
||||
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
|
||||
<!-- Twitter image -->
|
||||
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
|
||||
<?php endif; ?>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--bg-color-start: #6a11cb;
|
||||
--bg-color-end: #2575fc;
|
||||
--text-color: #ffffff;
|
||||
--card-bg-color: rgba(255, 255, 255, 0.01);
|
||||
--card-border-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Inter', sans-serif;
|
||||
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
|
||||
color: var(--text-color);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
body::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M-10 10L110 10M10 -10L10 110" stroke-width="1" stroke="rgba(255,255,255,0.05)"/></svg>');
|
||||
animation: bg-pan 20s linear infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
@keyframes bg-pan {
|
||||
0% { background-position: 0% 0%; }
|
||||
100% { background-position: 100% 100%; }
|
||||
}
|
||||
main {
|
||||
padding: 2rem;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-bg-color);
|
||||
border: 1px solid var(--card-border-color);
|
||||
border-radius: 16px;
|
||||
padding: 2rem;
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.loader {
|
||||
margin: 1.25rem auto 1.25rem;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border: 3px solid rgba(255, 255, 255, 0.25);
|
||||
border-top-color: #fff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
@keyframes spin {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
.hint {
|
||||
opacity: 0.9;
|
||||
}
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px; height: 1px;
|
||||
padding: 0; margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap; border: 0;
|
||||
}
|
||||
h1 {
|
||||
font-size: 3rem;
|
||||
font-weight: 700;
|
||||
margin: 0 0 1rem;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
p {
|
||||
margin: 0.5rem 0;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
code {
|
||||
background: rgba(0,0,0,0.2);
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
||||
}
|
||||
footer {
|
||||
position: absolute;
|
||||
bottom: 1rem;
|
||||
font-size: 0.8rem;
|
||||
opacity: 0.7;
|
||||
}
|
||||
</style>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<title>XUPER MALL - Real-Time Price Comparison</title>
|
||||
<meta name="description" content="<?php echo htmlspecialchars($_SERVER['PROJECT_DESCRIPTION'] ?? 'An advanced real-time price comparison platform for e-commerce, food, movies, and more.'); ?>">
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:title" content="XUPER MALL">
|
||||
<meta property="og:description" content="<?php echo htmlspecialchars($_SERVER['PROJECT_DESCRIPTION'] ?? 'An advanced real-time price comparison platform.'); ?>">
|
||||
<meta property="og:image" content="<?php echo htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? ''); ?>">
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta property="twitter:card" content="summary_large_image">
|
||||
<meta property="twitter:title" content="XUPER MALL">
|
||||
<meta property="twitter:description" content="<?php echo htmlspecialchars($_SERVER['PROJECT_DESCRIPTION'] ?? 'An advanced real-time price comparison platform.'); ?>">
|
||||
<meta property="twitter:image" content="<?php echo htmlspecialchars($_SERVER['PROJECT_IMAGE_URL'] ?? ''); ?>">
|
||||
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="card">
|
||||
<h1>Analyzing your requirements and generating your website…</h1>
|
||||
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes">
|
||||
<span class="sr-only">Loading…</span>
|
||||
</div>
|
||||
<p class="hint"><?= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.</p>
|
||||
<p class="hint">This page will update automatically as the plan is implemented.</p>
|
||||
<p>Runtime: PHP <code><?= htmlspecialchars($phpVersion) ?></code> — UTC <code><?= htmlspecialchars($now) ?></code></p>
|
||||
</div>
|
||||
</main>
|
||||
<footer>
|
||||
Page updated: <?= htmlspecialchars($now) ?> (UTC)
|
||||
</footer>
|
||||
|
||||
<nav class="navbar navbar-expand-lg navbar-light navbar-sticky">
|
||||
<div class="container">
|
||||
<a class="navbar-brand brand-logo" href="#">XUPER MALL</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#">Deals</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#">About</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
<section class="hero-section text-center">
|
||||
<div class="container">
|
||||
<h1 class="hero-title">Find it. Compare it. Save on it.</h1>
|
||||
<p class="hero-subtitle">Your ultimate real-time price comparison hub.</p>
|
||||
<div class="search-bar-wrapper">
|
||||
<form action="search_results.php" method="GET" class="d-flex">
|
||||
<i class="search-icon" data-feather="search"></i>
|
||||
<input type="text" name="query" class="form-control search-input" placeholder="Search for products, movies, food...">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="category-section py-5">
|
||||
<div class="container">
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<a href="category.php?name=ecommerce" class="category-card d-block">
|
||||
<i class="card-icon" data-feather="shopping-bag"></i>
|
||||
<h3 class="card-title">E-Commerce</h3>
|
||||
<p class="card-text">Amazon, Flipkart & More</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<a href="category.php?name=food" class="category-card d-block">
|
||||
<i class="card-icon" data-feather="coffee"></i>
|
||||
<h3 class="card-title">Food Delivery</h3>
|
||||
<p class="card-text">Zomato, Swiggy & More</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<a href="category.php?name=movies" class="category-card d-block">
|
||||
<i class="card-icon" data-feather="film"></i>
|
||||
<h3 class="card-title">Movie Tickets</h3>
|
||||
<p class="card-text">BookMyShow, Paytm & More</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<a href="category.php?name=delivery" class="category-card d-block">
|
||||
<i class="card-icon" data-feather="truck"></i>
|
||||
<h3 class="card-title">30-Min Delivery</h3>
|
||||
<p class="card-text">Blinkit, Instamart & More</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="footer mt-auto py-3">
|
||||
<div class="container text-center">
|
||||
<span class="text-muted">© <?php echo date("Y"); ?> XUPER MALL. All rights reserved.</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="https://unpkg.com/feather-icons"></script>
|
||||
<script>
|
||||
feather.replace()
|
||||
</script>
|
||||
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
|
||||
</body>
|
||||
</html>
|
||||
31
integrations/AmazonAdapter.php
Normal file
31
integrations/AmazonAdapter.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
class AmazonAdapter {
|
||||
public function fetchProductPrice($productIdOrQuery) {
|
||||
// Mock data
|
||||
return [
|
||||
'original_price' => rand(100, 1000) / 10,
|
||||
'discounted_price' => rand(80, 900) / 10,
|
||||
'coupon_price' => rand(1, 50) / 10,
|
||||
'rating' => rand(10, 50) / 10,
|
||||
'url' => 'https://www.amazon.com/s?k=' . urlencode($productIdOrQuery),
|
||||
];
|
||||
}
|
||||
|
||||
public function fetchCoupons() {
|
||||
// Mock data
|
||||
return [
|
||||
['code' => 'AMAZON10', 'discount' => 10]
|
||||
];
|
||||
}
|
||||
|
||||
public function fetchRatings() {
|
||||
// Mock data
|
||||
return 4.5;
|
||||
}
|
||||
|
||||
public function resolveProductURL($productIdOrQuery) {
|
||||
// Mock data
|
||||
return "https://www.amazon.com/s?k=" . urlencode($productIdOrQuery);
|
||||
}
|
||||
}
|
||||
1
integrations/BlinkitAdapter.php
Normal file
1
integrations/BlinkitAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class BlinkitAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/BookMyShowAdapter.php
Normal file
1
integrations/BookMyShowAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class BookMyShowAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/FlipkartAdapter.php
Normal file
1
integrations/FlipkartAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class FlipkartAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/InstamartAdapter.php
Normal file
1
integrations/InstamartAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class InstamartAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/JiomartAdapter.php
Normal file
1
integrations/JiomartAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class JiomartAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/MagicpinAdapter.php
Normal file
1
integrations/MagicpinAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class MagicpinAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/MyntraAdapter.php
Normal file
1
integrations/MyntraAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class MyntraAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/PVRAdapter.php
Normal file
1
integrations/PVRAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class PVRAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/PaytmMoviesAdapter.php
Normal file
1
integrations/PaytmMoviesAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class PaytmMoviesAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/SwiggyAdapter.php
Normal file
1
integrations/SwiggyAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class SwiggyAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
1
integrations/ZomatoAdapter.php
Normal file
1
integrations/ZomatoAdapter.php
Normal file
@ -0,0 +1 @@
|
||||
<?php class ZomatoAdapter { public function fetchProductPrice($id) { return null; } public function fetchCoupons() { return []; } public function fetchRatings() { return null; } public function resolveProductURL($id) { return ''; } }
|
||||
158
search_results.php
Normal file
158
search_results.php
Normal file
@ -0,0 +1,158 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/db/config.php';
|
||||
|
||||
$query = $_GET['query'] ?? '';
|
||||
$sort = $_GET['sort'] ?? 'relevance';
|
||||
$filter_brand = $_GET['filter_brand'] ?? '';
|
||||
|
||||
$results = [];
|
||||
$brands = [];
|
||||
|
||||
if (!empty($query)) {
|
||||
$pdo = db();
|
||||
|
||||
// Base query for product search
|
||||
$sql = "SELECT DISTINCT p.id, p.name, p.brand, p.image_url FROM products p JOIN product_listings pl ON p.id = pl.product_id WHERE MATCH(p.name, p.brand) AGAINST(? IN BOOLEAN MODE)";
|
||||
$params = ["*" . $query . "*"];
|
||||
|
||||
// Add brand filter
|
||||
if (!empty($filter_brand)) {
|
||||
$sql .= " AND p.brand = ?";
|
||||
$params[] = $filter_brand;
|
||||
}
|
||||
|
||||
// Get all possible brands for the current query to populate the filter dropdown
|
||||
$brand_stmt = $pdo->prepare("SELECT DISTINCT brand FROM products WHERE MATCH(name, brand) AGAINST(? IN BOOLEAN MODE) AND brand IS NOT NULL ORDER BY brand");
|
||||
$brand_stmt->execute(["*" . $query . "*"]);
|
||||
$brands = $brand_stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
// Sorting logic
|
||||
switch ($sort) {
|
||||
case 'price_asc':
|
||||
$sql .= " ORDER BY (SELECT MIN(effective_price) FROM product_listings WHERE product_id = p.id) ASC";
|
||||
break;
|
||||
case 'price_desc':
|
||||
$sql .= " ORDER BY (SELECT MIN(effective_price) FROM product_listings WHERE product_id = p.id) DESC";
|
||||
break;
|
||||
case 'rating':
|
||||
$sql .= " ORDER BY (SELECT AVG(rating) FROM product_listings WHERE product_id = p.id) DESC";
|
||||
break;
|
||||
default:
|
||||
// Default is relevance, no extra ORDER BY needed for MATCH...AGAINST
|
||||
break;
|
||||
}
|
||||
|
||||
// 1. Search for products
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$product_ids = array_column($products, 'id');
|
||||
if (!empty($product_ids)) {
|
||||
$placeholders = implode(',', array_fill(0, count($product_ids), '?'));
|
||||
$stmt = $pdo->prepare("SELECT *, pl.id as listing_id, plat.name as platform_name FROM product_listings pl JOIN platforms plat ON pl.platform_id = plat.id WHERE pl.product_id IN ($placeholders)");
|
||||
$stmt->execute($product_ids);
|
||||
$listings = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$listings_by_product = [];
|
||||
foreach ($listings as $listing) {
|
||||
$listings_by_product[$listing['product_id']][] = $listing;
|
||||
}
|
||||
|
||||
foreach ($products as $product) {
|
||||
$product['listings'] = $listings_by_product[$product['id']] ?? [];
|
||||
if (!empty($product['listings'])) {
|
||||
$cheapest = array_reduce($product['listings'], fn($c, $i) => ($c === null || $i['effective_price'] < $c['effective_price']) ? $i : $c);
|
||||
$product['cheapest_price'] = $cheapest['effective_price'];
|
||||
$product['badge'] = $cheapest['badge'];
|
||||
}
|
||||
$results[] = $product;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Search Results for "<?php echo htmlspecialchars($query); ?>" - XUPER MALL</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container mt-5">
|
||||
<a href="index.php" class="text-decoration-none">← Back to Home</a>
|
||||
<h1 class="my-4">Search Results for "<?php echo htmlspecialchars($query); ?>"</h1>
|
||||
|
||||
<form method="GET" action="search_results.php" class="row g-3 mb-4 align-items-center bg-light p-3 rounded">
|
||||
<input type="hidden" name="query" value="<?php echo htmlspecialchars($query); ?>">
|
||||
<div class="col-md-4">
|
||||
<label for="sort" class="form-label">Sort by</label>
|
||||
<select name="sort" id="sort" class="form-select">
|
||||
<option value="relevance" <?php if ($sort == 'relevance') echo 'selected'; ?>>Relevance</option>
|
||||
<option value="price_asc" <?php if ($sort == 'price_asc') echo 'selected'; ?>>Price: Low to High</option>
|
||||
<option value="price_desc" <?php if ($sort == 'price_desc') echo 'selected'; ?>>Price: High to Low</option>
|
||||
<option value="rating" <?php if ($sort == 'rating') echo 'selected'; ?>>Rating</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="filter_brand" class="form-label">Brand</label>
|
||||
<select name="filter_brand" id="filter_brand" class="form-select">
|
||||
<option value="">All Brands</option>
|
||||
<?php foreach ($brands as $brand): ?>
|
||||
<option value="<?php echo htmlspecialchars($brand); ?>" <?php if ($filter_brand == $brand) echo 'selected'; ?>><?php echo htmlspecialchars($brand); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary w-100">Apply</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<?php if (empty($results)): ?>
|
||||
<div class="alert alert-info">No products found matching your search.</div>
|
||||
<?php else: ?>
|
||||
<div class="row g-4">
|
||||
<?php foreach ($results as $product): ?>
|
||||
<div class="col-12">
|
||||
<div class="card product-card-list">
|
||||
<div class="row g-0">
|
||||
<div class="col-md-2">
|
||||
<img src="<?php echo htmlspecialchars($product['image_url'] ?? 'https://via.placeholder.com/150'); ?>" class="img-fluid rounded-start" alt="<?php echo htmlspecialchars($product['name']); ?>">
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><?php echo htmlspecialchars($product['name']); ?></h5>
|
||||
<p class="card-text text-muted"><?php echo htmlspecialchars($product['brand']); ?></p>
|
||||
<p class="card-text">From: <span class="fw-bold text-success">$<?php echo htmlspecialchars($product['cheapest_price'] ?? 'N/A'); ?></span></p>
|
||||
<?php if (!empty($product['badge'])): ?>
|
||||
<span class="badge bg-info"><?php echo htmlspecialchars($product['badge']); ?></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card-body">
|
||||
<h6 class="mb-2">Available on:</h6>
|
||||
<ul class="list-group list-group-flush">
|
||||
<?php foreach ($product['listings'] as $listing): ?>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<a href="<?php echo htmlspecialchars($listing['product_url']); ?>" target="_blank" rel="noopener noreferrer">
|
||||
<?php echo htmlspecialchars($listing['platform_name']); ?>
|
||||
</a>
|
||||
<span class="fw-bold">$<?php echo htmlspecialchars($listing['effective_price']); ?></span>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
105
sync.php
Normal file
105
sync.php
Normal file
@ -0,0 +1,105 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/vendor/autoload.php';
|
||||
require_once __DIR__ . '/db/config.php';
|
||||
|
||||
// Include all adapters
|
||||
foreach (glob(__DIR__ . '/integrations/*Adapter.php') as $filename) {
|
||||
require_once $filename;
|
||||
}
|
||||
|
||||
function calculate_effective_price($listing) {
|
||||
return min($listing['original_price'], $listing['discounted_price'], $listing['coupon_price']);
|
||||
}
|
||||
|
||||
function calculate_final_score($listing) {
|
||||
// A simple scoring algorithm, can be improved
|
||||
$price_score = 100 - (calculate_effective_price($listing) / 10); // Lower price is better
|
||||
$rating_score = $listing['rating'] * 20; // Higher rating is better
|
||||
return $price_score + $rating_score;
|
||||
}
|
||||
|
||||
function sync_data() {
|
||||
$pdo = db();
|
||||
$products = $pdo->query("SELECT * FROM products")->fetchAll(PDO::FETCH_ASSOC);
|
||||
$platforms = $pdo->query("SELECT * FROM platforms")->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$adapters = [];
|
||||
foreach ($platforms as $platform) {
|
||||
$class_name = ucfirst($platform['slug']) . 'Adapter';
|
||||
if (class_exists($class_name)) {
|
||||
$adapters[$platform['id']] = new $class_name();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($products as $product) {
|
||||
$cheapest_listing = null;
|
||||
$top_rated_listing = null;
|
||||
$best_deal_listing = null;
|
||||
|
||||
foreach ($platforms as $platform) {
|
||||
if (!isset($adapters[$platform['id']])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$adapter = $adapters[$platform['id']];
|
||||
$price_data = $adapter->fetchProductPrice($product['name']);
|
||||
|
||||
// Prepare listing data
|
||||
$listing_data = [
|
||||
'product_id' => $product['id'],
|
||||
'platform_id' => $platform['id'],
|
||||
'original_price' => $price_data['original_price'],
|
||||
'discounted_price' => $price_data['discounted_price'],
|
||||
'coupon_price' => $price_data['coupon_price'],
|
||||
'rating' => $price_data['rating'],
|
||||
'product_url' => $price_data['url'],
|
||||
'last_synced_at' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
$listing_data['effective_price'] = calculate_effective_price($listing_data);
|
||||
$listing_data['final_score'] = calculate_final_score($listing_data);
|
||||
|
||||
// Insert or update listing
|
||||
$stmt = $pdo->prepare("SELECT id FROM product_listings WHERE product_id = :product_id AND platform_id = :platform_id");
|
||||
$stmt->execute(['product_id' => $product['id'], 'platform_id' => $platform['id']]);
|
||||
$existing_listing_id = $stmt->fetchColumn();
|
||||
|
||||
if ($existing_listing_id) {
|
||||
$sql = "UPDATE product_listings SET original_price = :original_price, discounted_price = :discounted_price, coupon_price = :coupon_price, rating = :rating, product_url = :product_url, last_synced_at = :last_synced_at, effective_price = :effective_price, final_score = :final_score WHERE id = :id";
|
||||
$listing_data['id'] = $existing_listing_id;
|
||||
} else {
|
||||
$sql = "INSERT INTO product_listings (product_id, platform_id, original_price, discounted_price, coupon_price, rating, product_url, last_synced_at, effective_price, final_score) VALUES (:product_id, :platform_id, :original_price, :discounted_price, :coupon_price, :rating, :product_url, :last_synced_at, :effective_price, :final_score)";
|
||||
}
|
||||
$pdo->prepare($sql)->execute($listing_data);
|
||||
$listing_id = $existing_listing_id ?: $pdo->lastInsertId();
|
||||
|
||||
// Badge logic
|
||||
$listing_data['id'] = $listing_id;
|
||||
if (!$cheapest_listing || $listing_data['effective_price'] < $cheapest_listing['effective_price']) {
|
||||
$cheapest_listing = $listing_data;
|
||||
}
|
||||
if (!$top_rated_listing || $listing_data['rating'] > $top_rated_listing['rating']) {
|
||||
$top_rated_listing = $listing_data;
|
||||
}
|
||||
if (!$best_deal_listing || $listing_data['final_score'] > $best_deal_listing['final_score']) {
|
||||
$best_deal_listing = $listing_data;
|
||||
}
|
||||
}
|
||||
|
||||
// Update badges
|
||||
$pdo->prepare("UPDATE product_listings SET badge = NULL WHERE product_id = ?")->execute([$product['id']]);
|
||||
if ($cheapest_listing) {
|
||||
$pdo->prepare("UPDATE product_listings SET badge = 'CHEAPEST' WHERE id = ?")->execute([$cheapest_listing['id']]);
|
||||
}
|
||||
if ($top_rated_listing) {
|
||||
$pdo->prepare("UPDATE product_listings SET badge = CASE WHEN badge IS NULL THEN 'TOP RATED' ELSE CONCAT(badge, ', TOP RATED') END WHERE id = ?")->execute([$top_rated_listing['id']]);
|
||||
}
|
||||
if ($best_deal_listing) {
|
||||
$pdo->prepare("UPDATE product_listings SET badge = CASE WHEN badge IS NULL THEN 'BEST DEAL' ELSE CONCAT(badge, ', BEST DEAL') END WHERE id = ?")->execute([$best_deal_listing['id']]);
|
||||
}
|
||||
}
|
||||
|
||||
echo "Sync completed successfully.\n";
|
||||
}
|
||||
|
||||
sync_data();
|
||||
22
vendor/autoload.php
vendored
Normal file
22
vendor/autoload.php
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
if (PHP_VERSION_ID < 50600) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, $err);
|
||||
} elseif (!headers_sent()) {
|
||||
echo $err;
|
||||
}
|
||||
}
|
||||
throw new RuntimeException($err);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit06a246fb7fd541d754d977d9b5f184ae::getLoader();
|
||||
579
vendor/composer/ClassLoader.php
vendored
Normal file
579
vendor/composer/ClassLoader.php
vendored
Normal file
@ -0,0 +1,579 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see https://www.php-fig.org/psr/psr-0/
|
||||
* @see https://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
/** @var \Closure(string):void */
|
||||
private static $includeFile;
|
||||
|
||||
/** @var string|null */
|
||||
private $vendorDir;
|
||||
|
||||
// PSR-4
|
||||
/**
|
||||
* @var array<string, array<string, int>>
|
||||
*/
|
||||
private $prefixLengthsPsr4 = array();
|
||||
/**
|
||||
* @var array<string, list<string>>
|
||||
*/
|
||||
private $prefixDirsPsr4 = array();
|
||||
/**
|
||||
* @var list<string>
|
||||
*/
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
/**
|
||||
* List of PSR-0 prefixes
|
||||
*
|
||||
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||
*
|
||||
* @var array<string, array<string, list<string>>>
|
||||
*/
|
||||
private $prefixesPsr0 = array();
|
||||
/**
|
||||
* @var list<string>
|
||||
*/
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
/** @var bool */
|
||||
private $useIncludePath = false;
|
||||
|
||||
/**
|
||||
* @var array<string, string>
|
||||
*/
|
||||
private $classMap = array();
|
||||
|
||||
/** @var bool */
|
||||
private $classMapAuthoritative = false;
|
||||
|
||||
/**
|
||||
* @var array<string, bool>
|
||||
*/
|
||||
private $missingClasses = array();
|
||||
|
||||
/** @var string|null */
|
||||
private $apcuPrefix;
|
||||
|
||||
/**
|
||||
* @var array<string, self>
|
||||
*/
|
||||
private static $registeredLoaders = array();
|
||||
|
||||
/**
|
||||
* @param string|null $vendorDir
|
||||
*/
|
||||
public function __construct($vendorDir = null)
|
||||
{
|
||||
$this->vendorDir = $vendorDir;
|
||||
self::initializeIncludeClosure();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, list<string>>
|
||||
*/
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, list<string>>
|
||||
*/
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string> Array of classname => path
|
||||
*/
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string> $classMap Class to filename map
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param list<string>|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
$paths = (array) $paths;
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
$paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
$paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param list<string>|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
$paths = (array) $paths;
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
$paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
$paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param list<string>|string $paths The PSR-0 base directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param list<string>|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
|
||||
if (null === $this->vendorDir) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($prepend) {
|
||||
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
||||
} else {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
self::$registeredLoaders[$this->vendorDir] = $this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
|
||||
if (null !== $this->vendorDir) {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return true|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
$includeFile = self::$includeFile;
|
||||
$includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||
*
|
||||
* @return array<string, self>
|
||||
*/
|
||||
public static function getRegisteredLoaders()
|
||||
{
|
||||
return self::$registeredLoaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
* @param string $ext
|
||||
* @return string|false
|
||||
*/
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath . '\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private static function initializeIncludeClosure()
|
||||
{
|
||||
if (self::$includeFile !== null) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*
|
||||
* @param string $file
|
||||
* @return void
|
||||
*/
|
||||
self::$includeFile = \Closure::bind(static function($file) {
|
||||
include $file;
|
||||
}, null, null);
|
||||
}
|
||||
}
|
||||
396
vendor/composer/InstalledVersions.php
vendored
Normal file
396
vendor/composer/InstalledVersions.php
vendored
Normal file
@ -0,0 +1,396 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
use Composer\Autoload\ClassLoader;
|
||||
use Composer\Semver\VersionParser;
|
||||
|
||||
/**
|
||||
* This class is copied in every Composer installed project and available to all
|
||||
*
|
||||
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||
*
|
||||
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||
*
|
||||
* @final
|
||||
*/
|
||||
class InstalledVersions
|
||||
{
|
||||
/**
|
||||
* @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
|
||||
* @internal
|
||||
*/
|
||||
private static $selfDir = null;
|
||||
|
||||
/**
|
||||
* @var mixed[]|null
|
||||
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||
*/
|
||||
private static $installed;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private static $installedIsLocalDir;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
private static $canGetVendors;
|
||||
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
private static $installedByVendor = array();
|
||||
|
||||
/**
|
||||
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||
*
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackages()
|
||||
{
|
||||
$packages = array();
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
$packages[] = array_keys($installed['versions']);
|
||||
}
|
||||
|
||||
if (1 === \count($packages)) {
|
||||
return $packages[0];
|
||||
}
|
||||
|
||||
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all package names with a specific type e.g. 'library'
|
||||
*
|
||||
* @param string $type
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackagesByType($type)
|
||||
{
|
||||
$packagesByType = array();
|
||||
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
foreach ($installed['versions'] as $name => $package) {
|
||||
if (isset($package['type']) && $package['type'] === $type) {
|
||||
$packagesByType[] = $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $packagesByType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package is installed
|
||||
*
|
||||
* This also returns true if the package name is provided or replaced by another package
|
||||
*
|
||||
* @param string $packageName
|
||||
* @param bool $includeDevRequirements
|
||||
* @return bool
|
||||
*/
|
||||
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (isset($installed['versions'][$packageName])) {
|
||||
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package satisfies a version constraint
|
||||
*
|
||||
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||
*
|
||||
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||
*
|
||||
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||
* @param string $packageName
|
||||
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||
* @return bool
|
||||
*/
|
||||
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||
{
|
||||
$constraint = $parser->parseConstraints((string) $constraint);
|
||||
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||
|
||||
return $provided->matches($constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||
*
|
||||
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||
* whether a given version of a package is installed, and not just whether it exists
|
||||
*
|
||||
* @param string $packageName
|
||||
* @return string Version constraint usable with composer/semver
|
||||
*/
|
||||
public static function getVersionRanges($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$ranges = array();
|
||||
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||
}
|
||||
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||
}
|
||||
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||
}
|
||||
|
||||
return implode(' || ', $ranges);
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getPrettyVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||
*/
|
||||
public static function getReference($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['reference'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||
*/
|
||||
public static function getInstallPath($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
|
||||
*/
|
||||
public static function getRootPackage()
|
||||
{
|
||||
$installed = self::getInstalled();
|
||||
|
||||
return $installed[0]['root'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw installed.php data for custom implementations
|
||||
*
|
||||
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||
* @return array[]
|
||||
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
|
||||
*/
|
||||
public static function getRawData()
|
||||
{
|
||||
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
self::$installed = include __DIR__ . '/installed.php';
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
|
||||
return self::$installed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||
*
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
public static function getAllRawData()
|
||||
{
|
||||
return self::getInstalled();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets you reload the static array from another file
|
||||
*
|
||||
* This is only useful for complex integrations in which a project needs to use
|
||||
* this class but then also needs to execute another project's autoloader in process,
|
||||
* and wants to ensure both projects have access to their version of installed.php.
|
||||
*
|
||||
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||
* the data it needs from this class, then call reload() with
|
||||
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||
* the project in which it runs can then also use this class safely, without
|
||||
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||
*
|
||||
* @param array[] $data A vendor/composer/installed.php data set
|
||||
* @return void
|
||||
*
|
||||
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
|
||||
*/
|
||||
public static function reload($data)
|
||||
{
|
||||
self::$installed = $data;
|
||||
self::$installedByVendor = array();
|
||||
|
||||
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
|
||||
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
|
||||
// so we have to assume it does not, and that may result in duplicate data being returned when listing
|
||||
// all installed packages for example
|
||||
self::$installedIsLocalDir = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private static function getSelfDir()
|
||||
{
|
||||
if (self::$selfDir === null) {
|
||||
self::$selfDir = strtr(__DIR__, '\\', '/');
|
||||
}
|
||||
|
||||
return self::$selfDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||
*/
|
||||
private static function getInstalled()
|
||||
{
|
||||
if (null === self::$canGetVendors) {
|
||||
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||
}
|
||||
|
||||
$installed = array();
|
||||
$copiedLocalDir = false;
|
||||
|
||||
if (self::$canGetVendors) {
|
||||
$selfDir = self::getSelfDir();
|
||||
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||
$vendorDir = strtr($vendorDir, '\\', '/');
|
||||
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||
$installed[] = self::$installedByVendor[$vendorDir];
|
||||
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||
$required = require $vendorDir.'/composer/installed.php';
|
||||
self::$installedByVendor[$vendorDir] = $required;
|
||||
$installed[] = $required;
|
||||
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
|
||||
self::$installed = $required;
|
||||
self::$installedIsLocalDir = true;
|
||||
}
|
||||
}
|
||||
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
|
||||
$copiedLocalDir = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||
$required = require __DIR__ . '/installed.php';
|
||||
self::$installed = $required;
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
|
||||
if (self::$installed !== array() && !$copiedLocalDir) {
|
||||
$installed[] = self::$installed;
|
||||
}
|
||||
|
||||
return $installed;
|
||||
}
|
||||
}
|
||||
21
vendor/composer/LICENSE
vendored
Normal file
21
vendor/composer/LICENSE
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
10
vendor/composer/autoload_classmap.php
vendored
Normal file
10
vendor/composer/autoload_classmap.php
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
);
|
||||
10
vendor/composer/autoload_files.php
vendored
Normal file
10
vendor/composer/autoload_files.php
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
// autoload_files.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||
);
|
||||
9
vendor/composer/autoload_namespaces.php
vendored
Normal file
9
vendor/composer/autoload_namespaces.php
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
);
|
||||
11
vendor/composer/autoload_psr4.php
vendored
Normal file
11
vendor/composer/autoload_psr4.php
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
||||
'Faker\\' => array($vendorDir . '/fakerphp/faker/src/Faker'),
|
||||
);
|
||||
50
vendor/composer/autoload_real.php
vendored
Normal file
50
vendor/composer/autoload_real.php
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit06a246fb7fd541d754d977d9b5f184ae
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Composer\Autoload\ClassLoader
|
||||
*/
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
require __DIR__ . '/platform_check.php';
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit06a246fb7fd541d754d977d9b5f184ae', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit06a246fb7fd541d754d977d9b5f184ae', 'loadClassLoader'));
|
||||
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae::getInitializer($loader));
|
||||
|
||||
$loader->register(true);
|
||||
|
||||
$filesToLoad = \Composer\Autoload\ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae::$files;
|
||||
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||
|
||||
require $file;
|
||||
}
|
||||
}, null, null);
|
||||
foreach ($filesToLoad as $fileIdentifier => $file) {
|
||||
$requireFile($fileIdentifier, $file);
|
||||
}
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
48
vendor/composer/autoload_static.php
vendored
Normal file
48
vendor/composer/autoload_static.php
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae
|
||||
{
|
||||
public static $files = array (
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
||||
);
|
||||
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
'P' =>
|
||||
array (
|
||||
'Psr\\Container\\' => 14,
|
||||
),
|
||||
'F' =>
|
||||
array (
|
||||
'Faker\\' => 6,
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'Psr\\Container\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/psr/container/src',
|
||||
),
|
||||
'Faker\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/fakerphp/faker/src/Faker',
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInit06a246fb7fd541d754d977d9b5f184ae::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
198
vendor/composer/installed.json
vendored
Normal file
198
vendor/composer/installed.json
vendored
Normal file
@ -0,0 +1,198 @@
|
||||
{
|
||||
"packages": [
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"version_normalized": "1.24.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"install-path": "../fakerphp/faker"
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
"version": "2.0.2",
|
||||
"version_normalized": "2.0.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/container.git",
|
||||
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.4.0"
|
||||
},
|
||||
"time": "2021-11-05T16:47:00+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Container\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "https://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||
"homepage": "https://github.com/php-fig/container",
|
||||
"keywords": [
|
||||
"PSR-11",
|
||||
"container",
|
||||
"container-interface",
|
||||
"container-interop",
|
||||
"psr"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/php-fig/container/issues",
|
||||
"source": "https://github.com/php-fig/container/tree/2.0.2"
|
||||
},
|
||||
"install-path": "../psr/container"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
"version": "v3.6.0",
|
||||
"version_normalized": "3.6.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/deprecation-contracts.git",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.1"
|
||||
},
|
||||
"time": "2024-09-25T14:21:43+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"thanks": {
|
||||
"url": "https://github.com/symfony/contracts",
|
||||
"name": "symfony/contracts"
|
||||
},
|
||||
"branch-alias": {
|
||||
"dev-main": "3.6-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"function.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "A generic function and convention to trigger deprecation notices",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"install-path": "../symfony/deprecation-contracts"
|
||||
}
|
||||
],
|
||||
"dev": true,
|
||||
"dev-package-names": []
|
||||
}
|
||||
50
vendor/composer/installed.php
vendored
Normal file
50
vendor/composer/installed.php
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
<?php return array(
|
||||
'root' => array(
|
||||
'name' => '__root__',
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => '84efa2fe150e314ad2cb51e9200a66c25409ee7c',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'dev' => true,
|
||||
),
|
||||
'versions' => array(
|
||||
'__root__' => array(
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => '84efa2fe150e314ad2cb51e9200a66c25409ee7c',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'fakerphp/faker' => array(
|
||||
'pretty_version' => 'v1.24.1',
|
||||
'version' => '1.24.1.0',
|
||||
'reference' => 'e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../fakerphp/faker',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'psr/container' => array(
|
||||
'pretty_version' => '2.0.2',
|
||||
'version' => '2.0.2.0',
|
||||
'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../psr/container',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'symfony/deprecation-contracts' => array(
|
||||
'pretty_version' => 'v3.6.0',
|
||||
'version' => '3.6.0.0',
|
||||
'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
),
|
||||
);
|
||||
25
vendor/composer/platform_check.php
vendored
Normal file
25
vendor/composer/platform_check.php
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
// platform_check.php @generated by Composer
|
||||
|
||||
$issues = array();
|
||||
|
||||
if (!(PHP_VERSION_ID >= 80100)) {
|
||||
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.';
|
||||
}
|
||||
|
||||
if ($issues) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
|
||||
} elseif (!headers_sent()) {
|
||||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
||||
}
|
||||
}
|
||||
throw new \RuntimeException(
|
||||
'Composer detected issues in your platform: ' . implode(' ', $issues)
|
||||
);
|
||||
}
|
||||
209
vendor/fakerphp/faker/CHANGELOG.md
vendored
Normal file
209
vendor/fakerphp/faker/CHANGELOG.md
vendored
Normal file
@ -0,0 +1,209 @@
|
||||
# CHANGELOG
|
||||
|
||||
## [Unreleased](https://github.com/FakerPHP/Faker/compare/v1.24.0...1.24.1)
|
||||
|
||||
- Removed domain `gmail.com.au` from `Provider\en_AU\Internet` (#886)
|
||||
|
||||
## [2024-11-09, v1.24.0](https://github.com/FakerPHP/Faker/compare/v1.23.1..v1.24.0)
|
||||
|
||||
- Fix internal deprecations in Doctrine's populator by @gnutix in (#889)
|
||||
- Fix mobile phone number pattern for France by @ker0x in (#859)
|
||||
- PHP 8.4 Support by @Jubeki in (#904)
|
||||
|
||||
- Added support for PHP 8.4 (#904)
|
||||
|
||||
## [2023-09-29, v1.23.1](https://github.com/FakerPHP/Faker/compare/v1.23.0..v1.23.1)
|
||||
|
||||
- Fixed double `а` female lastName in `ru_RU/Person::name()` (#832)
|
||||
- Fixed polish license plates (#685)
|
||||
- Stopped using `static` in callables in `Provider\pt_BR\PhoneNumber` (#785)
|
||||
- Fixed incorrect female name (#794)
|
||||
- Stopped using the deprecated `MT_RAND_PHP` constant to seed the random generator on PHP 8.3 (#844)
|
||||
|
||||
## [2023-06-12, v1.23.0](https://github.com/FakerPHP/Faker/compare/v1.22.0..v1.23.0)
|
||||
|
||||
- Update `randomElements` to return random number of elements when no count is provided (#658)
|
||||
|
||||
## [2023-05-14, v1.22.0](https://github.com/FakerPHP/Faker/compare/v1.21.0..v1.22.0)
|
||||
|
||||
- Fixed `randomElements()` to accept empty iterator (#605)
|
||||
- Added support for passing an `Enum` to `randomElement()` and `randomElements()` (#620)
|
||||
- Started rejecting invalid arguments passed to `randomElement()` and `randomElements()` (#642)
|
||||
|
||||
## [2022-12-13, v1.21.0](https://github.com/FakerPHP/Faker/compare/v1.20.0..v1.21.0)
|
||||
|
||||
- Dropped support for PHP 7.1, 7.2, and 7.3 (#543)
|
||||
- Added support for PHP 8.2 (#528)
|
||||
|
||||
## [2022-07-20, v1.20.0](https://github.com/FakerPHP/Faker/compare/v1.19.0..v1.20.0)
|
||||
|
||||
- Fixed typo in French phone number (#452)
|
||||
- Fixed some Hungarian naming bugs (#451)
|
||||
- Fixed bug where the NL-BE VAT generation was incorrect (#455)
|
||||
- Improve Turkish phone numbers for E164 and added landline support (#460)
|
||||
- Add Microsoft Edge User Agent (#464)
|
||||
- Added option to set image formats on Faker\Provider\Image (#473)
|
||||
- Added support for French color translations (#466)
|
||||
- Support filtering timezones by country code (#480)
|
||||
- Fixed typo in some greek names (#490)
|
||||
- Marked the Faker\Provider\Image as deprecated
|
||||
|
||||
## [2022-02-02, v1.19.0](https://github.com/FakerPHP/Faker/compare/v1.18.0..v1.19.0)
|
||||
|
||||
- Added color extension to core (#442)
|
||||
- Added conflict with `doctrine/persistence` below version `1.4`
|
||||
- Fix for support on different Doctrine ORM versions (#414)
|
||||
- Fix usage of `Doctrine\Persistence` dependency
|
||||
- Fix CZ Person birthNumber docblock return type (#437)
|
||||
- Fix is_IS Person docbock types (#439)
|
||||
- Fix is_IS Address docbock type (#438)
|
||||
- Fix regexify escape backslash in character class (#434)
|
||||
- Removed UUID from Generator to be able to extend it (#441)
|
||||
|
||||
## [2022-01-23, v1.18.0](https://github.com/FakerPHP/Faker/compare/v1.17.0..v1.18.0)
|
||||
|
||||
- Deprecated UUID, use uuid3 to specify version (#427)
|
||||
- Reset formatters when adding a new provider (#366)
|
||||
- Helper methods to use our custom generators (#155)
|
||||
- Set allow-plugins for Composer 2.2 (#405)
|
||||
- Fix kk_KZ\Person::individualIdentificationNumber generation (#411)
|
||||
- Allow for -> syntax to be used in parsing (#423)
|
||||
- Person->name was missing string return type (#424)
|
||||
- Generate a valid BE TAX number (#415)
|
||||
- Added the UUID extension to Core (#427)
|
||||
|
||||
## [2021-12-05, v1.17.0](https://github.com/FakerPHP/Faker/compare/v1.16.0..v1.17.0)
|
||||
|
||||
- Partial PHP 8.1 compatibility (#373)
|
||||
- Add payment provider for `ne_NP` locale (#375)
|
||||
- Add Egyptian Arabic `ar_EG` locale (#377)
|
||||
- Updated list of South African TLDs (#383)
|
||||
- Fixed formatting of E.164 numbers (#380)
|
||||
- Allow `symfony/deprecation-contracts` `^3.0` (#397)
|
||||
|
||||
## [2021-09-06, v1.16.0](https://github.com/FakerPHP/Faker/compare/v1.15.0..v1.16.0)
|
||||
|
||||
- Add Company extension
|
||||
- Add Address extension
|
||||
- Add Person extension
|
||||
- Add PhoneNumber extension
|
||||
- Add VersionExtension (#350)
|
||||
- Stricter types in Extension\Container and Extension\GeneratorAwareExtension (#345)
|
||||
- Fix deprecated property access in `nl_NL` (#348)
|
||||
- Add support for `psr/container` >= 2.0 (#354)
|
||||
- Add missing union types in Faker\Generator (#352)
|
||||
|
||||
## [2021-07-06, v1.15.0](https://github.com/FakerPHP/Faker/compare/v1.14.1..v1.15.0)
|
||||
|
||||
- Updated the generator phpdoc to help identify magic methods (#307)
|
||||
- Prevent direct access and triggered deprecation warning for "word" (#302)
|
||||
- Updated length on all global e164 numbers (#301)
|
||||
- Updated last names from different source (#312)
|
||||
- Don't generate birth number of '000' for Swedish personal identity (#306)
|
||||
- Add job list for localization id_ID (#339)
|
||||
|
||||
## [2021-03-30, v1.14.1](https://github.com/FakerPHP/Faker/compare/v1.14.0..v1.14.1)
|
||||
|
||||
- Fix where randomNumber and randomFloat would return a 0 value (#291 / #292)
|
||||
|
||||
## [2021-03-29, v1.14.0](https://github.com/FakerPHP/Faker/compare/v1.13.0..v1.14.0)
|
||||
|
||||
- Fix for realText to ensure the text keeps closer to its boundaries (#152)
|
||||
- Fix where regexify produces a random character instead of a literal dot (#135
|
||||
- Deprecate zh_TW methods that only call base methods (#122)
|
||||
- Add used extensions to composer.json as suggestion (#120)
|
||||
- Moved TCNo and INN from calculator to localized providers (#108)
|
||||
- Fix regex dot/backslash issue where a dot is replaced with a backslash as escape character (#206)
|
||||
- Deprecate direct property access (#164)
|
||||
- Added test to assert unique() behaviour (#233)
|
||||
- Added RUC for the es_PE locale (#244)
|
||||
- Test IBAN formats for Latin America (AR/PE/VE) (#260)
|
||||
- Added VAT number for en_GB (#255)
|
||||
- Added new districts for the ne_NP locale (#258)
|
||||
- Fix for U.S. Area Code Generation (#261)
|
||||
- Fix in numerify where a better random numeric value is guaranteed (#256)
|
||||
- Fix e164PhoneNumber to only generate valid phone numbers with valid country codes (#264)
|
||||
- Extract fixtures into separate classes (#234)
|
||||
- Remove french domains that no longer exists (#277)
|
||||
- Fix error that occurs when getting a polish title (#279)
|
||||
- Use valid area codes for North America E164 phone numbers (#280)
|
||||
|
||||
- Adding support for extensions and PSR-11 (#154)
|
||||
- Adding trait for GeneratorAwareExtension (#165)
|
||||
- Added helper class for extension (#162)
|
||||
- Added blood extension to core (#232)
|
||||
- Added barcode extension to core (#252)
|
||||
- Added number extension (#257)
|
||||
|
||||
- Various code style updates
|
||||
- Added a note about our breaking change promise (#273)
|
||||
|
||||
## [2020-12-18, v1.13.0](https://github.com/FakerPHP/Faker/compare/v1.12.1..v1.13.0)
|
||||
|
||||
Several fixes and new additions in this release. A lot of cleanup has been done
|
||||
on the codebase on both tests and consistency.
|
||||
|
||||
- Feature/pl pl license plate (#62)
|
||||
- Fix greek phone numbers (#16)
|
||||
- Move AT payment provider logic to de_AT (#72)
|
||||
- Fix wiktionary links (#73)
|
||||
- Fix AT person links (#74)
|
||||
- Fix AT cities (#75)
|
||||
- Deprecate at_AT providers (#78)
|
||||
- Add Austrian `ssn()` to `Person` provider (#79)
|
||||
- Fix typos in id_ID Address (#83)
|
||||
- Austrian post codes (#86)
|
||||
- Updated Polish data (#70)
|
||||
- Improve Austrian social security number generation (#88)
|
||||
- Move US phone numbers with extension to own method (#91)
|
||||
- Add UK National Insurance number generator (#89)
|
||||
- Fix en_SG phone number generator (#100)
|
||||
- Remove usage of mt_rand (#87)
|
||||
- Remove whitespace from beginning of el_GR phone numbers (#105)
|
||||
- Building numbers can not be 0, 00, 000 (#107)
|
||||
- Add 172.16/12 local IPv4 block (#121)
|
||||
- Add JCB credit card type (#124)
|
||||
- Remove json_decode from emoji generation (#123)
|
||||
- Remove ro street address (#146)
|
||||
|
||||
## [2020-12-11, v1.12.1](https://github.com/FakerPHP/Faker/compare/v1.12.0..v1.12.1)
|
||||
|
||||
This is a security release that prevents a hacker to execute code on the server.
|
||||
|
||||
## [2020-11-23, v1.12.0](https://github.com/FakerPHP/Faker/compare/v1.11.0..v1.12.0)
|
||||
|
||||
- Fix ro_RO first and last day of year calculation offset (#65)
|
||||
- Fix en_NG locale test namespaces that did not match PSR-4 (#57)
|
||||
- Added Singapore NRIC/FIN provider (#56)
|
||||
- Added provider for Lithuanian municipalities (#58)
|
||||
- Added blood types provider (#61)
|
||||
|
||||
## [2020-11-15, v1.11.0](https://github.com/FakerPHP/Faker/compare/v1.10.1..v1.11.0)
|
||||
|
||||
- Added Provider for Swedish Municipalities
|
||||
- Updates to person names in pt_BR
|
||||
- Many code style changes
|
||||
|
||||
## [2020-10-28, v1.10.1](https://github.com/FakerPHP/Faker/compare/v1.10.0..v1.10.1)
|
||||
|
||||
- Updates the Danish addresses in dk_DK
|
||||
- Removed offense company names in nl_NL
|
||||
- Clarify changelog with original fork
|
||||
- Standin replacement for LoremPixel to Placeholder.com (#11)
|
||||
|
||||
## [2020-10-27, v1.10.0](https://github.com/FakerPHP/Faker/compare/v1.9.1..v1.10.0)
|
||||
|
||||
- Support PHP 7.1-8.0
|
||||
- Fix typo in de_DE Company Provider
|
||||
- Fix dateTimeThisYear method
|
||||
- Fix typo in de_DE jobTitleFormat
|
||||
- Fix IBAN generation for CR
|
||||
- Fix typos in greek first names
|
||||
- Fix US job title typo
|
||||
- Do not clear entity manager for doctrine orm populator
|
||||
- Remove persian rude words
|
||||
- Corrections to RU names
|
||||
|
||||
## 2020-10-27, v1.9.1
|
||||
|
||||
- Initial version. Same as `fzaninotto/Faker:v1.9.1`.
|
||||
22
vendor/fakerphp/faker/LICENSE
vendored
Normal file
22
vendor/fakerphp/faker/LICENSE
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
Copyright (c) 2011 François Zaninotto
|
||||
Portions Copyright (c) 2008 Caius Durling
|
||||
Portions Copyright (c) 2008 Adam Royle
|
||||
Portions Copyright (c) 2008 Fiona Burrows
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
114
vendor/fakerphp/faker/README.md
vendored
Normal file
114
vendor/fakerphp/faker/README.md
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
<p style="text-align: center"><img src="https://github.com/FakerPHP/Artwork/raw/main/src/socialcard.png" alt="Social card of FakerPHP"></p>
|
||||
|
||||
# Faker
|
||||
|
||||
[](https://packagist.org/packages/fakerphp/faker)
|
||||
[](https://github.com/FakerPHP/Faker/actions)
|
||||
[](https://shepherd.dev/github/FakerPHP/Faker)
|
||||
[](https://codecov.io/gh/FakerPHP/Faker)
|
||||
|
||||
Faker is a PHP library that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you.
|
||||
|
||||
It's heavily inspired by Perl's [Data::Faker](https://metacpan.org/pod/Data::Faker), and by Ruby's [Faker](https://rubygems.org/gems/faker).
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Installation
|
||||
|
||||
Faker requires PHP >= 7.4.
|
||||
|
||||
```shell
|
||||
composer require fakerphp/faker
|
||||
```
|
||||
|
||||
### Documentation
|
||||
|
||||
Full documentation can be found over on [fakerphp.github.io](https://fakerphp.github.io).
|
||||
|
||||
### Basic Usage
|
||||
|
||||
Use `Faker\Factory::create()` to create and initialize a Faker generator, which can generate data by accessing methods named after the type of data you want.
|
||||
|
||||
```php
|
||||
<?php
|
||||
require_once 'vendor/autoload.php';
|
||||
|
||||
// use the factory to create a Faker\Generator instance
|
||||
$faker = Faker\Factory::create();
|
||||
// generate data by calling methods
|
||||
echo $faker->name();
|
||||
// 'Vince Sporer'
|
||||
echo $faker->email();
|
||||
// 'walter.sophia@hotmail.com'
|
||||
echo $faker->text();
|
||||
// 'Numquam ut mollitia at consequuntur inventore dolorem.'
|
||||
```
|
||||
|
||||
Each call to `$faker->name()` yields a different (random) result. This is because Faker uses `__call()` magic, and forwards `Faker\Generator->$method()` calls to `Faker\Generator->format($method, $attributes)`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
for ($i = 0; $i < 3; $i++) {
|
||||
echo $faker->name() . "\n";
|
||||
}
|
||||
|
||||
// 'Cyrus Boyle'
|
||||
// 'Alena Cummerata'
|
||||
// 'Orlo Bergstrom'
|
||||
```
|
||||
|
||||
## Automated refactoring
|
||||
|
||||
If you already used this library with its properties, they are now deprecated and needs to be replaced by their equivalent methods.
|
||||
|
||||
You can use the provided [Rector](https://github.com/rectorphp/rector) config file to automate the work.
|
||||
|
||||
Run
|
||||
|
||||
```bash
|
||||
composer require --dev rector/rector
|
||||
```
|
||||
|
||||
to install `rector/rector`.
|
||||
|
||||
Run
|
||||
|
||||
```bash
|
||||
vendor/bin/rector process src/ --config vendor/fakerphp/faker/rector-migrate.php
|
||||
```
|
||||
|
||||
to run `rector/rector`.
|
||||
|
||||
*Note:* do not forget to replace `src/` with the path to your source directory.
|
||||
|
||||
Alternatively, import the configuration in your `rector.php` file:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Rector\Config;
|
||||
|
||||
return static function (Config\RectorConfig $rectorConfig): void {
|
||||
$rectorConfig->import('vendor/fakerphp/faker/rector-migrate.php');
|
||||
};
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Faker is released under the MIT License. See [`LICENSE`](LICENSE) for details.
|
||||
|
||||
## Backward compatibility promise
|
||||
|
||||
Faker is using [Semver](https://semver.org/). This means that versions are tagged
|
||||
with MAJOR.MINOR.PATCH. Only a new major version will be allowed to break backward
|
||||
compatibility (BC).
|
||||
|
||||
Classes marked as `@experimental` or `@internal` are not included in our backward compatibility promise.
|
||||
You are also not guaranteed that the value returned from a method is always the
|
||||
same. You are guaranteed that the data type will not change.
|
||||
|
||||
PHP 8 introduced [named arguments](https://wiki.php.net/rfc/named_params), which
|
||||
increased the cost and reduces flexibility for package maintainers. The names of the
|
||||
arguments for methods in Faker is not included in our BC promise.
|
||||
56
vendor/fakerphp/faker/composer.json
vendored
Normal file
56
vendor/fakerphp/faker/composer.json
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"type": "library",
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"faker",
|
||||
"fixtures",
|
||||
"data"
|
||||
],
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-intl": "*",
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Faker\\Test\\": "test/Faker/",
|
||||
"Faker\\Test\\Fixture\\": "test/Fixture/"
|
||||
}
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality.",
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine"
|
||||
},
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"bamarni/composer-bin-plugin": true,
|
||||
"composer/package-versions-deprecated": true
|
||||
},
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
161
vendor/fakerphp/faker/rector-migrate.php
vendored
Normal file
161
vendor/fakerphp/faker/rector-migrate.php
vendored
Normal file
@ -0,0 +1,161 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Faker\Generator;
|
||||
use Rector\Config;
|
||||
use Rector\Transform;
|
||||
|
||||
// This file configures rector/rector to replace all deprecated property usages with their equivalent functions.
|
||||
return static function (Config\RectorConfig $rectorConfig): void {
|
||||
$properties = [
|
||||
'address',
|
||||
'amPm',
|
||||
'asciify',
|
||||
'biasedNumberBetween',
|
||||
'boolean',
|
||||
'bothify',
|
||||
'buildingNumber',
|
||||
'century',
|
||||
'chrome',
|
||||
'city',
|
||||
'citySuffix',
|
||||
'colorName',
|
||||
'company',
|
||||
'companyEmail',
|
||||
'companySuffix',
|
||||
'country',
|
||||
'countryCode',
|
||||
'countryISOAlpha3',
|
||||
'creditCardDetails',
|
||||
'creditCardExpirationDate',
|
||||
'creditCardExpirationDateString',
|
||||
'creditCardNumber',
|
||||
'creditCardType',
|
||||
'currencyCode',
|
||||
'date',
|
||||
'dateTime',
|
||||
'dateTimeAD',
|
||||
'dateTimeBetween',
|
||||
'dateTimeInInterval',
|
||||
'dateTimeThisCentury',
|
||||
'dateTimeThisDecade',
|
||||
'dateTimeThisMonth',
|
||||
'dateTimeThisYear',
|
||||
'dayOfMonth',
|
||||
'dayOfWeek',
|
||||
'domainName',
|
||||
'domainWord',
|
||||
'e164PhoneNumber',
|
||||
'email',
|
||||
'emoji',
|
||||
'file',
|
||||
'firefox',
|
||||
'firstName',
|
||||
'firstNameFemale',
|
||||
'firstNameMale',
|
||||
'freeEmail',
|
||||
'freeEmailDomain',
|
||||
'getDefaultTimezone',
|
||||
'hexColor',
|
||||
'hslColor',
|
||||
'hslColorAsArray',
|
||||
'iban',
|
||||
'image',
|
||||
'imageUrl',
|
||||
'imei',
|
||||
'internetExplorer',
|
||||
'iosMobileToken',
|
||||
'ipv4',
|
||||
'ipv6',
|
||||
'iso8601',
|
||||
'jobTitle',
|
||||
'languageCode',
|
||||
'lastName',
|
||||
'latitude',
|
||||
'lexify',
|
||||
'linuxPlatformToken',
|
||||
'linuxProcessor',
|
||||
'localCoordinates',
|
||||
'localIpv4',
|
||||
'locale',
|
||||
'longitude',
|
||||
'macAddress',
|
||||
'macPlatformToken',
|
||||
'macProcessor',
|
||||
'md5',
|
||||
'month',
|
||||
'monthName',
|
||||
'msedge',
|
||||
'name',
|
||||
'numerify',
|
||||
'opera',
|
||||
'paragraph',
|
||||
'paragraphs',
|
||||
'passthrough',
|
||||
'password',
|
||||
'phoneNumber',
|
||||
'postcode',
|
||||
'randomAscii',
|
||||
'randomDigitNotNull',
|
||||
'randomElement',
|
||||
'randomElements',
|
||||
'randomHtml',
|
||||
'randomKey',
|
||||
'randomLetter',
|
||||
'realText',
|
||||
'realTextBetween',
|
||||
'regexify',
|
||||
'rgbColor',
|
||||
'rgbColorAsArray',
|
||||
'rgbCssColor',
|
||||
'rgbaCssColor',
|
||||
'safari',
|
||||
'safeColorName',
|
||||
'safeEmail',
|
||||
'safeEmailDomain',
|
||||
'safeHexColor',
|
||||
'sentence',
|
||||
'sentences',
|
||||
'setDefaultTimezone',
|
||||
'sha1',
|
||||
'sha256',
|
||||
'shuffle',
|
||||
'shuffleArray',
|
||||
'shuffleString',
|
||||
'slug',
|
||||
'streetAddress',
|
||||
'streetName',
|
||||
'streetSuffix',
|
||||
'swiftBicNumber',
|
||||
'text',
|
||||
'time',
|
||||
'timezone',
|
||||
'title',
|
||||
'titleFemale',
|
||||
'titleMale',
|
||||
'tld',
|
||||
'toLower',
|
||||
'toUpper',
|
||||
'unixTime',
|
||||
'url',
|
||||
'userAgent',
|
||||
'userName',
|
||||
'uuid',
|
||||
'windowsPlatformToken',
|
||||
'word',
|
||||
'words',
|
||||
'year',
|
||||
];
|
||||
|
||||
$rectorConfig->ruleWithConfiguration(
|
||||
Transform\Rector\Assign\PropertyFetchToMethodCallRector::class,
|
||||
array_map(static function (string $property): Transform\ValueObject\PropertyFetchToMethodCall {
|
||||
return new Transform\ValueObject\PropertyFetchToMethodCall(
|
||||
Generator::class,
|
||||
$property,
|
||||
$property,
|
||||
);
|
||||
}, $properties),
|
||||
);
|
||||
};
|
||||
50
vendor/fakerphp/faker/src/Faker/Calculator/Ean.php
vendored
Normal file
50
vendor/fakerphp/faker/src/Faker/Calculator/Ean.php
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
/**
|
||||
* Utility class for validating EAN-8 and EAN-13 numbers
|
||||
*/
|
||||
class Ean
|
||||
{
|
||||
/**
|
||||
* @var string EAN validation pattern
|
||||
*/
|
||||
public const PATTERN = '/^(?:\d{8}|\d{13})$/';
|
||||
|
||||
/**
|
||||
* Computes the checksum of an EAN number.
|
||||
*
|
||||
* @see https://en.wikipedia.org/wiki/International_Article_Number
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function checksum(string $digits)
|
||||
{
|
||||
$sequence = (strlen($digits) + 1) === 8 ? [3, 1] : [1, 3];
|
||||
$sums = 0;
|
||||
|
||||
foreach (str_split($digits) as $n => $digit) {
|
||||
$sums += ((int) $digit) * $sequence[$n % 2];
|
||||
}
|
||||
|
||||
return (10 - $sums % 10) % 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the provided number is an EAN compliant number and that
|
||||
* the checksum is correct.
|
||||
*
|
||||
* @param string $ean An EAN number
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValid(string $ean)
|
||||
{
|
||||
if (!preg_match(self::PATTERN, $ean)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return self::checksum(substr($ean, 0, -1)) === (int) substr($ean, -1);
|
||||
}
|
||||
}
|
||||
69
vendor/fakerphp/faker/src/Faker/Calculator/Iban.php
vendored
Normal file
69
vendor/fakerphp/faker/src/Faker/Calculator/Iban.php
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
class Iban
|
||||
{
|
||||
/**
|
||||
* Generates IBAN Checksum
|
||||
*
|
||||
* @return string Checksum (numeric string)
|
||||
*/
|
||||
public static function checksum(string $iban)
|
||||
{
|
||||
// Move first four digits to end and set checksum to '00'
|
||||
$checkString = substr($iban, 4) . substr($iban, 0, 2) . '00';
|
||||
|
||||
// Replace all letters with their number equivalents
|
||||
$checkString = preg_replace_callback(
|
||||
'/[A-Z]/',
|
||||
static function (array $matches): string {
|
||||
return (string) self::alphaToNumber($matches[0]);
|
||||
},
|
||||
$checkString,
|
||||
);
|
||||
|
||||
// Perform mod 97 and subtract from 98
|
||||
$checksum = 98 - self::mod97($checkString);
|
||||
|
||||
return str_pad($checksum, 2, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts letter to number
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function alphaToNumber(string $char)
|
||||
{
|
||||
return ord($char) - 55;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates mod97 on a numeric string
|
||||
*
|
||||
* @param string $number Numeric string
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function mod97(string $number)
|
||||
{
|
||||
$checksum = (int) $number[0];
|
||||
|
||||
for ($i = 1, $size = strlen($number); $i < $size; ++$i) {
|
||||
$checksum = (10 * $checksum + (int) $number[$i]) % 97;
|
||||
}
|
||||
|
||||
return $checksum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether an IBAN has a valid checksum
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValid(string $iban)
|
||||
{
|
||||
return self::checksum($iban) === substr($iban, 2, 2);
|
||||
}
|
||||
}
|
||||
42
vendor/fakerphp/faker/src/Faker/Calculator/Inn.php
vendored
Normal file
42
vendor/fakerphp/faker/src/Faker/Calculator/Inn.php
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
/**
|
||||
* @deprecated moved to ru_RU\Company, use {@link \Faker\Provider\ru_RU\Company}.
|
||||
* @see \Faker\Provider\ru_RU\Company
|
||||
*/
|
||||
class Inn
|
||||
{
|
||||
/**
|
||||
* Generates INN Checksum
|
||||
*
|
||||
* https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0
|
||||
*
|
||||
* @param string $inn
|
||||
*
|
||||
* @return string Checksum (one digit)
|
||||
*
|
||||
* @deprecated use {@link \Faker\Provider\ru_RU\Company::inn10Checksum()} instead
|
||||
* @see \Faker\Provider\ru_RU\Company::inn10Checksum()
|
||||
*/
|
||||
public static function checksum($inn)
|
||||
{
|
||||
return \Faker\Provider\ru_RU\Company::inn10Checksum($inn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether an INN has a valid checksum
|
||||
*
|
||||
* @param string $inn
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @deprecated use {@link \Faker\Provider\ru_RU\Company::inn10IsValid()} instead
|
||||
* @see \Faker\Provider\ru_RU\Company::inn10IsValid()
|
||||
*/
|
||||
public static function isValid($inn)
|
||||
{
|
||||
return \Faker\Provider\ru_RU\Company::inn10IsValid($inn);
|
||||
}
|
||||
}
|
||||
60
vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php
vendored
Normal file
60
vendor/fakerphp/faker/src/Faker/Calculator/Isbn.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
/**
|
||||
* Utility class for validating ISBN-10
|
||||
*/
|
||||
class Isbn
|
||||
{
|
||||
/**
|
||||
* @var string ISBN-10 validation pattern
|
||||
*/
|
||||
public const PATTERN = '/^\d{9}[0-9X]$/';
|
||||
|
||||
/**
|
||||
* ISBN-10 check digit
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digits
|
||||
*
|
||||
* @param string $input ISBN without check-digit
|
||||
*
|
||||
* @throws \LengthException When wrong input length passed
|
||||
*/
|
||||
public static function checksum(string $input): string
|
||||
{
|
||||
// We're calculating check digit for ISBN-10
|
||||
// so, the length of the input should be 9
|
||||
$length = 9;
|
||||
|
||||
if (strlen($input) !== $length) {
|
||||
throw new \LengthException(sprintf('Input length should be equal to %d', $length));
|
||||
}
|
||||
|
||||
$digits = str_split($input);
|
||||
array_walk(
|
||||
$digits,
|
||||
static function (&$digit, $position): void {
|
||||
$digit = (10 - $position) * $digit;
|
||||
},
|
||||
);
|
||||
$result = (11 - array_sum($digits) % 11) % 11;
|
||||
|
||||
// 10 is replaced by X
|
||||
return ($result < 10) ? (string) $result : 'X';
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the provided number is a valid ISBN-10 number
|
||||
*
|
||||
* @param string $isbn ISBN to check
|
||||
*/
|
||||
public static function isValid(string $isbn): bool
|
||||
{
|
||||
if (!preg_match(self::PATTERN, $isbn)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return self::checksum(substr($isbn, 0, -1)) === substr($isbn, -1);
|
||||
}
|
||||
}
|
||||
72
vendor/fakerphp/faker/src/Faker/Calculator/Luhn.php
vendored
Normal file
72
vendor/fakerphp/faker/src/Faker/Calculator/Luhn.php
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
/**
|
||||
* Utility class for generating and validating Luhn numbers.
|
||||
*
|
||||
* Luhn algorithm is used to validate credit card numbers, IMEI numbers, and
|
||||
* National Provider Identifier numbers.
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/Luhn_algorithm
|
||||
*/
|
||||
class Luhn
|
||||
{
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
private static function checksum(string $number)
|
||||
{
|
||||
$number = (string) $number;
|
||||
$length = strlen($number);
|
||||
$sum = 0;
|
||||
|
||||
for ($i = $length - 1; $i >= 0; $i -= 2) {
|
||||
$sum += $number[$i];
|
||||
}
|
||||
|
||||
for ($i = $length - 2; $i >= 0; $i -= 2) {
|
||||
$sum += array_sum(str_split($number[$i] * 2));
|
||||
}
|
||||
|
||||
return $sum % 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public static function computeCheckDigit(string $partialNumber)
|
||||
{
|
||||
$checkDigit = self::checksum($partialNumber . '0');
|
||||
|
||||
if ($checkDigit === 0) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
return (string) (10 - $checkDigit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a number (partial number + check digit) is Luhn compliant
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValid(string $number)
|
||||
{
|
||||
return self::checksum($number) === 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a Luhn compliant number.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function generateLuhnNumber(string $partialValue)
|
||||
{
|
||||
if (!preg_match('/^\d+$/', $partialValue)) {
|
||||
throw new \InvalidArgumentException('Argument should be an integer.');
|
||||
}
|
||||
|
||||
return $partialValue . Luhn::computeCheckDigit($partialValue);
|
||||
}
|
||||
}
|
||||
43
vendor/fakerphp/faker/src/Faker/Calculator/TCNo.php
vendored
Normal file
43
vendor/fakerphp/faker/src/Faker/Calculator/TCNo.php
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Calculator;
|
||||
|
||||
/**
|
||||
* @deprecated moved to tr_TR\Person, use {@link \Faker\Provider\tr_TR\Person}.
|
||||
* @see \Faker\Provider\tr_TR\Person
|
||||
*/
|
||||
class TCNo
|
||||
{
|
||||
/**
|
||||
* Generates Turkish Identity Number Checksum
|
||||
* Gets first 9 digit as prefix and calculates checksum
|
||||
*
|
||||
* https://en.wikipedia.org/wiki/Turkish_Identification_Number
|
||||
*
|
||||
* @param string $identityPrefix
|
||||
*
|
||||
* @return string Checksum (two digit)
|
||||
*
|
||||
* @deprecated use {@link \Faker\Provider\tr_TR\Person::tcNoChecksum()} instead
|
||||
* @see \Faker\Provider\tr_TR\Person::tcNoChecksum()
|
||||
*/
|
||||
public static function checksum($identityPrefix)
|
||||
{
|
||||
return \Faker\Provider\tr_TR\Person::tcNoChecksum($identityPrefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a TCNo has a valid checksum
|
||||
*
|
||||
* @param string $tcNo
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @deprecated use {@link \Faker\Provider\tr_TR\Person::tcNoIsValid()} instead
|
||||
* @see \Faker\Provider\tr_TR\Person::tcNoIsValid()
|
||||
*/
|
||||
public static function isValid($tcNo)
|
||||
{
|
||||
return \Faker\Provider\tr_TR\Person::tcNoIsValid($tcNo);
|
||||
}
|
||||
}
|
||||
60
vendor/fakerphp/faker/src/Faker/ChanceGenerator.php
vendored
Normal file
60
vendor/fakerphp/faker/src/Faker/ChanceGenerator.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace Faker;
|
||||
|
||||
use Faker\Extension\Extension;
|
||||
|
||||
/**
|
||||
* This generator returns a default value for all called properties
|
||||
* and methods. It works with Faker\Generator::optional().
|
||||
*
|
||||
* @mixin Generator
|
||||
*/
|
||||
class ChanceGenerator
|
||||
{
|
||||
private $generator;
|
||||
private $weight;
|
||||
protected $default;
|
||||
|
||||
/**
|
||||
* @param Extension|Generator $generator
|
||||
*/
|
||||
public function __construct($generator, float $weight, $default = null)
|
||||
{
|
||||
$this->default = $default;
|
||||
$this->generator = $generator;
|
||||
$this->weight = $weight;
|
||||
}
|
||||
|
||||
public function ext(string $id)
|
||||
{
|
||||
return new self($this->generator->ext($id), $this->weight, $this->default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Catch and proxy all generator calls but return only valid values
|
||||
*
|
||||
* @param string $attribute
|
||||
*
|
||||
* @deprecated Use a method instead.
|
||||
*/
|
||||
public function __get($attribute)
|
||||
{
|
||||
trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute);
|
||||
|
||||
return $this->__call($attribute, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*/
|
||||
public function __call($name, $arguments)
|
||||
{
|
||||
if (mt_rand(1, 100) <= (100 * $this->weight)) {
|
||||
return call_user_func_array([$this->generator, $name], $arguments);
|
||||
}
|
||||
|
||||
return $this->default;
|
||||
}
|
||||
}
|
||||
139
vendor/fakerphp/faker/src/Faker/Container/Container.php
vendored
Normal file
139
vendor/fakerphp/faker/src/Faker/Container/Container.php
vendored
Normal file
@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Container;
|
||||
|
||||
use Faker\Extension\Extension;
|
||||
|
||||
/**
|
||||
* A simple implementation of a container.
|
||||
*
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Container implements ContainerInterface
|
||||
{
|
||||
/**
|
||||
* @var array<string, callable|object|string>
|
||||
*/
|
||||
private array $definitions;
|
||||
|
||||
private array $services = [];
|
||||
|
||||
/**
|
||||
* Create a container object with a set of definitions. The array value MUST
|
||||
* produce an object that implements Extension.
|
||||
*
|
||||
* @param array<string, callable|object|string> $definitions
|
||||
*/
|
||||
public function __construct(array $definitions)
|
||||
{
|
||||
$this->definitions = $definitions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a definition from the container.
|
||||
*
|
||||
* @param string $id
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
* @throws \RuntimeException
|
||||
* @throws ContainerException
|
||||
* @throws NotInContainerException
|
||||
*/
|
||||
public function get($id): Extension
|
||||
{
|
||||
if (!is_string($id)) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'First argument of %s::get() must be string',
|
||||
self::class,
|
||||
));
|
||||
}
|
||||
|
||||
if (array_key_exists($id, $this->services)) {
|
||||
return $this->services[$id];
|
||||
}
|
||||
|
||||
if (!$this->has($id)) {
|
||||
throw new NotInContainerException(sprintf(
|
||||
'There is not service with id "%s" in the container.',
|
||||
$id,
|
||||
));
|
||||
}
|
||||
|
||||
$definition = $this->definitions[$id];
|
||||
|
||||
$service = $this->getService($id, $definition);
|
||||
|
||||
if (!$service instanceof Extension) {
|
||||
throw new \RuntimeException(sprintf(
|
||||
'Service resolved for identifier "%s" does not implement the %s" interface.',
|
||||
$id,
|
||||
Extension::class,
|
||||
));
|
||||
}
|
||||
|
||||
$this->services[$id] = $service;
|
||||
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the service from a definition.
|
||||
*
|
||||
* @param callable|object|string $definition
|
||||
*/
|
||||
private function getService(string $id, $definition)
|
||||
{
|
||||
if (is_callable($definition)) {
|
||||
try {
|
||||
return $definition();
|
||||
} catch (\Throwable $e) {
|
||||
throw new ContainerException(
|
||||
sprintf('Error while invoking callable for "%s"', $id),
|
||||
0,
|
||||
$e,
|
||||
);
|
||||
}
|
||||
} elseif (is_object($definition)) {
|
||||
return $definition;
|
||||
} elseif (is_string($definition)) {
|
||||
if (class_exists($definition)) {
|
||||
try {
|
||||
return new $definition();
|
||||
} catch (\Throwable $e) {
|
||||
throw new ContainerException(sprintf('Could not instantiate class "%s"', $id), 0, $e);
|
||||
}
|
||||
}
|
||||
|
||||
throw new ContainerException(sprintf(
|
||||
'Could not instantiate class "%s". Class was not found.',
|
||||
$id,
|
||||
));
|
||||
} else {
|
||||
throw new ContainerException(sprintf(
|
||||
'Invalid type for definition with id "%s"',
|
||||
$id,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the container contains a given identifier.
|
||||
*
|
||||
* @param string $id
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function has($id): bool
|
||||
{
|
||||
if (!is_string($id)) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'First argument of %s::get() must be string',
|
||||
self::class,
|
||||
));
|
||||
}
|
||||
|
||||
return array_key_exists($id, $this->definitions);
|
||||
}
|
||||
}
|
||||
68
vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php
vendored
Normal file
68
vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Container;
|
||||
|
||||
use Faker\Core;
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class ContainerBuilder
|
||||
{
|
||||
/**
|
||||
* @var array<string, callable|object|string>
|
||||
*/
|
||||
private array $definitions = [];
|
||||
|
||||
/**
|
||||
* @param callable|object|string $definition
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function add(string $id, $definition): self
|
||||
{
|
||||
if (!is_string($definition) && !is_callable($definition) && !is_object($definition)) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'First argument to "%s::add()" must be a string, callable or object.',
|
||||
self::class,
|
||||
));
|
||||
}
|
||||
|
||||
$this->definitions[$id] = $definition;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function build(): ContainerInterface
|
||||
{
|
||||
return new Container($this->definitions);
|
||||
}
|
||||
|
||||
private static function defaultExtensions(): array
|
||||
{
|
||||
return [
|
||||
Extension\BarcodeExtension::class => Core\Barcode::class,
|
||||
Extension\BloodExtension::class => Core\Blood::class,
|
||||
Extension\ColorExtension::class => Core\Color::class,
|
||||
Extension\DateTimeExtension::class => Core\DateTime::class,
|
||||
Extension\FileExtension::class => Core\File::class,
|
||||
Extension\NumberExtension::class => Core\Number::class,
|
||||
Extension\UuidExtension::class => Core\Uuid::class,
|
||||
Extension\VersionExtension::class => Core\Version::class,
|
||||
];
|
||||
}
|
||||
|
||||
public static function withDefaultExtensions(): self
|
||||
{
|
||||
$instance = new self();
|
||||
|
||||
foreach (self::defaultExtensions() as $id => $definition) {
|
||||
$instance->add($id, $definition);
|
||||
}
|
||||
|
||||
return $instance;
|
||||
}
|
||||
}
|
||||
14
vendor/fakerphp/faker/src/Faker/Container/ContainerException.php
vendored
Normal file
14
vendor/fakerphp/faker/src/Faker/Container/ContainerException.php
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Container;
|
||||
|
||||
use Psr\Container\ContainerExceptionInterface;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class ContainerException extends \RuntimeException implements ContainerExceptionInterface
|
||||
{
|
||||
}
|
||||
9
vendor/fakerphp/faker/src/Faker/Container/ContainerInterface.php
vendored
Normal file
9
vendor/fakerphp/faker/src/Faker/Container/ContainerInterface.php
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Container;
|
||||
|
||||
use Psr\Container\ContainerInterface as BaseContainerInterface;
|
||||
|
||||
interface ContainerInterface extends BaseContainerInterface
|
||||
{
|
||||
}
|
||||
14
vendor/fakerphp/faker/src/Faker/Container/NotInContainerException.php
vendored
Normal file
14
vendor/fakerphp/faker/src/Faker/Container/NotInContainerException.php
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Container;
|
||||
|
||||
use Psr\Container\NotFoundExceptionInterface;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class NotInContainerException extends \RuntimeException implements NotFoundExceptionInterface
|
||||
{
|
||||
}
|
||||
52
vendor/fakerphp/faker/src/Faker/Core/Barcode.php
vendored
Normal file
52
vendor/fakerphp/faker/src/Faker/Core/Barcode.php
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Calculator;
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Barcode implements Extension\BarcodeExtension
|
||||
{
|
||||
private Extension\NumberExtension $numberExtension;
|
||||
|
||||
public function __construct(?Extension\NumberExtension $numberExtension = null)
|
||||
{
|
||||
$this->numberExtension = $numberExtension ?: new Number();
|
||||
}
|
||||
|
||||
private function ean(int $length = 13): string
|
||||
{
|
||||
$code = Extension\Helper::numerify(str_repeat('#', $length - 1));
|
||||
|
||||
return sprintf('%s%s', $code, Calculator\Ean::checksum($code));
|
||||
}
|
||||
|
||||
public function ean13(): string
|
||||
{
|
||||
return $this->ean();
|
||||
}
|
||||
|
||||
public function ean8(): string
|
||||
{
|
||||
return $this->ean(8);
|
||||
}
|
||||
|
||||
public function isbn10(): string
|
||||
{
|
||||
$code = Extension\Helper::numerify(str_repeat('#', 9));
|
||||
|
||||
return sprintf('%s%s', $code, Calculator\Isbn::checksum($code));
|
||||
}
|
||||
|
||||
public function isbn13(): string
|
||||
{
|
||||
$code = '97' . $this->numberExtension->numberBetween(8, 9) . Extension\Helper::numerify(str_repeat('#', 9));
|
||||
|
||||
return sprintf('%s%s', $code, Calculator\Ean::checksum($code));
|
||||
}
|
||||
}
|
||||
42
vendor/fakerphp/faker/src/Faker/Core/Blood.php
vendored
Normal file
42
vendor/fakerphp/faker/src/Faker/Core/Blood.php
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Blood implements Extension\BloodExtension
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $bloodTypes = ['A', 'AB', 'B', 'O'];
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $bloodRhFactors = ['+', '-'];
|
||||
|
||||
public function bloodType(): string
|
||||
{
|
||||
return Extension\Helper::randomElement($this->bloodTypes);
|
||||
}
|
||||
|
||||
public function bloodRh(): string
|
||||
{
|
||||
return Extension\Helper::randomElement($this->bloodRhFactors);
|
||||
}
|
||||
|
||||
public function bloodGroup(): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s%s',
|
||||
$this->bloodType(),
|
||||
$this->bloodRh(),
|
||||
);
|
||||
}
|
||||
}
|
||||
177
vendor/fakerphp/faker/src/Faker/Core/Color.php
vendored
Normal file
177
vendor/fakerphp/faker/src/Faker/Core/Color.php
vendored
Normal file
@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
use Faker\Extension\Helper;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Color implements Extension\ColorExtension
|
||||
{
|
||||
private Extension\NumberExtension $numberExtension;
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $safeColorNames = [
|
||||
'black', 'maroon', 'green', 'navy', 'olive',
|
||||
'purple', 'teal', 'lime', 'blue', 'silver',
|
||||
'gray', 'yellow', 'fuchsia', 'aqua', 'white',
|
||||
];
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $allColorNames = [
|
||||
'AliceBlue', 'AntiqueWhite', 'Aqua', 'Aquamarine',
|
||||
'Azure', 'Beige', 'Bisque', 'Black', 'BlanchedAlmond',
|
||||
'Blue', 'BlueViolet', 'Brown', 'BurlyWood', 'CadetBlue',
|
||||
'Chartreuse', 'Chocolate', 'Coral', 'CornflowerBlue',
|
||||
'Cornsilk', 'Crimson', 'Cyan', 'DarkBlue', 'DarkCyan',
|
||||
'DarkGoldenRod', 'DarkGray', 'DarkGreen', 'DarkKhaki',
|
||||
'DarkMagenta', 'DarkOliveGreen', 'Darkorange', 'DarkOrchid',
|
||||
'DarkRed', 'DarkSalmon', 'DarkSeaGreen', 'DarkSlateBlue',
|
||||
'DarkSlateGray', 'DarkTurquoise', 'DarkViolet', 'DeepPink',
|
||||
'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick',
|
||||
'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite',
|
||||
'Gold', 'GoldenRod', 'Gray', 'Green', 'GreenYellow', 'HoneyDew',
|
||||
'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender',
|
||||
'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral',
|
||||
'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGreen', 'LightPink',
|
||||
'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSteelBlue',
|
||||
'LightYellow', 'Lime', 'LimeGreen', 'Linen', 'Magenta', 'Maroon', 'MediumAquaMarine',
|
||||
'MediumBlue', 'MediumOrchid', 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue',
|
||||
'MediumSpringGreen', 'MediumTurquoise', 'MediumVioletRed', 'MidnightBlue',
|
||||
'MintCream', 'MistyRose', 'Moccasin', 'NavajoWhite', 'Navy', 'OldLace', 'Olive',
|
||||
'OliveDrab', 'Orange', 'OrangeRed', 'Orchid', 'PaleGoldenRod', 'PaleGreen',
|
||||
'PaleTurquoise', 'PaleVioletRed', 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum',
|
||||
'PowderBlue', 'Purple', 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Salmon',
|
||||
'SandyBrown', 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue',
|
||||
'SlateGray', 'Snow', 'SpringGreen', 'SteelBlue', 'Tan', 'Teal', 'Thistle', 'Tomato',
|
||||
'Turquoise', 'Violet', 'Wheat', 'White', 'WhiteSmoke', 'Yellow', 'YellowGreen',
|
||||
];
|
||||
|
||||
public function __construct(?Extension\NumberExtension $numberExtension = null)
|
||||
{
|
||||
$this->numberExtension = $numberExtension ?: new Number();
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '#fa3cc2'
|
||||
*/
|
||||
public function hexColor(): string
|
||||
{
|
||||
return '#' . str_pad(dechex($this->numberExtension->numberBetween(1, 16777215)), 6, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '#ff0044'
|
||||
*/
|
||||
public function safeHexColor(): string
|
||||
{
|
||||
$color = str_pad(dechex($this->numberExtension->numberBetween(0, 255)), 3, '0', STR_PAD_LEFT);
|
||||
|
||||
return sprintf(
|
||||
'#%s%s%s%s%s%s',
|
||||
$color[0],
|
||||
$color[0],
|
||||
$color[1],
|
||||
$color[1],
|
||||
$color[2],
|
||||
$color[2],
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example 'array(0,255,122)'
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public function rgbColorAsArray(): array
|
||||
{
|
||||
$color = $this->hexColor();
|
||||
|
||||
return [
|
||||
hexdec(substr($color, 1, 2)),
|
||||
hexdec(substr($color, 3, 2)),
|
||||
hexdec(substr($color, 5, 2)),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '0,255,122'
|
||||
*/
|
||||
public function rgbColor(): string
|
||||
{
|
||||
return implode(',', $this->rgbColorAsArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* @example 'rgb(0,255,122)'
|
||||
*/
|
||||
public function rgbCssColor(): string
|
||||
{
|
||||
return sprintf(
|
||||
'rgb(%s)',
|
||||
$this->rgbColor(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example 'rgba(0,255,122,0.8)'
|
||||
*/
|
||||
public function rgbaCssColor(): string
|
||||
{
|
||||
return sprintf(
|
||||
'rgba(%s,%s)',
|
||||
$this->rgbColor(),
|
||||
$this->numberExtension->randomFloat(1, 0, 1),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example 'blue'
|
||||
*/
|
||||
public function safeColorName(): string
|
||||
{
|
||||
return Helper::randomElement($this->safeColorNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example 'NavajoWhite'
|
||||
*/
|
||||
public function colorName(): string
|
||||
{
|
||||
return Helper::randomElement($this->allColorNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '340,50,20'
|
||||
*/
|
||||
public function hslColor(): string
|
||||
{
|
||||
return sprintf(
|
||||
'%s,%s,%s',
|
||||
$this->numberExtension->numberBetween(0, 360),
|
||||
$this->numberExtension->numberBetween(0, 100),
|
||||
$this->numberExtension->numberBetween(0, 100),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example array(340, 50, 20)
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public function hslColorAsArray(): array
|
||||
{
|
||||
return [
|
||||
$this->numberExtension->numberBetween(0, 360),
|
||||
$this->numberExtension->numberBetween(0, 100),
|
||||
$this->numberExtension->numberBetween(0, 100),
|
||||
];
|
||||
}
|
||||
}
|
||||
78
vendor/fakerphp/faker/src/Faker/Core/Coordinates.php
vendored
Normal file
78
vendor/fakerphp/faker/src/Faker/Core/Coordinates.php
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Coordinates implements Extension\Extension
|
||||
{
|
||||
private Extension\NumberExtension $numberExtension;
|
||||
|
||||
public function __construct(?Extension\NumberExtension $numberExtension = null)
|
||||
{
|
||||
$this->numberExtension = $numberExtension ?: new Number();
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '77.147489'
|
||||
*
|
||||
* @return float Uses signed degrees format (returns a float number between -90 and 90)
|
||||
*/
|
||||
public function latitude(float $min = -90.0, float $max = 90.0): float
|
||||
{
|
||||
if ($min < -90 || $max < -90) {
|
||||
throw new \LogicException('Latitude cannot be less that -90.0');
|
||||
}
|
||||
|
||||
if ($min > 90 || $max > 90) {
|
||||
throw new \LogicException('Latitude cannot be greater that 90.0');
|
||||
}
|
||||
|
||||
return $this->randomFloat(6, $min, $max);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example '86.211205'
|
||||
*
|
||||
* @return float Uses signed degrees format (returns a float number between -180 and 180)
|
||||
*/
|
||||
public function longitude(float $min = -180.0, float $max = 180.0): float
|
||||
{
|
||||
if ($min < -180 || $max < -180) {
|
||||
throw new \LogicException('Longitude cannot be less that -180.0');
|
||||
}
|
||||
|
||||
if ($min > 180 || $max > 180) {
|
||||
throw new \LogicException('Longitude cannot be greater that 180.0');
|
||||
}
|
||||
|
||||
return $this->randomFloat(6, $min, $max);
|
||||
}
|
||||
|
||||
/**
|
||||
* @example array('77.147489', '86.211205')
|
||||
*
|
||||
* @return array{latitude: float, longitude: float}
|
||||
*/
|
||||
public function localCoordinates(): array
|
||||
{
|
||||
return [
|
||||
'latitude' => $this->latitude(),
|
||||
'longitude' => $this->longitude(),
|
||||
];
|
||||
}
|
||||
|
||||
private function randomFloat(int $nbMaxDecimals, float $min, float $max): float
|
||||
{
|
||||
if ($min > $max) {
|
||||
throw new \LogicException('Invalid coordinates boundaries');
|
||||
}
|
||||
|
||||
return $this->numberExtension->randomFloat($nbMaxDecimals, $min, $max);
|
||||
}
|
||||
}
|
||||
217
vendor/fakerphp/faker/src/Faker/Core/DateTime.php
vendored
Normal file
217
vendor/fakerphp/faker/src/Faker/Core/DateTime.php
vendored
Normal file
@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension\DateTimeExtension;
|
||||
use Faker\Extension\GeneratorAwareExtension;
|
||||
use Faker\Extension\GeneratorAwareExtensionTrait;
|
||||
use Faker\Extension\Helper;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*
|
||||
* @since 1.20.0
|
||||
*/
|
||||
final class DateTime implements DateTimeExtension, GeneratorAwareExtension
|
||||
{
|
||||
use GeneratorAwareExtensionTrait;
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $centuries = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX', 'XXI'];
|
||||
|
||||
private ?string $defaultTimezone = null;
|
||||
|
||||
/**
|
||||
* Get the POSIX-timestamp of a DateTime, int or string.
|
||||
*
|
||||
* @param \DateTime|float|int|string $until
|
||||
*
|
||||
* @return false|int
|
||||
*/
|
||||
private function getTimestamp($until = 'now')
|
||||
{
|
||||
if (is_numeric($until)) {
|
||||
return (int) $until;
|
||||
}
|
||||
|
||||
if ($until instanceof \DateTime) {
|
||||
return $until->getTimestamp();
|
||||
}
|
||||
|
||||
return strtotime(empty($until) ? 'now' : $until);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a DateTime created based on a POSIX-timestamp.
|
||||
*
|
||||
* @param int $timestamp the UNIX / POSIX-compatible timestamp
|
||||
*/
|
||||
private function getTimestampDateTime(int $timestamp): \DateTime
|
||||
{
|
||||
return new \DateTime('@' . $timestamp);
|
||||
}
|
||||
|
||||
private function resolveTimezone(?string $timezone): string
|
||||
{
|
||||
if ($timezone !== null) {
|
||||
return $timezone;
|
||||
}
|
||||
|
||||
return null === $this->defaultTimezone ? date_default_timezone_get() : $this->defaultTimezone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to set the timezone on a DateTime object.
|
||||
*/
|
||||
private function setTimezone(\DateTime $dateTime, ?string $timezone): \DateTime
|
||||
{
|
||||
$timezone = $this->resolveTimezone($timezone);
|
||||
|
||||
return $dateTime->setTimezone(new \DateTimeZone($timezone));
|
||||
}
|
||||
|
||||
public function dateTime($until = 'now', ?string $timezone = null): \DateTime
|
||||
{
|
||||
return $this->setTimezone(
|
||||
$this->getTimestampDateTime($this->unixTime($until)),
|
||||
$timezone,
|
||||
);
|
||||
}
|
||||
|
||||
public function dateTimeAD($until = 'now', ?string $timezone = null): \DateTime
|
||||
{
|
||||
$min = (PHP_INT_SIZE > 4) ? -62135597361 : -PHP_INT_MAX;
|
||||
|
||||
return $this->setTimezone(
|
||||
$this->getTimestampDateTime($this->generator->numberBetween($min, $this->getTimestamp($until))),
|
||||
$timezone,
|
||||
);
|
||||
}
|
||||
|
||||
public function dateTimeBetween($from = '-30 years', $until = 'now', ?string $timezone = null): \DateTime
|
||||
{
|
||||
$start = $this->getTimestamp($from);
|
||||
$end = $this->getTimestamp($until);
|
||||
|
||||
if ($start > $end) {
|
||||
throw new \InvalidArgumentException('"$from" must be anterior to "$until".');
|
||||
}
|
||||
|
||||
$timestamp = $this->generator->numberBetween($start, $end);
|
||||
|
||||
return $this->setTimezone(
|
||||
$this->getTimestampDateTime($timestamp),
|
||||
$timezone,
|
||||
);
|
||||
}
|
||||
|
||||
public function dateTimeInInterval($from = '-30 years', string $interval = '+5 days', ?string $timezone = null): \DateTime
|
||||
{
|
||||
$intervalObject = \DateInterval::createFromDateString($interval);
|
||||
$datetime = $from instanceof \DateTime ? $from : new \DateTime($from);
|
||||
|
||||
$other = (clone $datetime)->add($intervalObject);
|
||||
|
||||
$begin = min($datetime, $other);
|
||||
$end = $datetime === $begin ? $other : $datetime;
|
||||
|
||||
return $this->dateTimeBetween($begin, $end, $timezone);
|
||||
}
|
||||
|
||||
public function dateTimeThisWeek($until = 'sunday this week', ?string $timezone = null): \DateTime
|
||||
{
|
||||
return $this->dateTimeBetween('monday this week', $until, $timezone);
|
||||
}
|
||||
|
||||
public function dateTimeThisMonth($until = 'last day of this month', ?string $timezone = null): \DateTime
|
||||
{
|
||||
return $this->dateTimeBetween('first day of this month', $until, $timezone);
|
||||
}
|
||||
|
||||
public function dateTimeThisYear($until = 'last day of december', ?string $timezone = null): \DateTime
|
||||
{
|
||||
return $this->dateTimeBetween('first day of january', $until, $timezone);
|
||||
}
|
||||
|
||||
public function dateTimeThisDecade($until = 'now', ?string $timezone = null): \DateTime
|
||||
{
|
||||
$year = floor(date('Y') / 10) * 10;
|
||||
|
||||
return $this->dateTimeBetween("first day of january $year", $until, $timezone);
|
||||
}
|
||||
|
||||
public function dateTimeThisCentury($until = 'now', ?string $timezone = null): \DateTime
|
||||
{
|
||||
$year = floor(date('Y') / 100) * 100;
|
||||
|
||||
return $this->dateTimeBetween("first day of january $year", $until, $timezone);
|
||||
}
|
||||
|
||||
public function date(string $format = 'Y-m-d', $until = 'now'): string
|
||||
{
|
||||
return $this->dateTime($until)->format($format);
|
||||
}
|
||||
|
||||
public function time(string $format = 'H:i:s', $until = 'now'): string
|
||||
{
|
||||
return $this->date($format, $until);
|
||||
}
|
||||
|
||||
public function unixTime($until = 'now'): int
|
||||
{
|
||||
return $this->generator->numberBetween(0, $this->getTimestamp($until));
|
||||
}
|
||||
|
||||
public function iso8601($until = 'now'): string
|
||||
{
|
||||
return $this->date(\DateTime::ISO8601, $until);
|
||||
}
|
||||
|
||||
public function amPm($until = 'now'): string
|
||||
{
|
||||
return $this->date('a', $until);
|
||||
}
|
||||
|
||||
public function dayOfMonth($until = 'now'): string
|
||||
{
|
||||
return $this->date('d', $until);
|
||||
}
|
||||
|
||||
public function dayOfWeek($until = 'now'): string
|
||||
{
|
||||
return $this->date('l', $until);
|
||||
}
|
||||
|
||||
public function month($until = 'now'): string
|
||||
{
|
||||
return $this->date('m', $until);
|
||||
}
|
||||
|
||||
public function monthName($until = 'now'): string
|
||||
{
|
||||
return $this->date('F', $until);
|
||||
}
|
||||
|
||||
public function year($until = 'now'): string
|
||||
{
|
||||
return $this->date('Y', $until);
|
||||
}
|
||||
|
||||
public function century(): string
|
||||
{
|
||||
return Helper::randomElement($this->centuries);
|
||||
}
|
||||
|
||||
public function timezone(?string $countryCode = null): string
|
||||
{
|
||||
if ($countryCode) {
|
||||
$timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::PER_COUNTRY, $countryCode);
|
||||
} else {
|
||||
$timezones = \DateTimeZone::listIdentifiers();
|
||||
}
|
||||
|
||||
return Helper::randomElement($timezones);
|
||||
}
|
||||
}
|
||||
564
vendor/fakerphp/faker/src/Faker/Core/File.php
vendored
Normal file
564
vendor/fakerphp/faker/src/Faker/Core/File.php
vendored
Normal file
@ -0,0 +1,564 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class File implements Extension\FileExtension
|
||||
{
|
||||
/**
|
||||
* MIME types from the apache.org file. Some types are truncated.
|
||||
*
|
||||
* @var array Map of MIME types => file extension(s)
|
||||
*
|
||||
* @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
|
||||
*/
|
||||
private array $mimeTypes = [
|
||||
'application/atom+xml' => 'atom',
|
||||
'application/ecmascript' => 'ecma',
|
||||
'application/emma+xml' => 'emma',
|
||||
'application/epub+zip' => 'epub',
|
||||
'application/java-archive' => 'jar',
|
||||
'application/java-vm' => 'class',
|
||||
'application/javascript' => 'js',
|
||||
'application/json' => 'json',
|
||||
'application/jsonml+json' => 'jsonml',
|
||||
'application/lost+xml' => 'lostxml',
|
||||
'application/mathml+xml' => 'mathml',
|
||||
'application/mets+xml' => 'mets',
|
||||
'application/mods+xml' => 'mods',
|
||||
'application/mp4' => 'mp4s',
|
||||
'application/msword' => ['doc', 'dot'],
|
||||
'application/octet-stream' => [
|
||||
'bin',
|
||||
'dms',
|
||||
'lrf',
|
||||
'mar',
|
||||
'so',
|
||||
'dist',
|
||||
'distz',
|
||||
'pkg',
|
||||
'bpk',
|
||||
'dump',
|
||||
'elc',
|
||||
'deploy',
|
||||
],
|
||||
'application/ogg' => 'ogx',
|
||||
'application/omdoc+xml' => 'omdoc',
|
||||
'application/pdf' => 'pdf',
|
||||
'application/pgp-encrypted' => 'pgp',
|
||||
'application/pgp-signature' => ['asc', 'sig'],
|
||||
'application/pkix-pkipath' => 'pkipath',
|
||||
'application/pkixcmp' => 'pki',
|
||||
'application/pls+xml' => 'pls',
|
||||
'application/postscript' => ['ai', 'eps', 'ps'],
|
||||
'application/pskc+xml' => 'pskcxml',
|
||||
'application/rdf+xml' => 'rdf',
|
||||
'application/reginfo+xml' => 'rif',
|
||||
'application/rss+xml' => 'rss',
|
||||
'application/rtf' => 'rtf',
|
||||
'application/sbml+xml' => 'sbml',
|
||||
'application/vnd.adobe.air-application-installer-package+zip' => 'air',
|
||||
'application/vnd.adobe.xdp+xml' => 'xdp',
|
||||
'application/vnd.adobe.xfdf' => 'xfdf',
|
||||
'application/vnd.ahead.space' => 'ahead',
|
||||
'application/vnd.dart' => 'dart',
|
||||
'application/vnd.data-vision.rdz' => 'rdz',
|
||||
'application/vnd.dece.data' => ['uvf', 'uvvf', 'uvd', 'uvvd'],
|
||||
'application/vnd.dece.ttml+xml' => ['uvt', 'uvvt'],
|
||||
'application/vnd.dece.unspecified' => ['uvx', 'uvvx'],
|
||||
'application/vnd.dece.zip' => ['uvz', 'uvvz'],
|
||||
'application/vnd.denovo.fcselayout-link' => 'fe_launch',
|
||||
'application/vnd.dna' => 'dna',
|
||||
'application/vnd.dolby.mlp' => 'mlp',
|
||||
'application/vnd.dpgraph' => 'dpg',
|
||||
'application/vnd.dreamfactory' => 'dfac',
|
||||
'application/vnd.ds-keypoint' => 'kpxx',
|
||||
'application/vnd.dvb.ait' => 'ait',
|
||||
'application/vnd.dvb.service' => 'svc',
|
||||
'application/vnd.dynageo' => 'geo',
|
||||
'application/vnd.ecowin.chart' => 'mag',
|
||||
'application/vnd.enliven' => 'nml',
|
||||
'application/vnd.epson.esf' => 'esf',
|
||||
'application/vnd.epson.msf' => 'msf',
|
||||
'application/vnd.epson.quickanime' => 'qam',
|
||||
'application/vnd.epson.salt' => 'slt',
|
||||
'application/vnd.epson.ssf' => 'ssf',
|
||||
'application/vnd.ezpix-album' => 'ez2',
|
||||
'application/vnd.ezpix-package' => 'ez3',
|
||||
'application/vnd.fdf' => 'fdf',
|
||||
'application/vnd.fdsn.mseed' => 'mseed',
|
||||
'application/vnd.fdsn.seed' => ['seed', 'dataless'],
|
||||
'application/vnd.flographit' => 'gph',
|
||||
'application/vnd.fluxtime.clip' => 'ftc',
|
||||
'application/vnd.hal+xml' => 'hal',
|
||||
'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx',
|
||||
'application/vnd.ibm.minipay' => 'mpy',
|
||||
'application/vnd.ibm.secure-container' => 'sc',
|
||||
'application/vnd.iccprofile' => ['icc', 'icm'],
|
||||
'application/vnd.igloader' => 'igl',
|
||||
'application/vnd.immervision-ivp' => 'ivp',
|
||||
'application/vnd.kde.karbon' => 'karbon',
|
||||
'application/vnd.kde.kchart' => 'chrt',
|
||||
'application/vnd.kde.kformula' => 'kfo',
|
||||
'application/vnd.kde.kivio' => 'flw',
|
||||
'application/vnd.kde.kontour' => 'kon',
|
||||
'application/vnd.kde.kpresenter' => ['kpr', 'kpt'],
|
||||
'application/vnd.kde.kspread' => 'ksp',
|
||||
'application/vnd.kde.kword' => ['kwd', 'kwt'],
|
||||
'application/vnd.kenameaapp' => 'htke',
|
||||
'application/vnd.kidspiration' => 'kia',
|
||||
'application/vnd.kinar' => ['kne', 'knp'],
|
||||
'application/vnd.koan' => ['skp', 'skd', 'skt', 'skm'],
|
||||
'application/vnd.kodak-descriptor' => 'sse',
|
||||
'application/vnd.las.las+xml' => 'lasxml',
|
||||
'application/vnd.llamagraphics.life-balance.desktop' => 'lbd',
|
||||
'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe',
|
||||
'application/vnd.lotus-1-2-3' => '123',
|
||||
'application/vnd.lotus-approach' => 'apr',
|
||||
'application/vnd.lotus-freelance' => 'pre',
|
||||
'application/vnd.lotus-notes' => 'nsf',
|
||||
'application/vnd.lotus-organizer' => 'org',
|
||||
'application/vnd.lotus-screencam' => 'scm',
|
||||
'application/vnd.mozilla.xul+xml' => 'xul',
|
||||
'application/vnd.ms-artgalry' => 'cil',
|
||||
'application/vnd.ms-cab-compressed' => 'cab',
|
||||
'application/vnd.ms-excel' => [
|
||||
'xls',
|
||||
'xlm',
|
||||
'xla',
|
||||
'xlc',
|
||||
'xlt',
|
||||
'xlw',
|
||||
],
|
||||
'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam',
|
||||
'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb',
|
||||
'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm',
|
||||
'application/vnd.ms-excel.template.macroenabled.12' => 'xltm',
|
||||
'application/vnd.ms-fontobject' => 'eot',
|
||||
'application/vnd.ms-htmlhelp' => 'chm',
|
||||
'application/vnd.ms-ims' => 'ims',
|
||||
'application/vnd.ms-lrm' => 'lrm',
|
||||
'application/vnd.ms-officetheme' => 'thmx',
|
||||
'application/vnd.ms-pki.seccat' => 'cat',
|
||||
'application/vnd.ms-pki.stl' => 'stl',
|
||||
'application/vnd.ms-powerpoint' => ['ppt', 'pps', 'pot'],
|
||||
'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam',
|
||||
'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm',
|
||||
'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm',
|
||||
'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm',
|
||||
'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm',
|
||||
'application/vnd.ms-project' => ['mpp', 'mpt'],
|
||||
'application/vnd.ms-word.document.macroenabled.12' => 'docm',
|
||||
'application/vnd.ms-word.template.macroenabled.12' => 'dotm',
|
||||
'application/vnd.ms-works' => ['wps', 'wks', 'wcm', 'wdb'],
|
||||
'application/vnd.ms-wpl' => 'wpl',
|
||||
'application/vnd.ms-xpsdocument' => 'xps',
|
||||
'application/vnd.mseq' => 'mseq',
|
||||
'application/vnd.musician' => 'mus',
|
||||
'application/vnd.oasis.opendocument.chart' => 'odc',
|
||||
'application/vnd.oasis.opendocument.chart-template' => 'otc',
|
||||
'application/vnd.oasis.opendocument.database' => 'odb',
|
||||
'application/vnd.oasis.opendocument.formula' => 'odf',
|
||||
'application/vnd.oasis.opendocument.formula-template' => 'odft',
|
||||
'application/vnd.oasis.opendocument.graphics' => 'odg',
|
||||
'application/vnd.oasis.opendocument.graphics-template' => 'otg',
|
||||
'application/vnd.oasis.opendocument.image' => 'odi',
|
||||
'application/vnd.oasis.opendocument.image-template' => 'oti',
|
||||
'application/vnd.oasis.opendocument.presentation' => 'odp',
|
||||
'application/vnd.oasis.opendocument.presentation-template' => 'otp',
|
||||
'application/vnd.oasis.opendocument.spreadsheet' => 'ods',
|
||||
'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots',
|
||||
'application/vnd.oasis.opendocument.text' => 'odt',
|
||||
'application/vnd.oasis.opendocument.text-master' => 'odm',
|
||||
'application/vnd.oasis.opendocument.text-template' => 'ott',
|
||||
'application/vnd.oasis.opendocument.text-web' => 'oth',
|
||||
'application/vnd.olpc-sugar' => 'xo',
|
||||
'application/vnd.oma.dd2+xml' => 'dd2',
|
||||
'application/vnd.openofficeorg.extension' => 'oxt',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx',
|
||||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
|
||||
'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx',
|
||||
'application/vnd.pvi.ptid1' => 'ptid',
|
||||
'application/vnd.quark.quarkxpress' => [
|
||||
'qxd',
|
||||
'qxt',
|
||||
'qwd',
|
||||
'qwt',
|
||||
'qxl',
|
||||
'qxb',
|
||||
],
|
||||
'application/vnd.realvnc.bed' => 'bed',
|
||||
'application/vnd.recordare.musicxml' => 'mxl',
|
||||
'application/vnd.recordare.musicxml+xml' => 'musicxml',
|
||||
'application/vnd.rig.cryptonote' => 'cryptonote',
|
||||
'application/vnd.rim.cod' => 'cod',
|
||||
'application/vnd.rn-realmedia' => 'rm',
|
||||
'application/vnd.rn-realmedia-vbr' => 'rmvb',
|
||||
'application/vnd.route66.link66+xml' => 'link66',
|
||||
'application/vnd.sailingtracker.track' => 'st',
|
||||
'application/vnd.seemail' => 'see',
|
||||
'application/vnd.sema' => 'sema',
|
||||
'application/vnd.semd' => 'semd',
|
||||
'application/vnd.semf' => 'semf',
|
||||
'application/vnd.shana.informed.formdata' => 'ifm',
|
||||
'application/vnd.shana.informed.formtemplate' => 'itp',
|
||||
'application/vnd.shana.informed.interchange' => 'iif',
|
||||
'application/vnd.shana.informed.package' => 'ipk',
|
||||
'application/vnd.simtech-mindmapper' => ['twd', 'twds'],
|
||||
'application/vnd.smaf' => 'mmf',
|
||||
'application/vnd.stepmania.stepchart' => 'sm',
|
||||
'application/vnd.sun.xml.calc' => 'sxc',
|
||||
'application/vnd.sun.xml.calc.template' => 'stc',
|
||||
'application/vnd.sun.xml.draw' => 'sxd',
|
||||
'application/vnd.sun.xml.draw.template' => 'std',
|
||||
'application/vnd.sun.xml.impress' => 'sxi',
|
||||
'application/vnd.sun.xml.impress.template' => 'sti',
|
||||
'application/vnd.sun.xml.math' => 'sxm',
|
||||
'application/vnd.sun.xml.writer' => 'sxw',
|
||||
'application/vnd.sun.xml.writer.global' => 'sxg',
|
||||
'application/vnd.sun.xml.writer.template' => 'stw',
|
||||
'application/vnd.sus-calendar' => ['sus', 'susp'],
|
||||
'application/vnd.svd' => 'svd',
|
||||
'application/vnd.symbian.install' => ['sis', 'sisx'],
|
||||
'application/vnd.syncml+xml' => 'xsm',
|
||||
'application/vnd.syncml.dm+wbxml' => 'bdm',
|
||||
'application/vnd.syncml.dm+xml' => 'xdm',
|
||||
'application/vnd.tao.intent-module-archive' => 'tao',
|
||||
'application/vnd.tcpdump.pcap' => ['pcap', 'cap', 'dmp'],
|
||||
'application/vnd.tmobile-livetv' => 'tmo',
|
||||
'application/vnd.trid.tpt' => 'tpt',
|
||||
'application/vnd.triscape.mxs' => 'mxs',
|
||||
'application/vnd.trueapp' => 'tra',
|
||||
'application/vnd.ufdl' => ['ufd', 'ufdl'],
|
||||
'application/vnd.uiq.theme' => 'utz',
|
||||
'application/vnd.umajin' => 'umj',
|
||||
'application/vnd.unity' => 'unityweb',
|
||||
'application/vnd.uoml+xml' => 'uoml',
|
||||
'application/vnd.vcx' => 'vcx',
|
||||
'application/vnd.visio' => ['vsd', 'vst', 'vss', 'vsw'],
|
||||
'application/vnd.visionary' => 'vis',
|
||||
'application/vnd.vsf' => 'vsf',
|
||||
'application/vnd.wap.wbxml' => 'wbxml',
|
||||
'application/vnd.wap.wmlc' => 'wmlc',
|
||||
'application/vnd.wap.wmlscriptc' => 'wmlsc',
|
||||
'application/vnd.webturbo' => 'wtb',
|
||||
'application/vnd.wolfram.player' => 'nbp',
|
||||
'application/vnd.wordperfect' => 'wpd',
|
||||
'application/vnd.wqd' => 'wqd',
|
||||
'application/vnd.wt.stf' => 'stf',
|
||||
'application/vnd.xara' => 'xar',
|
||||
'application/vnd.xfdl' => 'xfdl',
|
||||
'application/voicexml+xml' => 'vxml',
|
||||
'application/widget' => 'wgt',
|
||||
'application/winhlp' => 'hlp',
|
||||
'application/wsdl+xml' => 'wsdl',
|
||||
'application/wspolicy+xml' => 'wspolicy',
|
||||
'application/x-7z-compressed' => '7z',
|
||||
'application/x-bittorrent' => 'torrent',
|
||||
'application/x-blorb' => ['blb', 'blorb'],
|
||||
'application/x-bzip' => 'bz',
|
||||
'application/x-cdlink' => 'vcd',
|
||||
'application/x-cfs-compressed' => 'cfs',
|
||||
'application/x-chat' => 'chat',
|
||||
'application/x-chess-pgn' => 'pgn',
|
||||
'application/x-conference' => 'nsc',
|
||||
'application/x-cpio' => 'cpio',
|
||||
'application/x-csh' => 'csh',
|
||||
'application/x-debian-package' => ['deb', 'udeb'],
|
||||
'application/x-dgc-compressed' => 'dgc',
|
||||
'application/x-director' => [
|
||||
'dir',
|
||||
'dcr',
|
||||
'dxr',
|
||||
'cst',
|
||||
'cct',
|
||||
'cxt',
|
||||
'w3d',
|
||||
'fgd',
|
||||
'swa',
|
||||
],
|
||||
'application/x-font-ttf' => ['ttf', 'ttc'],
|
||||
'application/x-font-type1' => ['pfa', 'pfb', 'pfm', 'afm'],
|
||||
'application/x-font-woff' => 'woff',
|
||||
'application/x-freearc' => 'arc',
|
||||
'application/x-futuresplash' => 'spl',
|
||||
'application/x-gca-compressed' => 'gca',
|
||||
'application/x-glulx' => 'ulx',
|
||||
'application/x-gnumeric' => 'gnumeric',
|
||||
'application/x-gramps-xml' => 'gramps',
|
||||
'application/x-gtar' => 'gtar',
|
||||
'application/x-hdf' => 'hdf',
|
||||
'application/x-install-instructions' => 'install',
|
||||
'application/x-iso9660-image' => 'iso',
|
||||
'application/x-java-jnlp-file' => 'jnlp',
|
||||
'application/x-latex' => 'latex',
|
||||
'application/x-lzh-compressed' => ['lzh', 'lha'],
|
||||
'application/x-mie' => 'mie',
|
||||
'application/x-mobipocket-ebook' => ['prc', 'mobi'],
|
||||
'application/x-ms-application' => 'application',
|
||||
'application/x-ms-shortcut' => 'lnk',
|
||||
'application/x-ms-wmd' => 'wmd',
|
||||
'application/x-ms-wmz' => 'wmz',
|
||||
'application/x-ms-xbap' => 'xbap',
|
||||
'application/x-msaccess' => 'mdb',
|
||||
'application/x-msbinder' => 'obd',
|
||||
'application/x-mscardfile' => 'crd',
|
||||
'application/x-msclip' => 'clp',
|
||||
'application/x-msdownload' => ['exe', 'dll', 'com', 'bat', 'msi'],
|
||||
'application/x-msmediaview' => [
|
||||
'mvb',
|
||||
'm13',
|
||||
'm14',
|
||||
],
|
||||
'application/x-msmetafile' => ['wmf', 'wmz', 'emf', 'emz'],
|
||||
'application/x-rar-compressed' => 'rar',
|
||||
'application/x-research-info-systems' => 'ris',
|
||||
'application/x-sh' => 'sh',
|
||||
'application/x-shar' => 'shar',
|
||||
'application/x-shockwave-flash' => 'swf',
|
||||
'application/x-silverlight-app' => 'xap',
|
||||
'application/x-sql' => 'sql',
|
||||
'application/x-stuffit' => 'sit',
|
||||
'application/x-stuffitx' => 'sitx',
|
||||
'application/x-subrip' => 'srt',
|
||||
'application/x-sv4cpio' => 'sv4cpio',
|
||||
'application/x-sv4crc' => 'sv4crc',
|
||||
'application/x-t3vm-image' => 't3',
|
||||
'application/x-tads' => 'gam',
|
||||
'application/x-tar' => 'tar',
|
||||
'application/x-tcl' => 'tcl',
|
||||
'application/x-tex' => 'tex',
|
||||
'application/x-tex-tfm' => 'tfm',
|
||||
'application/x-texinfo' => ['texinfo', 'texi'],
|
||||
'application/x-tgif' => 'obj',
|
||||
'application/x-ustar' => 'ustar',
|
||||
'application/x-wais-source' => 'src',
|
||||
'application/x-x509-ca-cert' => ['der', 'crt'],
|
||||
'application/x-xfig' => 'fig',
|
||||
'application/x-xliff+xml' => 'xlf',
|
||||
'application/x-xpinstall' => 'xpi',
|
||||
'application/x-xz' => 'xz',
|
||||
'application/x-zmachine' => 'z1',
|
||||
'application/xaml+xml' => 'xaml',
|
||||
'application/xcap-diff+xml' => 'xdf',
|
||||
'application/xenc+xml' => 'xenc',
|
||||
'application/xhtml+xml' => ['xhtml', 'xht'],
|
||||
'application/xml' => ['xml', 'xsl'],
|
||||
'application/xml-dtd' => 'dtd',
|
||||
'application/xop+xml' => 'xop',
|
||||
'application/xproc+xml' => 'xpl',
|
||||
'application/xslt+xml' => 'xslt',
|
||||
'application/xspf+xml' => 'xspf',
|
||||
'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'],
|
||||
'application/yang' => 'yang',
|
||||
'application/yin+xml' => 'yin',
|
||||
'application/zip' => 'zip',
|
||||
'audio/adpcm' => 'adp',
|
||||
'audio/basic' => ['au', 'snd'],
|
||||
'audio/midi' => ['mid', 'midi', 'kar', 'rmi'],
|
||||
'audio/mp4' => 'mp4a',
|
||||
'audio/mpeg' => [
|
||||
'mpga',
|
||||
'mp2',
|
||||
'mp2a',
|
||||
'mp3',
|
||||
'm2a',
|
||||
'm3a',
|
||||
],
|
||||
'audio/ogg' => ['oga', 'ogg', 'spx'],
|
||||
'audio/vnd.dece.audio' => ['uva', 'uvva'],
|
||||
'audio/vnd.rip' => 'rip',
|
||||
'audio/webm' => 'weba',
|
||||
'audio/x-aac' => 'aac',
|
||||
'audio/x-aiff' => ['aif', 'aiff', 'aifc'],
|
||||
'audio/x-caf' => 'caf',
|
||||
'audio/x-flac' => 'flac',
|
||||
'audio/x-matroska' => 'mka',
|
||||
'audio/x-mpegurl' => 'm3u',
|
||||
'audio/x-ms-wax' => 'wax',
|
||||
'audio/x-ms-wma' => 'wma',
|
||||
'audio/x-pn-realaudio' => ['ram', 'ra'],
|
||||
'audio/x-pn-realaudio-plugin' => 'rmp',
|
||||
'audio/x-wav' => 'wav',
|
||||
'audio/xm' => 'xm',
|
||||
'image/bmp' => 'bmp',
|
||||
'image/cgm' => 'cgm',
|
||||
'image/g3fax' => 'g3',
|
||||
'image/gif' => 'gif',
|
||||
'image/ief' => 'ief',
|
||||
'image/jpeg' => ['jpeg', 'jpg', 'jpe'],
|
||||
'image/ktx' => 'ktx',
|
||||
'image/png' => 'png',
|
||||
'image/prs.btif' => 'btif',
|
||||
'image/sgi' => 'sgi',
|
||||
'image/svg+xml' => ['svg', 'svgz'],
|
||||
'image/tiff' => ['tiff', 'tif'],
|
||||
'image/vnd.adobe.photoshop' => 'psd',
|
||||
'image/vnd.dece.graphic' => ['uvi', 'uvvi', 'uvg', 'uvvg'],
|
||||
'image/vnd.dvb.subtitle' => 'sub',
|
||||
'image/vnd.djvu' => ['djvu', 'djv'],
|
||||
'image/vnd.dwg' => 'dwg',
|
||||
'image/vnd.dxf' => 'dxf',
|
||||
'image/vnd.fastbidsheet' => 'fbs',
|
||||
'image/vnd.fpx' => 'fpx',
|
||||
'image/vnd.fst' => 'fst',
|
||||
'image/vnd.fujixerox.edmics-mmr' => 'mmr',
|
||||
'image/vnd.fujixerox.edmics-rlc' => 'rlc',
|
||||
'image/vnd.ms-modi' => 'mdi',
|
||||
'image/vnd.ms-photo' => 'wdp',
|
||||
'image/vnd.net-fpx' => 'npx',
|
||||
'image/vnd.wap.wbmp' => 'wbmp',
|
||||
'image/vnd.xiff' => 'xif',
|
||||
'image/webp' => 'webp',
|
||||
'image/x-3ds' => '3ds',
|
||||
'image/x-cmu-raster' => 'ras',
|
||||
'image/x-cmx' => 'cmx',
|
||||
'image/x-freehand' => ['fh', 'fhc', 'fh4', 'fh5', 'fh7'],
|
||||
'image/x-icon' => 'ico',
|
||||
'image/x-mrsid-image' => 'sid',
|
||||
'image/x-pcx' => 'pcx',
|
||||
'image/x-pict' => ['pic', 'pct'],
|
||||
'image/x-portable-anymap' => 'pnm',
|
||||
'image/x-portable-bitmap' => 'pbm',
|
||||
'image/x-portable-graymap' => 'pgm',
|
||||
'image/x-portable-pixmap' => 'ppm',
|
||||
'image/x-rgb' => 'rgb',
|
||||
'image/x-tga' => 'tga',
|
||||
'image/x-xbitmap' => 'xbm',
|
||||
'image/x-xpixmap' => 'xpm',
|
||||
'image/x-xwindowdump' => 'xwd',
|
||||
'message/rfc822' => ['eml', 'mime'],
|
||||
'model/iges' => ['igs', 'iges'],
|
||||
'model/mesh' => ['msh', 'mesh', 'silo'],
|
||||
'model/vnd.collada+xml' => 'dae',
|
||||
'model/vnd.dwf' => 'dwf',
|
||||
'model/vnd.gdl' => 'gdl',
|
||||
'model/vnd.gtw' => 'gtw',
|
||||
'model/vnd.mts' => 'mts',
|
||||
'model/vnd.vtu' => 'vtu',
|
||||
'model/vrml' => ['wrl', 'vrml'],
|
||||
'model/x3d+binary' => 'x3db',
|
||||
'model/x3d+vrml' => 'x3dv',
|
||||
'model/x3d+xml' => 'x3d',
|
||||
'text/cache-manifest' => 'appcache',
|
||||
'text/calendar' => ['ics', 'ifb'],
|
||||
'text/css' => 'css',
|
||||
'text/csv' => 'csv',
|
||||
'text/html' => ['html', 'htm'],
|
||||
'text/n3' => 'n3',
|
||||
'text/plain' => [
|
||||
'txt',
|
||||
'text',
|
||||
'conf',
|
||||
'def',
|
||||
'list',
|
||||
'log',
|
||||
'in',
|
||||
],
|
||||
'text/prs.lines.tag' => 'dsc',
|
||||
'text/richtext' => 'rtx',
|
||||
'text/sgml' => ['sgml', 'sgm'],
|
||||
'text/tab-separated-values' => 'tsv',
|
||||
'text/troff' => [
|
||||
't',
|
||||
'tr',
|
||||
'roff',
|
||||
'man',
|
||||
'me',
|
||||
'ms',
|
||||
],
|
||||
'text/turtle' => 'ttl',
|
||||
'text/uri-list' => ['uri', 'uris', 'urls'],
|
||||
'text/vcard' => 'vcard',
|
||||
'text/vnd.curl' => 'curl',
|
||||
'text/vnd.curl.dcurl' => 'dcurl',
|
||||
'text/vnd.curl.scurl' => 'scurl',
|
||||
'text/vnd.curl.mcurl' => 'mcurl',
|
||||
'text/vnd.dvb.subtitle' => 'sub',
|
||||
'text/vnd.fly' => 'fly',
|
||||
'text/vnd.fmi.flexstor' => 'flx',
|
||||
'text/vnd.graphviz' => 'gv',
|
||||
'text/vnd.in3d.3dml' => '3dml',
|
||||
'text/vnd.in3d.spot' => 'spot',
|
||||
'text/vnd.sun.j2me.app-descriptor' => 'jad',
|
||||
'text/vnd.wap.wml' => 'wml',
|
||||
'text/vnd.wap.wmlscript' => 'wmls',
|
||||
'text/x-asm' => ['s', 'asm'],
|
||||
'text/x-fortran' => ['f', 'for', 'f77', 'f90'],
|
||||
'text/x-java-source' => 'java',
|
||||
'text/x-opml' => 'opml',
|
||||
'text/x-pascal' => ['p', 'pas'],
|
||||
'text/x-nfo' => 'nfo',
|
||||
'text/x-setext' => 'etx',
|
||||
'text/x-sfv' => 'sfv',
|
||||
'text/x-uuencode' => 'uu',
|
||||
'text/x-vcalendar' => 'vcs',
|
||||
'text/x-vcard' => 'vcf',
|
||||
'video/3gpp' => '3gp',
|
||||
'video/3gpp2' => '3g2',
|
||||
'video/h261' => 'h261',
|
||||
'video/h263' => 'h263',
|
||||
'video/h264' => 'h264',
|
||||
'video/jpeg' => 'jpgv',
|
||||
'video/jpm' => ['jpm', 'jpgm'],
|
||||
'video/mj2' => 'mj2',
|
||||
'video/mp4' => 'mp4',
|
||||
'video/mpeg' => ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],
|
||||
'video/ogg' => 'ogv',
|
||||
'video/quicktime' => ['qt', 'mov'],
|
||||
'video/vnd.dece.hd' => ['uvh', 'uvvh'],
|
||||
'video/vnd.dece.mobile' => ['uvm', 'uvvm'],
|
||||
'video/vnd.dece.pd' => ['uvp', 'uvvp'],
|
||||
'video/vnd.dece.sd' => ['uvs', 'uvvs'],
|
||||
'video/vnd.dece.video' => ['uvv', 'uvvv'],
|
||||
'video/vnd.dvb.file' => 'dvb',
|
||||
'video/vnd.fvt' => 'fvt',
|
||||
'video/vnd.mpegurl' => ['mxu', 'm4u'],
|
||||
'video/vnd.ms-playready.media.pyv' => 'pyv',
|
||||
'video/vnd.uvvu.mp4' => ['uvu', 'uvvu'],
|
||||
'video/vnd.vivo' => 'viv',
|
||||
'video/webm' => 'webm',
|
||||
'video/x-f4v' => 'f4v',
|
||||
'video/x-fli' => 'fli',
|
||||
'video/x-flv' => 'flv',
|
||||
'video/x-m4v' => 'm4v',
|
||||
'video/x-matroska' => ['mkv', 'mk3d', 'mks'],
|
||||
'video/x-mng' => 'mng',
|
||||
'video/x-ms-asf' => ['asf', 'asx'],
|
||||
'video/x-ms-vob' => 'vob',
|
||||
'video/x-ms-wm' => 'wm',
|
||||
'video/x-ms-wmv' => 'wmv',
|
||||
'video/x-ms-wmx' => 'wmx',
|
||||
'video/x-ms-wvx' => 'wvx',
|
||||
'video/x-msvideo' => 'avi',
|
||||
'video/x-sgi-movie' => 'movie',
|
||||
];
|
||||
|
||||
public function mimeType(): string
|
||||
{
|
||||
return array_rand($this->mimeTypes, 1);
|
||||
}
|
||||
|
||||
public function extension(): string
|
||||
{
|
||||
$extension = $this->mimeTypes[array_rand($this->mimeTypes, 1)];
|
||||
|
||||
return is_array($extension) ? $extension[array_rand($extension, 1)] : $extension;
|
||||
}
|
||||
|
||||
public function filePath(): string
|
||||
{
|
||||
return tempnam(sys_get_temp_dir(), 'faker');
|
||||
}
|
||||
}
|
||||
83
vendor/fakerphp/faker/src/Faker/Core/Number.php
vendored
Normal file
83
vendor/fakerphp/faker/src/Faker/Core/Number.php
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Number implements Extension\NumberExtension
|
||||
{
|
||||
public function numberBetween(int $min = 0, int $max = 2147483647): int
|
||||
{
|
||||
$int1 = min($min, $max);
|
||||
$int2 = max($min, $max);
|
||||
|
||||
return mt_rand($int1, $int2);
|
||||
}
|
||||
|
||||
public function randomDigit(): int
|
||||
{
|
||||
return $this->numberBetween(0, 9);
|
||||
}
|
||||
|
||||
public function randomDigitNot(int $except): int
|
||||
{
|
||||
$result = $this->numberBetween(0, 8);
|
||||
|
||||
if ($result >= $except) {
|
||||
++$result;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function randomDigitNotZero(): int
|
||||
{
|
||||
return $this->numberBetween(1, 9);
|
||||
}
|
||||
|
||||
public function randomFloat(?int $nbMaxDecimals = null, float $min = 0, ?float $max = null): float
|
||||
{
|
||||
if (null === $nbMaxDecimals) {
|
||||
$nbMaxDecimals = $this->randomDigit();
|
||||
}
|
||||
|
||||
if (null === $max) {
|
||||
$max = $this->randomNumber();
|
||||
|
||||
if ($min > $max) {
|
||||
$max = $min;
|
||||
}
|
||||
}
|
||||
|
||||
if ($min > $max) {
|
||||
$tmp = $min;
|
||||
$min = $max;
|
||||
$max = $tmp;
|
||||
}
|
||||
|
||||
return round($min + $this->numberBetween() / mt_getrandmax() * ($max - $min), $nbMaxDecimals);
|
||||
}
|
||||
|
||||
public function randomNumber(?int $nbDigits = null, bool $strict = false): int
|
||||
{
|
||||
if (null === $nbDigits) {
|
||||
$nbDigits = $this->randomDigitNotZero();
|
||||
}
|
||||
$max = 10 ** $nbDigits - 1;
|
||||
|
||||
if ($max > mt_getrandmax()) {
|
||||
throw new \InvalidArgumentException('randomNumber() can only generate numbers up to mt_getrandmax()');
|
||||
}
|
||||
|
||||
if ($strict) {
|
||||
return $this->numberBetween(10 ** ($nbDigits - 1), $max);
|
||||
}
|
||||
|
||||
return $this->numberBetween(0, $max);
|
||||
}
|
||||
}
|
||||
65
vendor/fakerphp/faker/src/Faker/Core/Uuid.php
vendored
Normal file
65
vendor/fakerphp/faker/src/Faker/Core/Uuid.php
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Uuid implements Extension\UuidExtension
|
||||
{
|
||||
private Extension\NumberExtension $numberExtension;
|
||||
|
||||
public function __construct(?Extension\NumberExtension $numberExtension = null)
|
||||
{
|
||||
|
||||
$this->numberExtension = $numberExtension ?: new Number();
|
||||
}
|
||||
|
||||
public function uuid3(): string
|
||||
{
|
||||
// fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit
|
||||
// two such calls will cause 64bits of randomness regardless of architecture
|
||||
$seed = $this->numberExtension->numberBetween(0, 2147483647) . '#' . $this->numberExtension->numberBetween(0, 2147483647);
|
||||
|
||||
// Hash the seed and convert to a byte array
|
||||
$val = md5($seed, true);
|
||||
$byte = array_values(unpack('C16', $val));
|
||||
|
||||
// extract fields from byte array
|
||||
$tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3];
|
||||
$tMi = ($byte[4] << 8) | $byte[5];
|
||||
$tHi = ($byte[6] << 8) | $byte[7];
|
||||
$csLo = $byte[9];
|
||||
$csHi = $byte[8] & 0x3f | (1 << 7);
|
||||
|
||||
// correct byte order for big edian architecture
|
||||
if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) {
|
||||
$tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8)
|
||||
| (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24);
|
||||
$tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8);
|
||||
$tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8);
|
||||
}
|
||||
|
||||
// apply version number
|
||||
$tHi &= 0x0fff;
|
||||
$tHi |= (3 << 12);
|
||||
|
||||
// cast to string
|
||||
return sprintf(
|
||||
'%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
|
||||
$tLo,
|
||||
$tMi,
|
||||
$tHi,
|
||||
$csHi,
|
||||
$csLo,
|
||||
$byte[10],
|
||||
$byte[11],
|
||||
$byte[12],
|
||||
$byte[13],
|
||||
$byte[14],
|
||||
$byte[15],
|
||||
);
|
||||
}
|
||||
}
|
||||
69
vendor/fakerphp/faker/src/Faker/Core/Version.php
vendored
Normal file
69
vendor/fakerphp/faker/src/Faker/Core/Version.php
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Core;
|
||||
|
||||
use Faker\Extension;
|
||||
use Faker\Provider\DateTime;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Version implements Extension\VersionExtension
|
||||
{
|
||||
private Extension\NumberExtension $numberExtension;
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private array $semverCommonPreReleaseIdentifiers = ['alpha', 'beta', 'rc'];
|
||||
|
||||
public function __construct(?Extension\NumberExtension $numberExtension = null)
|
||||
{
|
||||
|
||||
$this->numberExtension = $numberExtension ?: new Number();
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents v2.0.0 of the semantic versioning: https://semver.org/spec/v2.0.0.html
|
||||
*/
|
||||
public function semver(bool $preRelease = false, bool $build = false): string
|
||||
{
|
||||
return sprintf(
|
||||
'%d.%d.%d%s%s',
|
||||
$this->numberExtension->numberBetween(0, 9),
|
||||
$this->numberExtension->numberBetween(0, 99),
|
||||
$this->numberExtension->numberBetween(0, 99),
|
||||
$preRelease && $this->numberExtension->numberBetween(0, 1) === 1 ? '-' . $this->semverPreReleaseIdentifier() : '',
|
||||
$build && $this->numberExtension->numberBetween(0, 1) === 1 ? '+' . $this->semverBuildIdentifier() : '',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Common pre-release identifier
|
||||
*/
|
||||
private function semverPreReleaseIdentifier(): string
|
||||
{
|
||||
$ident = Extension\Helper::randomElement($this->semverCommonPreReleaseIdentifiers);
|
||||
|
||||
if ($this->numberExtension->numberBetween(0, 1) !== 1) {
|
||||
return $ident;
|
||||
}
|
||||
|
||||
return $ident . '.' . $this->numberExtension->numberBetween(1, 99);
|
||||
}
|
||||
|
||||
/**
|
||||
* Common random build identifier
|
||||
*/
|
||||
private function semverBuildIdentifier(): string
|
||||
{
|
||||
if ($this->numberExtension->numberBetween(0, 1) === 1) {
|
||||
// short git revision syntax: https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection
|
||||
return substr(sha1(Extension\Helper::lexify('??????')), 0, 7);
|
||||
}
|
||||
|
||||
// date syntax
|
||||
return DateTime::date('YmdHis');
|
||||
}
|
||||
}
|
||||
49
vendor/fakerphp/faker/src/Faker/DefaultGenerator.php
vendored
Normal file
49
vendor/fakerphp/faker/src/Faker/DefaultGenerator.php
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Faker;
|
||||
|
||||
/**
|
||||
* This generator returns a default value for all called properties
|
||||
* and methods.
|
||||
*
|
||||
* @mixin Generator
|
||||
*
|
||||
* @deprecated Use ChanceGenerator instead
|
||||
*/
|
||||
class DefaultGenerator
|
||||
{
|
||||
protected $default;
|
||||
|
||||
public function __construct($default = null)
|
||||
{
|
||||
trigger_deprecation('fakerphp/faker', '1.16', 'Class "%s" is deprecated, use "%s" instead.', __CLASS__, ChanceGenerator::class);
|
||||
|
||||
$this->default = $default;
|
||||
}
|
||||
|
||||
public function ext()
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $attribute
|
||||
*
|
||||
* @deprecated Use a method instead.
|
||||
*/
|
||||
public function __get($attribute)
|
||||
{
|
||||
trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute);
|
||||
|
||||
return $this->default;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param array $attributes
|
||||
*/
|
||||
public function __call($method, $attributes)
|
||||
{
|
||||
return $this->default;
|
||||
}
|
||||
}
|
||||
70
vendor/fakerphp/faker/src/Faker/Documentor.php
vendored
Normal file
70
vendor/fakerphp/faker/src/Faker/Documentor.php
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Faker;
|
||||
|
||||
class Documentor
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFormatters()
|
||||
{
|
||||
$formatters = [];
|
||||
$providers = array_reverse($this->generator->getProviders());
|
||||
$providers[] = new Provider\Base($this->generator);
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
$providerClass = get_class($provider);
|
||||
$formatters[$providerClass] = [];
|
||||
$refl = new \ReflectionObject($provider);
|
||||
|
||||
foreach ($refl->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflmethod) {
|
||||
if ($reflmethod->getDeclaringClass()->getName() == 'Faker\Provider\Base' && $providerClass != 'Faker\Provider\Base') {
|
||||
continue;
|
||||
}
|
||||
$methodName = $reflmethod->name;
|
||||
|
||||
if ($reflmethod->isConstructor()) {
|
||||
continue;
|
||||
}
|
||||
$parameters = [];
|
||||
|
||||
foreach ($reflmethod->getParameters() as $reflparameter) {
|
||||
$parameter = '$' . $reflparameter->getName();
|
||||
|
||||
if ($reflparameter->isDefaultValueAvailable()) {
|
||||
$parameter .= ' = ' . var_export($reflparameter->getDefaultValue(), true);
|
||||
}
|
||||
$parameters[] = $parameter;
|
||||
}
|
||||
$parameters = $parameters ? '(' . implode(', ', $parameters) . ')' : '';
|
||||
|
||||
try {
|
||||
$example = $this->generator->format($methodName);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
$example = '';
|
||||
}
|
||||
|
||||
if (is_array($example)) {
|
||||
$example = "array('" . implode("', '", $example) . "')";
|
||||
} elseif ($example instanceof \DateTime) {
|
||||
$example = "DateTime('" . $example->format('Y-m-d H:i:s') . "')";
|
||||
} elseif ($example instanceof Generator || $example instanceof UniqueGenerator) { // modifier
|
||||
$example = '';
|
||||
} else {
|
||||
$example = var_export($example, true);
|
||||
}
|
||||
$formatters[$providerClass][$methodName . $parameters] = $example;
|
||||
}
|
||||
}
|
||||
|
||||
return $formatters;
|
||||
}
|
||||
}
|
||||
39
vendor/fakerphp/faker/src/Faker/Extension/AddressExtension.php
vendored
Normal file
39
vendor/fakerphp/faker/src/Faker/Extension/AddressExtension.php
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface AddressExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @example '791 Crist Parks, Sashabury, IL 86039-9874'
|
||||
*/
|
||||
public function address(): string;
|
||||
|
||||
/**
|
||||
* Randomly return a real city name.
|
||||
*/
|
||||
public function city(): string;
|
||||
|
||||
/**
|
||||
* @example 86039-9874
|
||||
*/
|
||||
public function postcode(): string;
|
||||
|
||||
/**
|
||||
* @example 'Crist Parks'
|
||||
*/
|
||||
public function streetName(): string;
|
||||
|
||||
/**
|
||||
* @example '791 Crist Parks'
|
||||
*/
|
||||
public function streetAddress(): string;
|
||||
|
||||
/**
|
||||
* Randomly return a building number.
|
||||
*/
|
||||
public function buildingNumber(): string;
|
||||
}
|
||||
41
vendor/fakerphp/faker/src/Faker/Extension/BarcodeExtension.php
vendored
Normal file
41
vendor/fakerphp/faker/src/Faker/Extension/BarcodeExtension.php
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface BarcodeExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Get a random EAN13 barcode.
|
||||
*
|
||||
* @example '4006381333931'
|
||||
*/
|
||||
public function ean13(): string;
|
||||
|
||||
/**
|
||||
* Get a random EAN8 barcode.
|
||||
*
|
||||
* @example '73513537'
|
||||
*/
|
||||
public function ean8(): string;
|
||||
|
||||
/**
|
||||
* Get a random ISBN-10 code
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
||||
*
|
||||
* @example '4881416324'
|
||||
*/
|
||||
public function isbn10(): string;
|
||||
|
||||
/**
|
||||
* Get a random ISBN-13 code
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
||||
*
|
||||
* @example '9790404436093'
|
||||
*/
|
||||
public function isbn13(): string;
|
||||
}
|
||||
30
vendor/fakerphp/faker/src/Faker/Extension/BloodExtension.php
vendored
Normal file
30
vendor/fakerphp/faker/src/Faker/Extension/BloodExtension.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface BloodExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Get an actual blood type
|
||||
*
|
||||
* @example 'AB'
|
||||
*/
|
||||
public function bloodType(): string;
|
||||
|
||||
/**
|
||||
* Get a random resis value
|
||||
*
|
||||
* @example '+'
|
||||
*/
|
||||
public function bloodRh(): string;
|
||||
|
||||
/**
|
||||
* Get a full blood group
|
||||
*
|
||||
* @example 'AB+'
|
||||
*/
|
||||
public function bloodGroup(): string;
|
||||
}
|
||||
63
vendor/fakerphp/faker/src/Faker/Extension/ColorExtension.php
vendored
Normal file
63
vendor/fakerphp/faker/src/Faker/Extension/ColorExtension.php
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface ColorExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @example '#fa3cc2'
|
||||
*/
|
||||
public function hexColor(): string;
|
||||
|
||||
/**
|
||||
* @example '#ff0044'
|
||||
*/
|
||||
public function safeHexColor(): string;
|
||||
|
||||
/**
|
||||
* @example 'array(0,255,122)'
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public function rgbColorAsArray(): array;
|
||||
|
||||
/**
|
||||
* @example '0,255,122'
|
||||
*/
|
||||
public function rgbColor(): string;
|
||||
|
||||
/**
|
||||
* @example 'rgb(0,255,122)'
|
||||
*/
|
||||
public function rgbCssColor(): string;
|
||||
|
||||
/**
|
||||
* @example 'rgba(0,255,122,0.8)'
|
||||
*/
|
||||
public function rgbaCssColor(): string;
|
||||
|
||||
/**
|
||||
* @example 'blue'
|
||||
*/
|
||||
public function safeColorName(): string;
|
||||
|
||||
/**
|
||||
* @example 'NavajoWhite'
|
||||
*/
|
||||
public function colorName(): string;
|
||||
|
||||
/**
|
||||
* @example '340,50,20'
|
||||
*/
|
||||
public function hslColor(): string;
|
||||
|
||||
/**
|
||||
* @example array(340, 50, 20)
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public function hslColorAsArray(): array;
|
||||
}
|
||||
21
vendor/fakerphp/faker/src/Faker/Extension/CompanyExtension.php
vendored
Normal file
21
vendor/fakerphp/faker/src/Faker/Extension/CompanyExtension.php
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface CompanyExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @example 'Acme Ltd'
|
||||
*/
|
||||
public function company(): string;
|
||||
|
||||
/**
|
||||
* @example 'Ltd'
|
||||
*/
|
||||
public function companySuffix(): string;
|
||||
|
||||
public function jobTitle(): string;
|
||||
}
|
||||
14
vendor/fakerphp/faker/src/Faker/Extension/CountryExtension.php
vendored
Normal file
14
vendor/fakerphp/faker/src/Faker/Extension/CountryExtension.php
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface CountryExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @example 'Japan'
|
||||
*/
|
||||
public function country(): string;
|
||||
}
|
||||
242
vendor/fakerphp/faker/src/Faker/Extension/DateTimeExtension.php
vendored
Normal file
242
vendor/fakerphp/faker/src/Faker/Extension/DateTimeExtension.php
vendored
Normal file
@ -0,0 +1,242 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* FakerPHP extension for Date-related randomization.
|
||||
*
|
||||
* Functions accepting a date string use the `strtotime()` function internally.
|
||||
*
|
||||
* @experimental
|
||||
*
|
||||
* @since 1.20.0
|
||||
*/
|
||||
interface DateTimeExtension
|
||||
{
|
||||
/**
|
||||
* Get a DateTime object between January 1, 1970, and `$until` (defaults to "now").
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone zone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*
|
||||
* @example DateTime('2005-08-16 20:39:21')
|
||||
*/
|
||||
public function dateTime($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a DateTime object for a date between January 1, 0001, and now.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone zone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @example DateTime('1265-03-22 21:15:52')
|
||||
*
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeAD($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a DateTime object a random date between `$from` and `$until`.
|
||||
* Accepts date strings that can be recognized by `strtotime()`.
|
||||
*
|
||||
* @param \DateTime|string $from defaults to 30 years ago
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone zone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeBetween($from = '-30 years', $until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a DateTime object based on a random date between `$from` and an interval.
|
||||
* Accepts date string that can be recognized by `strtotime()`.
|
||||
*
|
||||
* @param \DateTime|int|string $from defaults to 30 years ago
|
||||
* @param string $interval defaults to 5 days after
|
||||
* @param string|null $timezone zone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeInInterval($from = '-30 years', string $interval = '+5 days', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date time object somewhere inside the current week.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone zone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeThisWeek($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date time object somewhere inside the current month.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeThisMonth($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date time object somewhere inside the current year.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeThisYear($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date time object somewhere inside the current decade.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeThisDecade($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date time object somewhere inside the current century.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
* @param string|null $timezone timezone for generated date, fallback to `DateTime::$defaultTimezone` and `date_default_timezone_get()`.
|
||||
*
|
||||
* @see \DateTimeZone
|
||||
* @see http://php.net/manual/en/timezones.php
|
||||
* @see http://php.net/manual/en/function.date-default-timezone-get.php
|
||||
*/
|
||||
public function dateTimeThisCentury($until = 'now', ?string $timezone = null): \DateTime;
|
||||
|
||||
/**
|
||||
* Get a date string between January 1, 1970, and `$until`.
|
||||
*
|
||||
* @param string $format DateTime format
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @see https://www.php.net/manual/en/datetime.format.php
|
||||
*/
|
||||
public function date(string $format = 'Y-m-d', $until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a time string (24h format by default).
|
||||
*
|
||||
* @param string $format DateTime format
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @see https://www.php.net/manual/en/datetime.format.php
|
||||
*/
|
||||
public function time(string $format = 'H:i:s', $until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a UNIX (POSIX-compatible) timestamp between January 1, 1970, and `$until`.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*/
|
||||
public function unixTime($until = 'now'): int;
|
||||
|
||||
/**
|
||||
* Get a date string according to the ISO-8601 standard.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*/
|
||||
public function iso8601($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a string containing either "am" or "pm".
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @example 'am'
|
||||
*/
|
||||
public function amPm($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a localized random day of the month.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @example '16'
|
||||
*/
|
||||
public function dayOfMonth($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a localized random day of the week.
|
||||
*
|
||||
* Uses internal DateTime formatting, hence PHP's internal locale will be used (change using `setlocale()`).
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @example 'Tuesday'
|
||||
*
|
||||
* @see setlocale
|
||||
* @see https://www.php.net/manual/en/function.setlocale.php Set a different output language
|
||||
*/
|
||||
public function dayOfWeek($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a random month (numbered).
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @example '7'
|
||||
*/
|
||||
public function month($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a random month.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @see setlocale
|
||||
* @see https://www.php.net/manual/en/function.setlocale.php Set a different output language
|
||||
*
|
||||
* @example 'September'
|
||||
*/
|
||||
public function monthName($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a random year between 1970 and `$until`.
|
||||
*
|
||||
* @param \DateTime|int|string $until maximum timestamp, defaults to "now"
|
||||
*
|
||||
* @example '1987'
|
||||
*/
|
||||
public function year($until = 'now'): string;
|
||||
|
||||
/**
|
||||
* Get a random century, formatted as Roman numerals.
|
||||
*
|
||||
* @example 'XVII'
|
||||
*/
|
||||
public function century(): string;
|
||||
|
||||
/**
|
||||
* Get a random timezone, uses `\DateTimeZone::listIdentifiers()` internally.
|
||||
*
|
||||
* @param string|null $countryCode two-letter ISO 3166-1 compatible country code
|
||||
*
|
||||
* @example 'Europe/Rome'
|
||||
*/
|
||||
public function timezone(?string $countryCode = null): string;
|
||||
}
|
||||
14
vendor/fakerphp/faker/src/Faker/Extension/Extension.php
vendored
Normal file
14
vendor/fakerphp/faker/src/Faker/Extension/Extension.php
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* An extension is the only way to add new functionality to Faker.
|
||||
*
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface Extension
|
||||
{
|
||||
}
|
||||
12
vendor/fakerphp/faker/src/Faker/Extension/ExtensionNotFound.php
vendored
Normal file
12
vendor/fakerphp/faker/src/Faker/Extension/ExtensionNotFound.php
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class ExtensionNotFound extends \LogicException
|
||||
{
|
||||
}
|
||||
28
vendor/fakerphp/faker/src/Faker/Extension/FileExtension.php
vendored
Normal file
28
vendor/fakerphp/faker/src/Faker/Extension/FileExtension.php
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface FileExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Get a random MIME type
|
||||
*
|
||||
* @example 'video/avi'
|
||||
*/
|
||||
public function mimeType(): string;
|
||||
|
||||
/**
|
||||
* Get a random file extension (without a dot)
|
||||
*
|
||||
* @example avi
|
||||
*/
|
||||
public function extension(): string;
|
||||
|
||||
/**
|
||||
* Get a full path to a new real file on the system.
|
||||
*/
|
||||
public function filePath(): string;
|
||||
}
|
||||
20
vendor/fakerphp/faker/src/Faker/Extension/GeneratorAwareExtension.php
vendored
Normal file
20
vendor/fakerphp/faker/src/Faker/Extension/GeneratorAwareExtension.php
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
use Faker\Generator;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface GeneratorAwareExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* This method MUST be implemented in such a way as to retain the
|
||||
* immutability of the extension, and MUST return an instance that has the
|
||||
* new Generator.
|
||||
*/
|
||||
public function withGenerator(Generator $generator): Extension;
|
||||
}
|
||||
30
vendor/fakerphp/faker/src/Faker/Extension/GeneratorAwareExtensionTrait.php
vendored
Normal file
30
vendor/fakerphp/faker/src/Faker/Extension/GeneratorAwareExtensionTrait.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
use Faker\Generator;
|
||||
|
||||
/**
|
||||
* A helper trait to be used with GeneratorAwareExtension.
|
||||
*/
|
||||
trait GeneratorAwareExtensionTrait
|
||||
{
|
||||
/**
|
||||
* @var Generator|null
|
||||
*/
|
||||
private $generator;
|
||||
|
||||
/**
|
||||
* @return static
|
||||
*/
|
||||
public function withGenerator(Generator $generator): Extension
|
||||
{
|
||||
$instance = clone $this;
|
||||
|
||||
$instance->generator = $generator;
|
||||
|
||||
return $instance;
|
||||
}
|
||||
}
|
||||
106
vendor/fakerphp/faker/src/Faker/Extension/Helper.php
vendored
Normal file
106
vendor/fakerphp/faker/src/Faker/Extension/Helper.php
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* A class with some methods that may make building extensions easier.
|
||||
*
|
||||
* @experimental This class is experimental and does not fall under our BC promise
|
||||
*/
|
||||
final class Helper
|
||||
{
|
||||
/**
|
||||
* Returns a random element from a passed array.
|
||||
*/
|
||||
public static function randomElement(array $array)
|
||||
{
|
||||
if ($array === []) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $array[array_rand($array, 1)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces all hash sign ('#') occurrences with a random number
|
||||
* Replaces all percentage sign ('%') occurrences with a non-zero number.
|
||||
*
|
||||
* @param string $string String that needs to bet parsed
|
||||
*/
|
||||
public static function numerify(string $string): string
|
||||
{
|
||||
// instead of using randomDigit() several times, which is slow,
|
||||
// count the number of hashes and generate once a large number
|
||||
$toReplace = [];
|
||||
|
||||
if (($pos = strpos($string, '#')) !== false) {
|
||||
for ($i = $pos, $last = strrpos($string, '#', $pos) + 1; $i < $last; ++$i) {
|
||||
if ($string[$i] === '#') {
|
||||
$toReplace[] = $i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($nbReplacements = count($toReplace)) {
|
||||
$maxAtOnce = strlen((string) mt_getrandmax()) - 1;
|
||||
$numbers = '';
|
||||
$i = 0;
|
||||
|
||||
while ($i < $nbReplacements) {
|
||||
$size = min($nbReplacements - $i, $maxAtOnce);
|
||||
$numbers .= str_pad((string) mt_rand(0, 10 ** $size - 1), $size, '0', STR_PAD_LEFT);
|
||||
$i += $size;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < $nbReplacements; ++$i) {
|
||||
$string[$toReplace[$i]] = $numbers[$i];
|
||||
}
|
||||
}
|
||||
|
||||
return self::replaceWildcard($string, '%', static function () {
|
||||
return mt_rand(1, 9);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces all question mark ('?') occurrences with a random letter.
|
||||
*
|
||||
* @param string $string String that needs to bet parsed
|
||||
*/
|
||||
public static function lexify(string $string): string
|
||||
{
|
||||
return self::replaceWildcard($string, '?', static function () {
|
||||
return chr(mt_rand(97, 122));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces hash signs ('#') and question marks ('?') with random numbers and letters
|
||||
* An asterisk ('*') is replaced with either a random number or a random letter.
|
||||
*
|
||||
* @param string $string String that needs to bet parsed
|
||||
*/
|
||||
public static function bothify(string $string): string
|
||||
{
|
||||
$string = self::replaceWildcard($string, '*', static function () {
|
||||
return mt_rand(0, 1) === 1 ? '#' : '?';
|
||||
});
|
||||
|
||||
return self::lexify(self::numerify($string));
|
||||
}
|
||||
|
||||
private static function replaceWildcard(string $string, string $wildcard, callable $callback): string
|
||||
{
|
||||
if (($pos = strpos($string, $wildcard)) === false) {
|
||||
return $string;
|
||||
}
|
||||
|
||||
for ($i = $pos, $last = strrpos($string, $wildcard, $pos) + 1; $i < $last; ++$i) {
|
||||
if ($string[$i] === $wildcard) {
|
||||
$string[$i] = call_user_func($callback);
|
||||
}
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
53
vendor/fakerphp/faker/src/Faker/Extension/NumberExtension.php
vendored
Normal file
53
vendor/fakerphp/faker/src/Faker/Extension/NumberExtension.php
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface NumberExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Returns a random number between $int1 and $int2 (any order)
|
||||
*
|
||||
* @param int $min default to 0
|
||||
* @param int $max defaults to 32 bit max integer, ie 2147483647
|
||||
*
|
||||
* @example 79907610
|
||||
*/
|
||||
public function numberBetween(int $min, int $max): int;
|
||||
|
||||
/**
|
||||
* Returns a random number between 0 and 9
|
||||
*/
|
||||
public function randomDigit(): int;
|
||||
|
||||
/**
|
||||
* Generates a random digit, which cannot be $except
|
||||
*/
|
||||
public function randomDigitNot(int $except): int;
|
||||
|
||||
/**
|
||||
* Returns a random number between 1 and 9
|
||||
*/
|
||||
public function randomDigitNotZero(): int;
|
||||
|
||||
/**
|
||||
* Return a random float number
|
||||
*
|
||||
* @example 48.8932
|
||||
*/
|
||||
public function randomFloat(?int $nbMaxDecimals, float $min, ?float $max): float;
|
||||
|
||||
/**
|
||||
* Returns a random integer with 0 to $nbDigits digits.
|
||||
*
|
||||
* The maximum value returned is mt_getrandmax()
|
||||
*
|
||||
* @param int|null $nbDigits Defaults to a random number between 1 and 9
|
||||
* @param bool $strict Whether the returned number should have exactly $nbDigits
|
||||
*
|
||||
* @example 79907610
|
||||
*/
|
||||
public function randomNumber(?int $nbDigits, bool $strict): int;
|
||||
}
|
||||
52
vendor/fakerphp/faker/src/Faker/Extension/PersonExtension.php
vendored
Normal file
52
vendor/fakerphp/faker/src/Faker/Extension/PersonExtension.php
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface PersonExtension extends Extension
|
||||
{
|
||||
public const GENDER_FEMALE = 'female';
|
||||
public const GENDER_MALE = 'male';
|
||||
|
||||
/**
|
||||
* @param string|null $gender 'male', 'female' or null for any
|
||||
*
|
||||
* @example 'John Doe'
|
||||
*/
|
||||
public function name(?string $gender = null): string;
|
||||
|
||||
/**
|
||||
* @param string|null $gender 'male', 'female' or null for any
|
||||
*
|
||||
* @example 'John'
|
||||
*/
|
||||
public function firstName(?string $gender = null): string;
|
||||
|
||||
public function firstNameMale(): string;
|
||||
|
||||
public function firstNameFemale(): string;
|
||||
|
||||
/**
|
||||
* @example 'Doe'
|
||||
*/
|
||||
public function lastName(): string;
|
||||
|
||||
/**
|
||||
* @example 'Mrs.'
|
||||
*
|
||||
* @param string|null $gender 'male', 'female' or null for any
|
||||
*/
|
||||
public function title(?string $gender = null): string;
|
||||
|
||||
/**
|
||||
* @example 'Mr.'
|
||||
*/
|
||||
public function titleMale(): string;
|
||||
|
||||
/**
|
||||
* @example 'Mrs.'
|
||||
*/
|
||||
public function titleFemale(): string;
|
||||
}
|
||||
19
vendor/fakerphp/faker/src/Faker/Extension/PhoneNumberExtension.php
vendored
Normal file
19
vendor/fakerphp/faker/src/Faker/Extension/PhoneNumberExtension.php
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface PhoneNumberExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* @example '555-123-546'
|
||||
*/
|
||||
public function phoneNumber(): string;
|
||||
|
||||
/**
|
||||
* @example +27113456789
|
||||
*/
|
||||
public function e164PhoneNumber(): string;
|
||||
}
|
||||
16
vendor/fakerphp/faker/src/Faker/Extension/UuidExtension.php
vendored
Normal file
16
vendor/fakerphp/faker/src/Faker/Extension/UuidExtension.php
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface UuidExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Generate name based md5 UUID (version 3).
|
||||
*
|
||||
* @example '7e57d004-2b97-0e7a-b45f-5387367791cd'
|
||||
*/
|
||||
public function uuid3(): string;
|
||||
}
|
||||
21
vendor/fakerphp/faker/src/Faker/Extension/VersionExtension.php
vendored
Normal file
21
vendor/fakerphp/faker/src/Faker/Extension/VersionExtension.php
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Extension;
|
||||
|
||||
/**
|
||||
* @experimental This interface is experimental and does not fall under our BC promise
|
||||
*/
|
||||
interface VersionExtension extends Extension
|
||||
{
|
||||
/**
|
||||
* Get a version number in semantic versioning syntax 2.0.0. (https://semver.org/spec/v2.0.0.html)
|
||||
*
|
||||
* @param bool $preRelease Pre release parts may be randomly included
|
||||
* @param bool $build Build parts may be randomly included
|
||||
*
|
||||
* @example 1.0.0
|
||||
* @example 1.0.0-alpha.1
|
||||
* @example 1.0.0-alpha.1+b71f04d
|
||||
*/
|
||||
public function semver(bool $preRelease = false, bool $build = false): string;
|
||||
}
|
||||
71
vendor/fakerphp/faker/src/Faker/Factory.php
vendored
Normal file
71
vendor/fakerphp/faker/src/Faker/Factory.php
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Faker;
|
||||
|
||||
class Factory
|
||||
{
|
||||
public const DEFAULT_LOCALE = 'en_US';
|
||||
|
||||
protected static $defaultProviders = ['Address', 'Barcode', 'Biased', 'Color', 'Company', 'DateTime', 'File', 'HtmlLorem', 'Image', 'Internet', 'Lorem', 'Medical', 'Miscellaneous', 'Payment', 'Person', 'PhoneNumber', 'Text', 'UserAgent', 'Uuid'];
|
||||
|
||||
/**
|
||||
* Create a new generator
|
||||
*
|
||||
* @param string $locale
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public static function create($locale = self::DEFAULT_LOCALE)
|
||||
{
|
||||
$generator = new Generator();
|
||||
|
||||
foreach (static::$defaultProviders as $provider) {
|
||||
$providerClassName = self::getProviderClassname($provider, $locale);
|
||||
$generator->addProvider(new $providerClassName($generator));
|
||||
}
|
||||
|
||||
return $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $provider
|
||||
* @param string $locale
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getProviderClassname($provider, $locale = '')
|
||||
{
|
||||
if ($providerClass = self::findProviderClassname($provider, $locale)) {
|
||||
return $providerClass;
|
||||
}
|
||||
|
||||
// fallback to default locale
|
||||
if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) {
|
||||
return $providerClass;
|
||||
}
|
||||
|
||||
// fallback to no locale
|
||||
if ($providerClass = self::findProviderClassname($provider)) {
|
||||
return $providerClass;
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $provider
|
||||
* @param string $locale
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
protected static function findProviderClassname($provider, $locale = '')
|
||||
{
|
||||
$providerClass = 'Faker\\' . ($locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider));
|
||||
|
||||
if (class_exists($providerClass, true)) {
|
||||
return $providerClass;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
985
vendor/fakerphp/faker/src/Faker/Generator.php
vendored
Normal file
985
vendor/fakerphp/faker/src/Faker/Generator.php
vendored
Normal file
@ -0,0 +1,985 @@
|
||||
<?php
|
||||
|
||||
namespace Faker;
|
||||
|
||||
use Faker\Container\ContainerInterface;
|
||||
|
||||
/**
|
||||
* @property string $citySuffix
|
||||
*
|
||||
* @method string citySuffix()
|
||||
*
|
||||
* @property string $streetSuffix
|
||||
*
|
||||
* @method string streetSuffix()
|
||||
*
|
||||
* @property string $buildingNumber
|
||||
*
|
||||
* @method string buildingNumber()
|
||||
*
|
||||
* @property string $city
|
||||
*
|
||||
* @method string city()
|
||||
*
|
||||
* @property string $streetName
|
||||
*
|
||||
* @method string streetName()
|
||||
*
|
||||
* @property string $streetAddress
|
||||
*
|
||||
* @method string streetAddress()
|
||||
*
|
||||
* @property string $postcode
|
||||
*
|
||||
* @method string postcode()
|
||||
*
|
||||
* @property string $address
|
||||
*
|
||||
* @method string address()
|
||||
*
|
||||
* @property string $country
|
||||
*
|
||||
* @method string country()
|
||||
*
|
||||
* @property float $latitude
|
||||
*
|
||||
* @method float latitude($min = -90, $max = 90)
|
||||
*
|
||||
* @property float $longitude
|
||||
*
|
||||
* @method float longitude($min = -180, $max = 180)
|
||||
*
|
||||
* @property float[] $localCoordinates
|
||||
*
|
||||
* @method float[] localCoordinates()
|
||||
*
|
||||
* @property int $randomDigitNotNull
|
||||
*
|
||||
* @method int randomDigitNotNull()
|
||||
*
|
||||
* @property mixed $passthrough
|
||||
*
|
||||
* @method mixed passthrough($value)
|
||||
*
|
||||
* @property string $randomLetter
|
||||
*
|
||||
* @method string randomLetter()
|
||||
*
|
||||
* @property string $randomAscii
|
||||
*
|
||||
* @method string randomAscii()
|
||||
*
|
||||
* @property array $randomElements
|
||||
*
|
||||
* @method array randomElements($array = ['a', 'b', 'c'], $count = 1, $allowDuplicates = false)
|
||||
*
|
||||
* @property mixed $randomElement
|
||||
*
|
||||
* @method mixed randomElement($array = ['a', 'b', 'c'])
|
||||
*
|
||||
* @property int|string|null $randomKey
|
||||
*
|
||||
* @method int|string|null randomKey($array = [])
|
||||
*
|
||||
* @property array|string $shuffle
|
||||
*
|
||||
* @method array|string shuffle($arg = '')
|
||||
*
|
||||
* @property array $shuffleArray
|
||||
*
|
||||
* @method array shuffleArray($array = [])
|
||||
*
|
||||
* @property string $shuffleString
|
||||
*
|
||||
* @method string shuffleString($string = '', $encoding = 'UTF-8')
|
||||
*
|
||||
* @property string $numerify
|
||||
*
|
||||
* @method string numerify($string = '###')
|
||||
*
|
||||
* @property string $lexify
|
||||
*
|
||||
* @method string lexify($string = '????')
|
||||
*
|
||||
* @property string $bothify
|
||||
*
|
||||
* @method string bothify($string = '## ??')
|
||||
*
|
||||
* @property string $asciify
|
||||
*
|
||||
* @method string asciify($string = '****')
|
||||
*
|
||||
* @property string $regexify
|
||||
*
|
||||
* @method string regexify($regex = '')
|
||||
*
|
||||
* @property string $toLower
|
||||
*
|
||||
* @method string toLower($string = '')
|
||||
*
|
||||
* @property string $toUpper
|
||||
*
|
||||
* @method string toUpper($string = '')
|
||||
*
|
||||
* @property int $biasedNumberBetween
|
||||
*
|
||||
* @method int biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt')
|
||||
*
|
||||
* @property string $hexColor
|
||||
*
|
||||
* @method string hexColor()
|
||||
*
|
||||
* @property string $safeHexColor
|
||||
*
|
||||
* @method string safeHexColor()
|
||||
*
|
||||
* @property array $rgbColorAsArray
|
||||
*
|
||||
* @method array rgbColorAsArray()
|
||||
*
|
||||
* @property string $rgbColor
|
||||
*
|
||||
* @method string rgbColor()
|
||||
*
|
||||
* @property string $rgbCssColor
|
||||
*
|
||||
* @method string rgbCssColor()
|
||||
*
|
||||
* @property string $rgbaCssColor
|
||||
*
|
||||
* @method string rgbaCssColor()
|
||||
*
|
||||
* @property string $safeColorName
|
||||
*
|
||||
* @method string safeColorName()
|
||||
*
|
||||
* @property string $colorName
|
||||
*
|
||||
* @method string colorName()
|
||||
*
|
||||
* @property string $hslColor
|
||||
*
|
||||
* @method string hslColor()
|
||||
*
|
||||
* @property array $hslColorAsArray
|
||||
*
|
||||
* @method array hslColorAsArray()
|
||||
*
|
||||
* @property string $company
|
||||
*
|
||||
* @method string company()
|
||||
*
|
||||
* @property string $companySuffix
|
||||
*
|
||||
* @method string companySuffix()
|
||||
*
|
||||
* @property string $jobTitle
|
||||
*
|
||||
* @method string jobTitle()
|
||||
*
|
||||
* @property int $unixTime
|
||||
*
|
||||
* @method int unixTime($max = 'now')
|
||||
*
|
||||
* @property \DateTime $dateTime
|
||||
*
|
||||
* @method \DateTime dateTime($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeAD
|
||||
*
|
||||
* @method \DateTime dateTimeAD($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property string $iso8601
|
||||
*
|
||||
* @method string iso8601($max = 'now')
|
||||
*
|
||||
* @property string $date
|
||||
*
|
||||
* @method string date($format = 'Y-m-d', $max = 'now')
|
||||
*
|
||||
* @property string $time
|
||||
*
|
||||
* @method string time($format = 'H:i:s', $max = 'now')
|
||||
*
|
||||
* @property \DateTime $dateTimeBetween
|
||||
*
|
||||
* @method \DateTime dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeInInterval
|
||||
*
|
||||
* @method \DateTime dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeThisCentury
|
||||
*
|
||||
* @method \DateTime dateTimeThisCentury($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeThisDecade
|
||||
*
|
||||
* @method \DateTime dateTimeThisDecade($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeThisYear
|
||||
*
|
||||
* @method \DateTime dateTimeThisYear($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property \DateTime $dateTimeThisMonth
|
||||
*
|
||||
* @method \DateTime dateTimeThisMonth($max = 'now', $timezone = null)
|
||||
*
|
||||
* @property string $amPm
|
||||
*
|
||||
* @method string amPm($max = 'now')
|
||||
*
|
||||
* @property string $dayOfMonth
|
||||
*
|
||||
* @method string dayOfMonth($max = 'now')
|
||||
*
|
||||
* @property string $dayOfWeek
|
||||
*
|
||||
* @method string dayOfWeek($max = 'now')
|
||||
*
|
||||
* @property string $month
|
||||
*
|
||||
* @method string month($max = 'now')
|
||||
*
|
||||
* @property string $monthName
|
||||
*
|
||||
* @method string monthName($max = 'now')
|
||||
*
|
||||
* @property string $year
|
||||
*
|
||||
* @method string year($max = 'now')
|
||||
*
|
||||
* @property string $century
|
||||
*
|
||||
* @method string century()
|
||||
*
|
||||
* @property string $timezone
|
||||
*
|
||||
* @method string timezone($countryCode = null)
|
||||
*
|
||||
* @property void $setDefaultTimezone
|
||||
*
|
||||
* @method void setDefaultTimezone($timezone = null)
|
||||
*
|
||||
* @property string $getDefaultTimezone
|
||||
*
|
||||
* @method string getDefaultTimezone()
|
||||
*
|
||||
* @property string $file
|
||||
*
|
||||
* @method string file($sourceDirectory = '/tmp', $targetDirectory = '/tmp', $fullPath = true)
|
||||
*
|
||||
* @property string $randomHtml
|
||||
*
|
||||
* @method string randomHtml($maxDepth = 4, $maxWidth = 4)
|
||||
*
|
||||
* @property string $imageUrl
|
||||
*
|
||||
* @method string imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false, string $format = 'png')
|
||||
*
|
||||
* @property string $image
|
||||
*
|
||||
* @method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null, $gray = false, string $format = 'png')
|
||||
*
|
||||
* @property string $email
|
||||
*
|
||||
* @method string email()
|
||||
*
|
||||
* @property string $safeEmail
|
||||
*
|
||||
* @method string safeEmail()
|
||||
*
|
||||
* @property string $freeEmail
|
||||
*
|
||||
* @method string freeEmail()
|
||||
*
|
||||
* @property string $companyEmail
|
||||
*
|
||||
* @method string companyEmail()
|
||||
*
|
||||
* @property string $freeEmailDomain
|
||||
*
|
||||
* @method string freeEmailDomain()
|
||||
*
|
||||
* @property string $safeEmailDomain
|
||||
*
|
||||
* @method string safeEmailDomain()
|
||||
*
|
||||
* @property string $userName
|
||||
*
|
||||
* @method string userName()
|
||||
*
|
||||
* @property string $password
|
||||
*
|
||||
* @method string password($minLength = 6, $maxLength = 20)
|
||||
*
|
||||
* @property string $domainName
|
||||
*
|
||||
* @method string domainName()
|
||||
*
|
||||
* @property string $domainWord
|
||||
*
|
||||
* @method string domainWord()
|
||||
*
|
||||
* @property string $tld
|
||||
*
|
||||
* @method string tld()
|
||||
*
|
||||
* @property string $url
|
||||
*
|
||||
* @method string url()
|
||||
*
|
||||
* @property string $slug
|
||||
*
|
||||
* @method string slug($nbWords = 6, $variableNbWords = true)
|
||||
*
|
||||
* @property string $ipv4
|
||||
*
|
||||
* @method string ipv4()
|
||||
*
|
||||
* @property string $ipv6
|
||||
*
|
||||
* @method string ipv6()
|
||||
*
|
||||
* @property string $localIpv4
|
||||
*
|
||||
* @method string localIpv4()
|
||||
*
|
||||
* @property string $macAddress
|
||||
*
|
||||
* @method string macAddress()
|
||||
*
|
||||
* @property string $word
|
||||
*
|
||||
* @method string word()
|
||||
*
|
||||
* @property array|string $words
|
||||
*
|
||||
* @method array|string words($nb = 3, $asText = false)
|
||||
*
|
||||
* @property string $sentence
|
||||
*
|
||||
* @method string sentence($nbWords = 6, $variableNbWords = true)
|
||||
*
|
||||
* @property array|string $sentences
|
||||
*
|
||||
* @method array|string sentences($nb = 3, $asText = false)
|
||||
*
|
||||
* @property string $paragraph
|
||||
*
|
||||
* @method string paragraph($nbSentences = 3, $variableNbSentences = true)
|
||||
*
|
||||
* @property array|string $paragraphs
|
||||
*
|
||||
* @method array|string paragraphs($nb = 3, $asText = false)
|
||||
*
|
||||
* @property string $text
|
||||
*
|
||||
* @method string text($maxNbChars = 200)
|
||||
*
|
||||
* @property bool $boolean
|
||||
*
|
||||
* @method bool boolean($chanceOfGettingTrue = 50)
|
||||
*
|
||||
* @property string $md5
|
||||
*
|
||||
* @method string md5()
|
||||
*
|
||||
* @property string $sha1
|
||||
*
|
||||
* @method string sha1()
|
||||
*
|
||||
* @property string $sha256
|
||||
*
|
||||
* @method string sha256()
|
||||
*
|
||||
* @property string $locale
|
||||
*
|
||||
* @method string locale()
|
||||
*
|
||||
* @property string $countryCode
|
||||
*
|
||||
* @method string countryCode()
|
||||
*
|
||||
* @property string $countryISOAlpha3
|
||||
*
|
||||
* @method string countryISOAlpha3()
|
||||
*
|
||||
* @property string $languageCode
|
||||
*
|
||||
* @method string languageCode()
|
||||
*
|
||||
* @property string $currencyCode
|
||||
*
|
||||
* @method string currencyCode()
|
||||
*
|
||||
* @property string $emoji
|
||||
*
|
||||
* @method string emoji()
|
||||
*
|
||||
* @property string $creditCardType
|
||||
*
|
||||
* @method string creditCardType()
|
||||
*
|
||||
* @property string $creditCardNumber
|
||||
*
|
||||
* @method string creditCardNumber($type = null, $formatted = false, $separator = '-')
|
||||
*
|
||||
* @property \DateTime $creditCardExpirationDate
|
||||
*
|
||||
* @method \DateTime creditCardExpirationDate($valid = true)
|
||||
*
|
||||
* @property string $creditCardExpirationDateString
|
||||
*
|
||||
* @method string creditCardExpirationDateString($valid = true, $expirationDateFormat = null)
|
||||
*
|
||||
* @property array $creditCardDetails
|
||||
*
|
||||
* @method array creditCardDetails($valid = true)
|
||||
*
|
||||
* @property string $iban
|
||||
*
|
||||
* @method string iban($countryCode = null, $prefix = '', $length = null)
|
||||
*
|
||||
* @property string $swiftBicNumber
|
||||
*
|
||||
* @method string swiftBicNumber()
|
||||
*
|
||||
* @property string $name
|
||||
*
|
||||
* @method string name($gender = null)
|
||||
*
|
||||
* @property string $firstName
|
||||
*
|
||||
* @method string firstName($gender = null)
|
||||
*
|
||||
* @property string $firstNameMale
|
||||
*
|
||||
* @method string firstNameMale()
|
||||
*
|
||||
* @property string $firstNameFemale
|
||||
*
|
||||
* @method string firstNameFemale()
|
||||
*
|
||||
* @property string $lastName
|
||||
*
|
||||
* @method string lastName($gender = null)
|
||||
*
|
||||
* @property string $title
|
||||
*
|
||||
* @method string title($gender = null)
|
||||
*
|
||||
* @property string $titleMale
|
||||
*
|
||||
* @method string titleMale()
|
||||
*
|
||||
* @property string $titleFemale
|
||||
*
|
||||
* @method string titleFemale()
|
||||
*
|
||||
* @property string $phoneNumber
|
||||
*
|
||||
* @method string phoneNumber()
|
||||
*
|
||||
* @property string $e164PhoneNumber
|
||||
*
|
||||
* @method string e164PhoneNumber()
|
||||
*
|
||||
* @property int $imei
|
||||
*
|
||||
* @method int imei()
|
||||
*
|
||||
* @property string $realText
|
||||
*
|
||||
* @method string realText($maxNbChars = 200, $indexSize = 2)
|
||||
*
|
||||
* @property string $realTextBetween
|
||||
*
|
||||
* @method string realTextBetween($minNbChars = 160, $maxNbChars = 200, $indexSize = 2)
|
||||
*
|
||||
* @property string $macProcessor
|
||||
*
|
||||
* @method string macProcessor()
|
||||
*
|
||||
* @property string $linuxProcessor
|
||||
*
|
||||
* @method string linuxProcessor()
|
||||
*
|
||||
* @property string $userAgent
|
||||
*
|
||||
* @method string userAgent()
|
||||
*
|
||||
* @property string $chrome
|
||||
*
|
||||
* @method string chrome()
|
||||
*
|
||||
* @property string $msedge
|
||||
*
|
||||
* @method string msedge()
|
||||
*
|
||||
* @property string $firefox
|
||||
*
|
||||
* @method string firefox()
|
||||
*
|
||||
* @property string $safari
|
||||
*
|
||||
* @method string safari()
|
||||
*
|
||||
* @property string $opera
|
||||
*
|
||||
* @method string opera()
|
||||
*
|
||||
* @property string $internetExplorer
|
||||
*
|
||||
* @method string internetExplorer()
|
||||
*
|
||||
* @property string $windowsPlatformToken
|
||||
*
|
||||
* @method string windowsPlatformToken()
|
||||
*
|
||||
* @property string $macPlatformToken
|
||||
*
|
||||
* @method string macPlatformToken()
|
||||
*
|
||||
* @property string $iosMobileToken
|
||||
*
|
||||
* @method string iosMobileToken()
|
||||
*
|
||||
* @property string $linuxPlatformToken
|
||||
*
|
||||
* @method string linuxPlatformToken()
|
||||
*
|
||||
* @property string $uuid
|
||||
*
|
||||
* @method string uuid()
|
||||
*/
|
||||
class Generator
|
||||
{
|
||||
protected $providers = [];
|
||||
protected $formatters = [];
|
||||
|
||||
private $container;
|
||||
|
||||
/**
|
||||
* @var UniqueGenerator
|
||||
*/
|
||||
private $uniqueGenerator;
|
||||
|
||||
public function __construct(?ContainerInterface $container = null)
|
||||
{
|
||||
$this->container = $container ?: Container\ContainerBuilder::withDefaultExtensions()->build();
|
||||
}
|
||||
|
||||
/**
|
||||
* @template T of Extension\Extension
|
||||
*
|
||||
* @param class-string<T> $id
|
||||
*
|
||||
* @throws Extension\ExtensionNotFound
|
||||
*
|
||||
* @return T
|
||||
*/
|
||||
public function ext(string $id): Extension\Extension
|
||||
{
|
||||
if (!$this->container->has($id)) {
|
||||
throw new Extension\ExtensionNotFound(sprintf(
|
||||
'No Faker extension with id "%s" was loaded.',
|
||||
$id,
|
||||
));
|
||||
}
|
||||
|
||||
$extension = $this->container->get($id);
|
||||
|
||||
if ($extension instanceof Extension\GeneratorAwareExtension) {
|
||||
$extension = $extension->withGenerator($this);
|
||||
}
|
||||
|
||||
return $extension;
|
||||
}
|
||||
|
||||
public function addProvider($provider)
|
||||
{
|
||||
array_unshift($this->providers, $provider);
|
||||
|
||||
$this->formatters = [];
|
||||
}
|
||||
|
||||
public function getProviders()
|
||||
{
|
||||
return $this->providers;
|
||||
}
|
||||
|
||||
/**
|
||||
* With the unique generator you are guaranteed to never get the same two
|
||||
* values.
|
||||
*
|
||||
* <code>
|
||||
* // will never return twice the same value
|
||||
* $faker->unique()->randomElement(array(1, 2, 3));
|
||||
* </code>
|
||||
*
|
||||
* @param bool $reset If set to true, resets the list of existing values
|
||||
* @param int $maxRetries Maximum number of retries to find a unique value,
|
||||
* After which an OverflowException is thrown.
|
||||
*
|
||||
* @throws \OverflowException When no unique value can be found by iterating $maxRetries times
|
||||
*
|
||||
* @return self A proxy class returning only non-existing values
|
||||
*/
|
||||
public function unique($reset = false, $maxRetries = 10000)
|
||||
{
|
||||
if ($reset || $this->uniqueGenerator === null) {
|
||||
$this->uniqueGenerator = new UniqueGenerator($this, $maxRetries);
|
||||
}
|
||||
|
||||
return $this->uniqueGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value only some percentage of the time.
|
||||
*
|
||||
* @param float $weight A probability between 0 and 1, 0 means that we always get the default value.
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public function optional(float $weight = 0.5, $default = null)
|
||||
{
|
||||
if ($weight > 1) {
|
||||
trigger_deprecation('fakerphp/faker', '1.16', 'First argument ($weight) to method "optional()" must be between 0 and 1. You passed %f, we assume you meant %f.', $weight, $weight / 100);
|
||||
$weight = $weight / 100;
|
||||
}
|
||||
|
||||
return new ChanceGenerator($this, $weight, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* To make sure the value meet some criteria, pass a callable that verifies the
|
||||
* output. If the validator fails, the generator will try again.
|
||||
*
|
||||
* The value validity is determined by a function passed as first argument.
|
||||
*
|
||||
* <code>
|
||||
* $values = array();
|
||||
* $evenValidator = function ($digit) {
|
||||
* return $digit % 2 === 0;
|
||||
* };
|
||||
* for ($i=0; $i < 10; $i++) {
|
||||
* $values []= $faker->valid($evenValidator)->randomDigit;
|
||||
* }
|
||||
* print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6]
|
||||
* </code>
|
||||
*
|
||||
* @param ?\Closure $validator A function returning true for valid values
|
||||
* @param int $maxRetries Maximum number of retries to find a valid value,
|
||||
* After which an OverflowException is thrown.
|
||||
*
|
||||
* @throws \OverflowException When no valid value can be found by iterating $maxRetries times
|
||||
*
|
||||
* @return self A proxy class returning only valid values
|
||||
*/
|
||||
public function valid(?\Closure $validator = null, int $maxRetries = 10000)
|
||||
{
|
||||
return new ValidGenerator($this, $validator, $maxRetries);
|
||||
}
|
||||
|
||||
public function seed($seed = null)
|
||||
{
|
||||
if ($seed === null) {
|
||||
mt_srand();
|
||||
} else {
|
||||
mt_srand((int) $seed, self::mode());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://www.php.net/manual/en/migration83.deprecated.php#migration83.deprecated.random
|
||||
*/
|
||||
private static function mode(): int
|
||||
{
|
||||
if (PHP_VERSION_ID < 80300) {
|
||||
return MT_RAND_PHP;
|
||||
}
|
||||
|
||||
return MT_RAND_MT19937;
|
||||
}
|
||||
|
||||
public function format($format, $arguments = [])
|
||||
{
|
||||
return call_user_func_array($this->getFormatter($format), $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
public function getFormatter($format)
|
||||
{
|
||||
if (isset($this->formatters[$format])) {
|
||||
return $this->formatters[$format];
|
||||
}
|
||||
|
||||
if (method_exists($this, $format)) {
|
||||
$this->formatters[$format] = [$this, $format];
|
||||
|
||||
return $this->formatters[$format];
|
||||
}
|
||||
|
||||
// "Faker\Core\Barcode->ean13"
|
||||
if (preg_match('|^([a-zA-Z0-9\\\]+)->([a-zA-Z0-9]+)$|', $format, $matches)) {
|
||||
$this->formatters[$format] = [$this->ext($matches[1]), $matches[2]];
|
||||
|
||||
return $this->formatters[$format];
|
||||
}
|
||||
|
||||
foreach ($this->providers as $provider) {
|
||||
if (method_exists($provider, $format)) {
|
||||
$this->formatters[$format] = [$provider, $format];
|
||||
|
||||
return $this->formatters[$format];
|
||||
}
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException(sprintf('Unknown format "%s"', $format));
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces tokens ('{{ tokenName }}') with the result from the token method call
|
||||
*
|
||||
* @param string $string String that needs to bet parsed
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function parse($string)
|
||||
{
|
||||
$callback = function ($matches) {
|
||||
return $this->format($matches[1]);
|
||||
};
|
||||
|
||||
return preg_replace_callback('/{{\s?(\w+|[\w\\\]+->\w+?)\s?}}/u', $callback, $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random MIME type
|
||||
*
|
||||
* @example 'video/avi'
|
||||
*/
|
||||
public function mimeType()
|
||||
{
|
||||
return $this->ext(Extension\FileExtension::class)->mimeType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random file extension (without a dot)
|
||||
*
|
||||
* @example avi
|
||||
*/
|
||||
public function fileExtension()
|
||||
{
|
||||
return $this->ext(Extension\FileExtension::class)->extension();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a full path to a new real file on the system.
|
||||
*/
|
||||
public function filePath()
|
||||
{
|
||||
return $this->ext(Extension\FileExtension::class)->filePath();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an actual blood type
|
||||
*
|
||||
* @example 'AB'
|
||||
*/
|
||||
public function bloodType(): string
|
||||
{
|
||||
return $this->ext(Extension\BloodExtension::class)->bloodType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random resis value
|
||||
*
|
||||
* @example '+'
|
||||
*/
|
||||
public function bloodRh(): string
|
||||
{
|
||||
return $this->ext(Extension\BloodExtension::class)->bloodRh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a full blood group
|
||||
*
|
||||
* @example 'AB+'
|
||||
*/
|
||||
public function bloodGroup(): string
|
||||
{
|
||||
return $this->ext(Extension\BloodExtension::class)->bloodGroup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random EAN13 barcode.
|
||||
*
|
||||
* @example '4006381333931'
|
||||
*/
|
||||
public function ean13(): string
|
||||
{
|
||||
return $this->ext(Extension\BarcodeExtension::class)->ean13();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random EAN8 barcode.
|
||||
*
|
||||
* @example '73513537'
|
||||
*/
|
||||
public function ean8(): string
|
||||
{
|
||||
return $this->ext(Extension\BarcodeExtension::class)->ean8();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random ISBN-10 code
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
||||
*
|
||||
* @example '4881416324'
|
||||
*/
|
||||
public function isbn10(): string
|
||||
{
|
||||
return $this->ext(Extension\BarcodeExtension::class)->isbn10();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random ISBN-13 code
|
||||
*
|
||||
* @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
|
||||
*
|
||||
* @example '9790404436093'
|
||||
*/
|
||||
public function isbn13(): string
|
||||
{
|
||||
return $this->ext(Extension\BarcodeExtension::class)->isbn13();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random number between $int1 and $int2 (any order)
|
||||
*
|
||||
* @example 79907610
|
||||
*/
|
||||
public function numberBetween($int1 = 0, $int2 = 2147483647): int
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->numberBetween((int) $int1, (int) $int2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random number between 0 and 9
|
||||
*/
|
||||
public function randomDigit(): int
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->randomDigit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a random digit, which cannot be $except
|
||||
*/
|
||||
public function randomDigitNot($except): int
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->randomDigitNot((int) $except);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random number between 1 and 9
|
||||
*/
|
||||
public function randomDigitNotZero(): int
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->randomDigitNotZero();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a random float number
|
||||
*
|
||||
* @example 48.8932
|
||||
*/
|
||||
public function randomFloat($nbMaxDecimals = null, $min = 0, $max = null): float
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->randomFloat(
|
||||
$nbMaxDecimals !== null ? (int) $nbMaxDecimals : null,
|
||||
(float) $min,
|
||||
$max !== null ? (float) $max : null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random integer with 0 to $nbDigits digits.
|
||||
*
|
||||
* The maximum value returned is mt_getrandmax()
|
||||
*
|
||||
* @param int|null $nbDigits Defaults to a random number between 1 and 9
|
||||
* @param bool $strict Whether the returned number should have exactly $nbDigits
|
||||
*
|
||||
* @example 79907610
|
||||
*/
|
||||
public function randomNumber($nbDigits = null, $strict = false): int
|
||||
{
|
||||
return $this->ext(Extension\NumberExtension::class)->randomNumber(
|
||||
$nbDigits !== null ? (int) $nbDigits : null,
|
||||
(bool) $strict,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a version number in semantic versioning syntax 2.0.0. (https://semver.org/spec/v2.0.0.html)
|
||||
*
|
||||
* @param bool $preRelease Pre release parts may be randomly included
|
||||
* @param bool $build Build parts may be randomly included
|
||||
*
|
||||
* @example 1.0.0
|
||||
* @example 1.0.0-alpha.1
|
||||
* @example 1.0.0-alpha.1+b71f04d
|
||||
*/
|
||||
public function semver(bool $preRelease = false, bool $build = false): string
|
||||
{
|
||||
return $this->ext(Extension\VersionExtension::class)->semver($preRelease, $build);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
protected function callFormatWithMatches($matches)
|
||||
{
|
||||
trigger_deprecation('fakerphp/faker', '1.14', 'Protected method "callFormatWithMatches()" is deprecated and will be removed.');
|
||||
|
||||
return $this->format($matches[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $attribute
|
||||
*
|
||||
* @deprecated Use a method instead.
|
||||
*/
|
||||
public function __get($attribute)
|
||||
{
|
||||
trigger_deprecation('fakerphp/faker', '1.14', 'Accessing property "%s" is deprecated, use "%s()" instead.', $attribute, $attribute);
|
||||
|
||||
return $this->format($attribute);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param array $attributes
|
||||
*/
|
||||
public function __call($method, $attributes)
|
||||
{
|
||||
return $this->format($method, $attributes);
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
$this->seed();
|
||||
}
|
||||
|
||||
public function __wakeup()
|
||||
{
|
||||
$this->formatters = [];
|
||||
}
|
||||
}
|
||||
180
vendor/fakerphp/faker/src/Faker/Guesser/Name.php
vendored
Normal file
180
vendor/fakerphp/faker/src/Faker/Guesser/Name.php
vendored
Normal file
@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Guesser;
|
||||
|
||||
use Faker\Provider\Base;
|
||||
|
||||
class Name
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(\Faker\Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param int|null $size Length of field, if known
|
||||
*
|
||||
* @return callable|null
|
||||
*/
|
||||
public function guessFormat($name, $size = null)
|
||||
{
|
||||
$name = Base::toLower($name);
|
||||
$generator = $this->generator;
|
||||
|
||||
if (preg_match('/^is[_A-Z]/', $name)) {
|
||||
return static function () use ($generator) {
|
||||
return $generator->boolean();
|
||||
};
|
||||
}
|
||||
|
||||
if (preg_match('/(_a|A)t$/', $name)) {
|
||||
return static function () use ($generator) {
|
||||
return $generator->dateTime();
|
||||
};
|
||||
}
|
||||
|
||||
switch (str_replace('_', '', $name)) {
|
||||
case 'firstname':
|
||||
return static function () use ($generator) {
|
||||
return $generator->firstName();
|
||||
};
|
||||
|
||||
case 'lastname':
|
||||
return static function () use ($generator) {
|
||||
return $generator->lastName();
|
||||
};
|
||||
|
||||
case 'username':
|
||||
case 'login':
|
||||
return static function () use ($generator) {
|
||||
return $generator->userName();
|
||||
};
|
||||
|
||||
case 'email':
|
||||
case 'emailaddress':
|
||||
return static function () use ($generator) {
|
||||
return $generator->email();
|
||||
};
|
||||
|
||||
case 'phonenumber':
|
||||
case 'phone':
|
||||
case 'telephone':
|
||||
case 'telnumber':
|
||||
return static function () use ($generator) {
|
||||
return $generator->phoneNumber();
|
||||
};
|
||||
|
||||
case 'address':
|
||||
return static function () use ($generator) {
|
||||
return $generator->address();
|
||||
};
|
||||
|
||||
case 'city':
|
||||
case 'town':
|
||||
return static function () use ($generator) {
|
||||
return $generator->city();
|
||||
};
|
||||
|
||||
case 'streetaddress':
|
||||
return static function () use ($generator) {
|
||||
return $generator->streetAddress();
|
||||
};
|
||||
|
||||
case 'postcode':
|
||||
case 'zipcode':
|
||||
return static function () use ($generator) {
|
||||
return $generator->postcode();
|
||||
};
|
||||
|
||||
case 'state':
|
||||
return static function () use ($generator) {
|
||||
return $generator->state();
|
||||
};
|
||||
|
||||
case 'county':
|
||||
if ($this->generator->locale == 'en_US') {
|
||||
return static function () use ($generator) {
|
||||
return sprintf('%s County', $generator->city());
|
||||
};
|
||||
}
|
||||
|
||||
return static function () use ($generator) {
|
||||
return $generator->state();
|
||||
};
|
||||
|
||||
case 'country':
|
||||
switch ($size) {
|
||||
case 2:
|
||||
return static function () use ($generator) {
|
||||
return $generator->countryCode();
|
||||
};
|
||||
|
||||
case 3:
|
||||
return static function () use ($generator) {
|
||||
return $generator->countryISOAlpha3();
|
||||
};
|
||||
|
||||
case 5:
|
||||
case 6:
|
||||
return static function () use ($generator) {
|
||||
return $generator->locale();
|
||||
};
|
||||
|
||||
default:
|
||||
return static function () use ($generator) {
|
||||
return $generator->country();
|
||||
};
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'locale':
|
||||
return static function () use ($generator) {
|
||||
return $generator->locale();
|
||||
};
|
||||
|
||||
case 'currency':
|
||||
case 'currencycode':
|
||||
return static function () use ($generator) {
|
||||
return $generator->currencyCode();
|
||||
};
|
||||
|
||||
case 'url':
|
||||
case 'website':
|
||||
return static function () use ($generator) {
|
||||
return $generator->url();
|
||||
};
|
||||
|
||||
case 'company':
|
||||
case 'companyname':
|
||||
case 'employer':
|
||||
return static function () use ($generator) {
|
||||
return $generator->company();
|
||||
};
|
||||
|
||||
case 'title':
|
||||
if ($size !== null && $size <= 10) {
|
||||
return static function () use ($generator) {
|
||||
return $generator->title();
|
||||
};
|
||||
}
|
||||
|
||||
return static function () use ($generator) {
|
||||
return $generator->sentence();
|
||||
};
|
||||
|
||||
case 'body':
|
||||
case 'summary':
|
||||
case 'article':
|
||||
case 'description':
|
||||
return static function () use ($generator) {
|
||||
return $generator->text();
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
79
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php
vendored
Normal file
79
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php
vendored
Normal file
@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\CakePHP;
|
||||
|
||||
class ColumnTypeGuesser
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(\Faker\Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Closure|null
|
||||
*/
|
||||
public function guessFormat($column, $table)
|
||||
{
|
||||
$generator = $this->generator;
|
||||
$schema = $table->schema();
|
||||
|
||||
switch ($schema->columnType($column)) {
|
||||
case 'boolean':
|
||||
return static function () use ($generator) {
|
||||
return $generator->boolean;
|
||||
};
|
||||
|
||||
case 'integer':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 2147483647);
|
||||
};
|
||||
|
||||
case 'biginteger':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, PHP_INT_MAX);
|
||||
};
|
||||
|
||||
case 'decimal':
|
||||
case 'float':
|
||||
return static function () use ($generator) {
|
||||
return $generator->randomFloat();
|
||||
};
|
||||
|
||||
case 'uuid':
|
||||
return static function () use ($generator) {
|
||||
return $generator->uuid();
|
||||
};
|
||||
|
||||
case 'string':
|
||||
if (method_exists($schema, 'getColumn')) {
|
||||
$columnData = $schema->getColumn($column);
|
||||
} else {
|
||||
$columnData = $schema->column($column);
|
||||
}
|
||||
$length = $columnData['length'];
|
||||
|
||||
return static function () use ($generator, $length) {
|
||||
return $generator->text($length);
|
||||
};
|
||||
|
||||
case 'text':
|
||||
return static function () use ($generator) {
|
||||
return $generator->text();
|
||||
};
|
||||
|
||||
case 'date':
|
||||
case 'datetime':
|
||||
case 'timestamp':
|
||||
case 'time':
|
||||
return static function () use ($generator) {
|
||||
return $generator->datetime();
|
||||
};
|
||||
|
||||
case 'binary':
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
173
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/EntityPopulator.php
vendored
Normal file
173
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/EntityPopulator.php
vendored
Normal file
@ -0,0 +1,173 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\CakePHP;
|
||||
|
||||
use Cake\ORM\TableRegistry;
|
||||
|
||||
class EntityPopulator
|
||||
{
|
||||
protected $class;
|
||||
protected $connectionName;
|
||||
protected $columnFormatters = [];
|
||||
protected $modifiers = [];
|
||||
|
||||
public function __construct($class)
|
||||
{
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
return $this->{$name};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$this->{$name} = $value;
|
||||
}
|
||||
|
||||
public function mergeColumnFormattersWith($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
|
||||
}
|
||||
|
||||
public function mergeModifiersWith($modifiers)
|
||||
{
|
||||
$this->modifiers = array_merge($this->modifiers, $modifiers);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessColumnFormatters($populator)
|
||||
{
|
||||
$formatters = [];
|
||||
$class = $this->class;
|
||||
$table = $this->getTable($class);
|
||||
$schema = $table->schema();
|
||||
$pk = $schema->primaryKey();
|
||||
$guessers = $populator->getGuessers() + ['ColumnTypeGuesser' => new ColumnTypeGuesser($populator->getGenerator())];
|
||||
$isForeignKey = static function ($column) use ($table) {
|
||||
foreach ($table->associations()->type('BelongsTo') as $assoc) {
|
||||
if ($column == $assoc->foreignKey()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
foreach ($schema->columns() as $column) {
|
||||
if ($column == $pk[0] || $isForeignKey($column)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($guessers as $guesser) {
|
||||
if ($formatter = $guesser->guessFormat($column, $table)) {
|
||||
$formatters[$column] = $formatter;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $formatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessModifiers()
|
||||
{
|
||||
$modifiers = [];
|
||||
$table = $this->getTable($this->class);
|
||||
|
||||
$belongsTo = $table->associations()->type('BelongsTo');
|
||||
|
||||
foreach ($belongsTo as $assoc) {
|
||||
$modifiers['belongsTo' . $assoc->name()] = function ($data, $insertedEntities) use ($assoc) {
|
||||
$table = $assoc->target();
|
||||
$foreignModel = $table->alias();
|
||||
|
||||
$foreignKeys = [];
|
||||
|
||||
if (!empty($insertedEntities[$foreignModel])) {
|
||||
$foreignKeys = $insertedEntities[$foreignModel];
|
||||
} else {
|
||||
$foreignKeys = $table->find('all')
|
||||
->select(['id'])
|
||||
->map(static function ($row) {
|
||||
return $row->id;
|
||||
})
|
||||
->toArray();
|
||||
}
|
||||
|
||||
if (empty($foreignKeys)) {
|
||||
throw new \Exception(sprintf('%s belongsTo %s, which seems empty at this point.', $this->getTable($this->class)->table(), $assoc->table()));
|
||||
}
|
||||
|
||||
$foreignKey = $foreignKeys[array_rand($foreignKeys)];
|
||||
$data[$assoc->foreignKey()] = $foreignKey;
|
||||
|
||||
return $data;
|
||||
};
|
||||
}
|
||||
|
||||
// TODO check if TreeBehavior attached to modify lft/rgt cols
|
||||
|
||||
return $modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $options
|
||||
*/
|
||||
public function execute($class, $insertedEntities, $options = [])
|
||||
{
|
||||
$table = $this->getTable($class);
|
||||
$entity = $table->newEntity();
|
||||
|
||||
foreach ($this->columnFormatters as $column => $format) {
|
||||
if (null !== $format) {
|
||||
$entity->{$column} = is_callable($format) ? $format($insertedEntities, $table) : $format;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($this->modifiers as $modifier) {
|
||||
$entity = $modifier($entity, $insertedEntities);
|
||||
}
|
||||
|
||||
if (!$entity = $table->save($entity, $options)) {
|
||||
throw new \RuntimeException("Failed saving $class record");
|
||||
}
|
||||
|
||||
$pk = $table->primaryKey();
|
||||
|
||||
if (is_string($pk)) {
|
||||
return $entity->{$pk};
|
||||
}
|
||||
|
||||
return $entity->{$pk[0]};
|
||||
}
|
||||
|
||||
public function setConnection($name)
|
||||
{
|
||||
$this->connectionName = $name;
|
||||
}
|
||||
|
||||
protected function getTable($class)
|
||||
{
|
||||
$options = [];
|
||||
|
||||
if (!empty($this->connectionName)) {
|
||||
$options['connection'] = $this->connectionName;
|
||||
}
|
||||
|
||||
return TableRegistry::get($class, $options);
|
||||
}
|
||||
}
|
||||
113
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/Populator.php
vendored
Normal file
113
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/Populator.php
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\CakePHP;
|
||||
|
||||
class Populator
|
||||
{
|
||||
protected $generator;
|
||||
protected $entities = [];
|
||||
protected $quantities = [];
|
||||
protected $guessers = [];
|
||||
|
||||
public function __construct(\Faker\Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Faker\Generator
|
||||
*/
|
||||
public function getGenerator()
|
||||
{
|
||||
return $this->generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getGuessers()
|
||||
{
|
||||
return $this->guessers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function removeGuesser($name)
|
||||
{
|
||||
if ($this->guessers[$name]) {
|
||||
unset($this->guessers[$name]);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addGuesser($class)
|
||||
{
|
||||
if (!is_object($class)) {
|
||||
$class = new $class($this->generator);
|
||||
}
|
||||
|
||||
if (!method_exists($class, 'guessFormat')) {
|
||||
throw new \Exception('Missing required custom guesser method: ' . get_class($class) . '::guessFormat()');
|
||||
}
|
||||
|
||||
$this->guessers[get_class($class)] = $class;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $customColumnFormatters
|
||||
* @param array $customModifiers
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = [])
|
||||
{
|
||||
if (!$entity instanceof EntityPopulator) {
|
||||
$entity = new EntityPopulator($entity);
|
||||
}
|
||||
|
||||
$entity->columnFormatters = $entity->guessColumnFormatters($this);
|
||||
|
||||
if ($customColumnFormatters) {
|
||||
$entity->mergeColumnFormattersWith($customColumnFormatters);
|
||||
}
|
||||
|
||||
$entity->modifiers = $entity->guessModifiers($this);
|
||||
|
||||
if ($customModifiers) {
|
||||
$entity->mergeModifiersWith($customModifiers);
|
||||
}
|
||||
|
||||
$class = $entity->class;
|
||||
$this->entities[$class] = $entity;
|
||||
$this->quantities[$class] = $number;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $options
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function execute($options = [])
|
||||
{
|
||||
$insertedEntities = [];
|
||||
|
||||
foreach ($this->quantities as $class => $number) {
|
||||
for ($i = 0; $i < $number; ++$i) {
|
||||
$insertedEntities[$class][] = $this->entities[$class]->execute($class, $insertedEntities, $options);
|
||||
}
|
||||
}
|
||||
|
||||
return $insertedEntities;
|
||||
}
|
||||
}
|
||||
91
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php
vendored
Normal file
91
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Doctrine;
|
||||
|
||||
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
|
||||
use Faker\Generator;
|
||||
|
||||
require_once 'backward-compatibility.php';
|
||||
|
||||
class ColumnTypeGuesser
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Closure|null
|
||||
*/
|
||||
public function guessFormat($fieldName, ClassMetadata $class)
|
||||
{
|
||||
$generator = $this->generator;
|
||||
$type = $class->getTypeOfField($fieldName);
|
||||
|
||||
switch ($type) {
|
||||
case 'boolean':
|
||||
return static function () use ($generator) {
|
||||
return $generator->boolean();
|
||||
};
|
||||
|
||||
case 'decimal':
|
||||
$size = $class->fieldMappings[$fieldName]['precision'] ?? 2;
|
||||
|
||||
return static function () use ($generator, $size) {
|
||||
return $generator->randomNumber($size + 2) / 100;
|
||||
};
|
||||
|
||||
case 'smallint':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 65535);
|
||||
};
|
||||
|
||||
case 'integer':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 2147483647);
|
||||
};
|
||||
|
||||
case 'bigint':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, PHP_INT_MAX);
|
||||
};
|
||||
|
||||
case 'float':
|
||||
return static function () use ($generator) {
|
||||
return $generator->randomFloat();
|
||||
};
|
||||
|
||||
case 'string':
|
||||
$size = $class->fieldMappings[$fieldName]['length'] ?? 255;
|
||||
|
||||
return static function () use ($generator, $size) {
|
||||
return $generator->text($size);
|
||||
};
|
||||
|
||||
case 'text':
|
||||
return static function () use ($generator) {
|
||||
return $generator->text();
|
||||
};
|
||||
|
||||
case 'datetime':
|
||||
case 'date':
|
||||
case 'time':
|
||||
return static function () use ($generator) {
|
||||
return $generator->datetime();
|
||||
};
|
||||
|
||||
case 'datetime_immutable':
|
||||
case 'date_immutable':
|
||||
case 'time_immutable':
|
||||
return static function () use ($generator) {
|
||||
return \DateTimeImmutable::createFromMutable($generator->datetime);
|
||||
};
|
||||
|
||||
default:
|
||||
// no smart way to guess what the user expects here
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
248
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php
vendored
Normal file
248
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php
vendored
Normal file
@ -0,0 +1,248 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Doctrine;
|
||||
|
||||
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
|
||||
use Doctrine\Common\Persistence\ObjectManager;
|
||||
|
||||
require_once 'backward-compatibility.php';
|
||||
|
||||
/**
|
||||
* Service class for populating a table through a Doctrine Entity class.
|
||||
*/
|
||||
class EntityPopulator
|
||||
{
|
||||
/**
|
||||
* @var ClassMetadata
|
||||
*/
|
||||
protected $class;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $columnFormatters = [];
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $modifiers = [];
|
||||
|
||||
public function __construct(ClassMetadata $class)
|
||||
{
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getClass()
|
||||
{
|
||||
return $this->class->getName();
|
||||
}
|
||||
|
||||
public function setColumnFormatters($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = $columnFormatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getColumnFormatters()
|
||||
{
|
||||
return $this->columnFormatters;
|
||||
}
|
||||
|
||||
public function mergeColumnFormattersWith($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
|
||||
}
|
||||
|
||||
public function setModifiers(array $modifiers)
|
||||
{
|
||||
$this->modifiers = $modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getModifiers()
|
||||
{
|
||||
return $this->modifiers;
|
||||
}
|
||||
|
||||
public function mergeModifiersWith(array $modifiers)
|
||||
{
|
||||
$this->modifiers = array_merge($this->modifiers, $modifiers);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessColumnFormatters(\Faker\Generator $generator)
|
||||
{
|
||||
$formatters = [];
|
||||
$nameGuesser = new \Faker\Guesser\Name($generator);
|
||||
$columnTypeGuesser = new ColumnTypeGuesser($generator);
|
||||
|
||||
foreach ($this->class->getFieldNames() as $fieldName) {
|
||||
if ($this->class->isIdentifier($fieldName) || !$this->class->hasField($fieldName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$size = $this->class->fieldMappings[$fieldName]['length'] ?? null;
|
||||
|
||||
if ($formatter = $nameGuesser->guessFormat($fieldName, $size)) {
|
||||
$formatters[$fieldName] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($formatter = $columnTypeGuesser->guessFormat($fieldName, $this->class)) {
|
||||
$formatters[$fieldName] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($this->class->getAssociationNames() as $assocName) {
|
||||
if ($this->class->isCollectionValuedAssociation($assocName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$relatedClass = $this->class->getAssociationTargetClass($assocName);
|
||||
|
||||
$unique = $optional = false;
|
||||
|
||||
if ($this->class instanceof \Doctrine\ORM\Mapping\ClassMetadata) {
|
||||
$mappings = $this->class->getAssociationMappings();
|
||||
|
||||
foreach ($mappings as $mapping) {
|
||||
if ($mapping['targetEntity'] == $relatedClass) {
|
||||
if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_ONE) {
|
||||
$unique = true;
|
||||
$optional = $mapping['joinColumns'][0]['nullable'] ?? false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif ($this->class instanceof \Doctrine\ODM\MongoDB\Mapping\ClassMetadata) {
|
||||
$mappings = $this->class->associationMappings;
|
||||
|
||||
foreach ($mappings as $mapping) {
|
||||
if ($mapping['targetDocument'] == $relatedClass) {
|
||||
if ($mapping['type'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::ONE && $mapping['association'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::REFERENCE_ONE) {
|
||||
$unique = true;
|
||||
$optional = $mapping['nullable'] ?? false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$index = 0;
|
||||
$formatters[$assocName] = static function ($inserted) use ($relatedClass, &$index, $unique, $optional, $generator) {
|
||||
if (isset($inserted[$relatedClass])) {
|
||||
if ($unique) {
|
||||
$related = null;
|
||||
|
||||
if (isset($inserted[$relatedClass][$index]) || !$optional) {
|
||||
$related = $inserted[$relatedClass][$index];
|
||||
}
|
||||
|
||||
++$index;
|
||||
|
||||
return $related;
|
||||
}
|
||||
|
||||
return $generator->randomElement($inserted[$relatedClass]);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
}
|
||||
|
||||
return $formatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert one new record using the Entity class.
|
||||
*
|
||||
* @param bool $generateId
|
||||
*
|
||||
* @return EntityPopulator
|
||||
*/
|
||||
public function execute(ObjectManager $manager, $insertedEntities, $generateId = false)
|
||||
{
|
||||
$obj = $this->class->newInstance();
|
||||
|
||||
$this->fillColumns($obj, $insertedEntities);
|
||||
$this->callMethods($obj, $insertedEntities);
|
||||
|
||||
if ($generateId) {
|
||||
$idsName = $this->class->getIdentifier();
|
||||
|
||||
foreach ($idsName as $idName) {
|
||||
$id = $this->generateId($obj, $idName, $manager);
|
||||
$this->class->reflFields[$idName]->setValue($obj, $id);
|
||||
}
|
||||
}
|
||||
|
||||
$manager->persist($obj);
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
private function fillColumns($obj, $insertedEntities): void
|
||||
{
|
||||
foreach ($this->columnFormatters as $field => $format) {
|
||||
if (null !== $format) {
|
||||
// Add some extended debugging information to any errors thrown by the formatter
|
||||
try {
|
||||
$value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
|
||||
} catch (\InvalidArgumentException $ex) {
|
||||
throw new \InvalidArgumentException(sprintf(
|
||||
'Failed to generate a value for %s::%s: %s',
|
||||
get_class($obj),
|
||||
$field,
|
||||
$ex->getMessage(),
|
||||
));
|
||||
}
|
||||
// Try a standard setter if it's available, otherwise fall back on reflection
|
||||
$setter = sprintf('set%s', ucfirst($field));
|
||||
|
||||
if (is_callable([$obj, $setter])) {
|
||||
$obj->$setter($value);
|
||||
} else {
|
||||
$this->class->reflFields[$field]->setValue($obj, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function callMethods($obj, $insertedEntities): void
|
||||
{
|
||||
foreach ($this->getModifiers() as $modifier) {
|
||||
$modifier($obj, $insertedEntities);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
private function generateId($obj, $column, ObjectManager $manager)
|
||||
{
|
||||
$repository = $manager->getRepository(get_class($obj));
|
||||
$result = $repository->createQueryBuilder('e')
|
||||
->select(sprintf('e.%s', $column))
|
||||
->getQuery()
|
||||
->execute();
|
||||
$ids = array_map('current', $result->toArray());
|
||||
|
||||
do {
|
||||
$id = mt_rand();
|
||||
} while (in_array($id, $ids, false));
|
||||
|
||||
return $id;
|
||||
}
|
||||
}
|
||||
126
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php
vendored
Normal file
126
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Doctrine;
|
||||
|
||||
use Doctrine\Common\Persistence\ObjectManager;
|
||||
use Faker\Generator;
|
||||
|
||||
require_once 'backward-compatibility.php';
|
||||
|
||||
/**
|
||||
* Service class for populating a database using the Doctrine ORM or ODM.
|
||||
* A Populator can populate several tables using ActiveRecord classes.
|
||||
*/
|
||||
class Populator
|
||||
{
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $batchSize;
|
||||
|
||||
/**
|
||||
* @var Generator
|
||||
*/
|
||||
protected $generator;
|
||||
|
||||
/**
|
||||
* @var ObjectManager|null
|
||||
*/
|
||||
protected $manager;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $entities = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $quantities = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $generateId = [];
|
||||
|
||||
/**
|
||||
* Populator constructor.
|
||||
*
|
||||
* @param int $batchSize
|
||||
*/
|
||||
public function __construct(Generator $generator, ?ObjectManager $manager = null, $batchSize = 1000)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
$this->manager = $manager;
|
||||
$this->batchSize = $batchSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an order for the generation of $number records for $entity.
|
||||
*
|
||||
* @param mixed $entity A Doctrine classname, or a \Faker\ORM\Doctrine\EntityPopulator instance
|
||||
* @param int $number The number of entities to populate
|
||||
*/
|
||||
public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = [], $generateId = false)
|
||||
{
|
||||
if (!$entity instanceof \Faker\ORM\Doctrine\EntityPopulator) {
|
||||
if (null === $this->manager) {
|
||||
throw new \InvalidArgumentException('No entity manager passed to Doctrine Populator.');
|
||||
}
|
||||
$entity = new \Faker\ORM\Doctrine\EntityPopulator($this->manager->getClassMetadata($entity));
|
||||
}
|
||||
$entity->setColumnFormatters($entity->guessColumnFormatters($this->generator));
|
||||
|
||||
if ($customColumnFormatters) {
|
||||
$entity->mergeColumnFormattersWith($customColumnFormatters);
|
||||
}
|
||||
$entity->mergeModifiersWith($customModifiers);
|
||||
$this->generateId[$entity->getClass()] = $generateId;
|
||||
|
||||
$class = $entity->getClass();
|
||||
$this->entities[$class] = $entity;
|
||||
$this->quantities[$class] = $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate the database using all the Entity classes previously added.
|
||||
*
|
||||
* Please note that large amounts of data will result in more memory usage since the the Populator will return
|
||||
* all newly created primary keys after executing.
|
||||
*
|
||||
* @param ObjectManager|null $entityManager A Doctrine connection object
|
||||
*
|
||||
* @return array A list of the inserted PKs
|
||||
*/
|
||||
public function execute($entityManager = null)
|
||||
{
|
||||
if (null === $entityManager) {
|
||||
$entityManager = $this->manager;
|
||||
}
|
||||
|
||||
if (null === $entityManager) {
|
||||
throw new \InvalidArgumentException('No entity manager passed to Doctrine Populator.');
|
||||
}
|
||||
|
||||
$insertedEntities = [];
|
||||
|
||||
foreach ($this->quantities as $class => $number) {
|
||||
$generateId = $this->generateId[$class];
|
||||
|
||||
for ($i = 0; $i < $number; ++$i) {
|
||||
$insertedEntities[$class][] = $this->entities[$class]->execute(
|
||||
$entityManager,
|
||||
$insertedEntities,
|
||||
$generateId,
|
||||
);
|
||||
|
||||
if (count($insertedEntities) % $this->batchSize === 0) {
|
||||
$entityManager->flush();
|
||||
}
|
||||
}
|
||||
$entityManager->flush();
|
||||
}
|
||||
|
||||
return $insertedEntities;
|
||||
}
|
||||
}
|
||||
11
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/backward-compatibility.php
vendored
Normal file
11
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/backward-compatibility.php
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
if (!class_exists('Doctrine\Common\Persistence\Mapping\ClassMetadata')) {
|
||||
class_alias(\Doctrine\Persistence\Mapping\ClassMetadata::class, 'Doctrine\Common\Persistence\Mapping\ClassMetadata');
|
||||
}
|
||||
|
||||
if (!class_exists('Doctrine\Common\Persistence\ObjectManager')) {
|
||||
class_alias(\Doctrine\Persistence\ObjectManager::class, 'Doctrine\Common\Persistence\ObjectManager');
|
||||
}
|
||||
57
vendor/fakerphp/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php
vendored
Normal file
57
vendor/fakerphp/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Mandango;
|
||||
|
||||
use Faker\Generator;
|
||||
|
||||
class ColumnTypeGuesser
|
||||
{
|
||||
/**
|
||||
* @var Generator
|
||||
*/
|
||||
protected $generator;
|
||||
|
||||
public function __construct(Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Closure|null
|
||||
*/
|
||||
public function guessFormat($field)
|
||||
{
|
||||
$generator = $this->generator;
|
||||
|
||||
switch ($field['type']) {
|
||||
case 'boolean':
|
||||
return static function () use ($generator) {
|
||||
return $generator->boolean;
|
||||
};
|
||||
|
||||
case 'integer':
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 4294967295);
|
||||
};
|
||||
|
||||
case 'float':
|
||||
return static function () use ($generator) {
|
||||
return $generator->randomFloat();
|
||||
};
|
||||
|
||||
case 'string':
|
||||
return static function () use ($generator) {
|
||||
return $generator->text(255);
|
||||
};
|
||||
|
||||
case 'date':
|
||||
return static function () use ($generator) {
|
||||
return $generator->dateTime;
|
||||
};
|
||||
|
||||
default:
|
||||
// no smart way to guess what the user expects here
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
123
vendor/fakerphp/faker/src/Faker/ORM/Mandango/EntityPopulator.php
vendored
Normal file
123
vendor/fakerphp/faker/src/Faker/ORM/Mandango/EntityPopulator.php
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Mandango;
|
||||
|
||||
use Faker\Provider\Base;
|
||||
use Mandango\Mandango;
|
||||
|
||||
/**
|
||||
* Service class for populating a table through a Mandango ActiveRecord class.
|
||||
*/
|
||||
class EntityPopulator
|
||||
{
|
||||
protected $class;
|
||||
protected $columnFormatters = [];
|
||||
|
||||
/**
|
||||
* @param string $class A Mandango ActiveRecord classname
|
||||
*/
|
||||
public function __construct($class)
|
||||
{
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getClass()
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
public function setColumnFormatters($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = $columnFormatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getColumnFormatters()
|
||||
{
|
||||
return $this->columnFormatters;
|
||||
}
|
||||
|
||||
public function mergeColumnFormattersWith($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango)
|
||||
{
|
||||
$formatters = [];
|
||||
$nameGuesser = new \Faker\Guesser\Name($generator);
|
||||
$columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator);
|
||||
|
||||
$metadata = $mandango->getMetadata($this->class);
|
||||
|
||||
// fields
|
||||
foreach ($metadata['fields'] as $fieldName => $field) {
|
||||
if ($formatter = $nameGuesser->guessFormat($fieldName)) {
|
||||
$formatters[$fieldName] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($formatter = $columnTypeGuesser->guessFormat($field)) {
|
||||
$formatters[$fieldName] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// references
|
||||
foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) {
|
||||
if (!isset($reference['class'])) {
|
||||
continue;
|
||||
}
|
||||
$referenceClass = $reference['class'];
|
||||
|
||||
$formatters[$referenceName] = static function ($insertedEntities) use ($referenceClass) {
|
||||
if (isset($insertedEntities[$referenceClass])) {
|
||||
return Base::randomElement($insertedEntities[$referenceClass]);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
}
|
||||
|
||||
return $formatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert one new record using the Entity class.
|
||||
*/
|
||||
public function execute(Mandango $mandango, $insertedEntities)
|
||||
{
|
||||
$metadata = $mandango->getMetadata($this->class);
|
||||
|
||||
$obj = $mandango->create($this->class);
|
||||
|
||||
foreach ($this->columnFormatters as $column => $format) {
|
||||
if (null !== $format) {
|
||||
$value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
|
||||
|
||||
if (isset($metadata['fields'][$column])
|
||||
|| isset($metadata['referencesOne'][$column])) {
|
||||
$obj->set($column, $value);
|
||||
}
|
||||
|
||||
if (isset($metadata['referencesMany'][$column])) {
|
||||
$adder = 'add' . ucfirst($column);
|
||||
$obj->$adder($value);
|
||||
}
|
||||
}
|
||||
}
|
||||
$mandango->persist($obj);
|
||||
|
||||
return $obj;
|
||||
}
|
||||
}
|
||||
63
vendor/fakerphp/faker/src/Faker/ORM/Mandango/Populator.php
vendored
Normal file
63
vendor/fakerphp/faker/src/Faker/ORM/Mandango/Populator.php
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Mandango;
|
||||
|
||||
use Mandango\Mandango;
|
||||
|
||||
/**
|
||||
* Service class for populating a database using Mandango.
|
||||
* A Populator can populate several tables using ActiveRecord classes.
|
||||
*/
|
||||
class Populator
|
||||
{
|
||||
protected $generator;
|
||||
protected $mandango;
|
||||
protected $entities = [];
|
||||
protected $quantities = [];
|
||||
|
||||
public function __construct(\Faker\Generator $generator, Mandango $mandango)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
$this->mandango = $mandango;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an order for the generation of $number records for $entity.
|
||||
*
|
||||
* @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance
|
||||
* @param int $number The number of entities to populate
|
||||
*/
|
||||
public function addEntity($entity, $number, $customColumnFormatters = [])
|
||||
{
|
||||
if (!$entity instanceof \Faker\ORM\Mandango\EntityPopulator) {
|
||||
$entity = new \Faker\ORM\Mandango\EntityPopulator($entity);
|
||||
}
|
||||
$entity->setColumnFormatters($entity->guessColumnFormatters($this->generator, $this->mandango));
|
||||
|
||||
if ($customColumnFormatters) {
|
||||
$entity->mergeColumnFormattersWith($customColumnFormatters);
|
||||
}
|
||||
$class = $entity->getClass();
|
||||
$this->entities[$class] = $entity;
|
||||
$this->quantities[$class] = $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate the database using all the Entity classes previously added.
|
||||
*
|
||||
* @return array A list of the inserted entities.
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
$insertedEntities = [];
|
||||
|
||||
foreach ($this->quantities as $class => $number) {
|
||||
for ($i = 0; $i < $number; ++$i) {
|
||||
$insertedEntities[$class][] = $this->entities[$class]->execute($this->mandango, $insertedEntities);
|
||||
}
|
||||
}
|
||||
$this->mandango->flush();
|
||||
|
||||
return $insertedEntities;
|
||||
}
|
||||
}
|
||||
109
vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php
vendored
Normal file
109
vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php
vendored
Normal file
@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Propel;
|
||||
|
||||
class ColumnTypeGuesser
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(\Faker\Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Closure|null
|
||||
*/
|
||||
public function guessFormat(\ColumnMap $column)
|
||||
{
|
||||
$generator = $this->generator;
|
||||
|
||||
if ($column->isTemporal()) {
|
||||
if ($column->isEpochTemporal()) {
|
||||
return static function () use ($generator) {
|
||||
return $generator->dateTime;
|
||||
};
|
||||
}
|
||||
|
||||
return static function () use ($generator) {
|
||||
return $generator->dateTimeAD;
|
||||
};
|
||||
}
|
||||
$type = $column->getType();
|
||||
|
||||
switch ($type) {
|
||||
case \PropelColumnTypes::BOOLEAN:
|
||||
case \PropelColumnTypes::BOOLEAN_EMU:
|
||||
return static function () use ($generator) {
|
||||
return $generator->boolean;
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::NUMERIC:
|
||||
case \PropelColumnTypes::DECIMAL:
|
||||
$size = $column->getSize();
|
||||
|
||||
return static function () use ($generator, $size) {
|
||||
return $generator->randomNumber($size + 2) / 100;
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::TINYINT:
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 127);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::SMALLINT:
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 32767);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::INTEGER:
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, 2147483647);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::BIGINT:
|
||||
return static function () use ($generator) {
|
||||
return $generator->numberBetween(0, PHP_INT_MAX);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::FLOAT:
|
||||
case \PropelColumnTypes::DOUBLE:
|
||||
case \PropelColumnTypes::REAL:
|
||||
return static function () use ($generator) {
|
||||
return $generator->randomFloat();
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::CHAR:
|
||||
case \PropelColumnTypes::VARCHAR:
|
||||
case \PropelColumnTypes::BINARY:
|
||||
case \PropelColumnTypes::VARBINARY:
|
||||
$size = $column->getSize();
|
||||
|
||||
return static function () use ($generator, $size) {
|
||||
return $generator->text($size);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::LONGVARCHAR:
|
||||
case \PropelColumnTypes::LONGVARBINARY:
|
||||
case \PropelColumnTypes::CLOB:
|
||||
case \PropelColumnTypes::CLOB_EMU:
|
||||
case \PropelColumnTypes::BLOB:
|
||||
return static function () use ($generator) {
|
||||
return $generator->text;
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::ENUM:
|
||||
$valueSet = $column->getValueSet();
|
||||
|
||||
return static function () use ($generator, $valueSet) {
|
||||
return $generator->randomElement($valueSet);
|
||||
};
|
||||
|
||||
case \PropelColumnTypes::OBJECT:
|
||||
case \PropelColumnTypes::PHP_ARRAY:
|
||||
default:
|
||||
// no smart way to guess what the user expects here
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
204
vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php
vendored
Normal file
204
vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php
vendored
Normal file
@ -0,0 +1,204 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\ORM\Propel;
|
||||
|
||||
use Faker\Provider\Base;
|
||||
|
||||
/**
|
||||
* Service class for populating a table through a Propel ActiveRecord class.
|
||||
*/
|
||||
class EntityPopulator
|
||||
{
|
||||
protected $class;
|
||||
protected $columnFormatters = [];
|
||||
protected $modifiers = [];
|
||||
|
||||
/**
|
||||
* @param string $class A Propel ActiveRecord classname
|
||||
*/
|
||||
public function __construct($class)
|
||||
{
|
||||
$this->class = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getClass()
|
||||
{
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
public function setColumnFormatters($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = $columnFormatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getColumnFormatters()
|
||||
{
|
||||
return $this->columnFormatters;
|
||||
}
|
||||
|
||||
public function mergeColumnFormattersWith($columnFormatters)
|
||||
{
|
||||
$this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessColumnFormatters(\Faker\Generator $generator)
|
||||
{
|
||||
$formatters = [];
|
||||
$class = $this->class;
|
||||
$peerClass = $class::PEER;
|
||||
$tableMap = $peerClass::getTableMap();
|
||||
$nameGuesser = new \Faker\Guesser\Name($generator);
|
||||
$columnTypeGuesser = new \Faker\ORM\Propel\ColumnTypeGuesser($generator);
|
||||
|
||||
foreach ($tableMap->getColumns() as $columnMap) {
|
||||
// skip behavior columns, handled by modifiers
|
||||
if ($this->isColumnBehavior($columnMap)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($columnMap->isForeignKey()) {
|
||||
$relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname();
|
||||
$formatters[$columnMap->getPhpName()] = static function ($inserted) use ($relatedClass, $generator) {
|
||||
return isset($inserted[$relatedClass]) ? $generator->randomElement($inserted[$relatedClass]) : null;
|
||||
};
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($columnMap->isPrimaryKey()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) {
|
||||
$formatters[$columnMap->getPhpName()] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) {
|
||||
$formatters[$columnMap->getPhpName()] = $formatter;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return $formatters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function isColumnBehavior(\ColumnMap $columnMap)
|
||||
{
|
||||
foreach ($columnMap->getTable()->getBehaviors() as $name => $params) {
|
||||
$columnName = Base::toLower($columnMap->getName());
|
||||
|
||||
switch ($name) {
|
||||
case 'nested_set':
|
||||
$columnNames = [$params['left_column'], $params['right_column'], $params['level_column']];
|
||||
|
||||
if (in_array($columnName, $columnNames, false)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'timestampable':
|
||||
$columnNames = [$params['create_column'], $params['update_column']];
|
||||
|
||||
if (in_array($columnName, $columnNames, false)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setModifiers($modifiers)
|
||||
{
|
||||
$this->modifiers = $modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getModifiers()
|
||||
{
|
||||
return $this->modifiers;
|
||||
}
|
||||
|
||||
public function mergeModifiersWith($modifiers)
|
||||
{
|
||||
$this->modifiers = array_merge($this->modifiers, $modifiers);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function guessModifiers(\Faker\Generator $generator)
|
||||
{
|
||||
$modifiers = [];
|
||||
$class = $this->class;
|
||||
$peerClass = $class::PEER;
|
||||
$tableMap = $peerClass::getTableMap();
|
||||
|
||||
foreach ($tableMap->getBehaviors() as $name => $params) {
|
||||
switch ($name) {
|
||||
case 'nested_set':
|
||||
$modifiers['nested_set'] = static function ($obj, $inserted) use ($class, $generator): void {
|
||||
if (isset($inserted[$class])) {
|
||||
$queryClass = $class . 'Query';
|
||||
$parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class]));
|
||||
$obj->insertAsLastChildOf($parent);
|
||||
} else {
|
||||
$obj->makeRoot();
|
||||
}
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case 'sortable':
|
||||
$modifiers['sortable'] = static function ($obj, $inserted) use ($class, $generator): void {
|
||||
$obj->insertAtRank($generator->numberBetween(1, count($inserted[$class] ?? []) + 1));
|
||||
};
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert one new record using the Entity class.
|
||||
*/
|
||||
public function execute($con, $insertedEntities)
|
||||
{
|
||||
$obj = new $this->class();
|
||||
|
||||
foreach ($this->getColumnFormatters() as $column => $format) {
|
||||
if (null !== $format) {
|
||||
$obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($this->getModifiers() as $modifier) {
|
||||
$modifier($obj, $insertedEntities);
|
||||
}
|
||||
$obj->save($con);
|
||||
|
||||
return $obj->getPrimaryKey();
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user