Thin assertion library for use in libraries and business-model

Related tags

Miscellaneous assert
Overview

Assert

Build Status Code Coverage GitHub issues

PHP Version Stable Version

Total Downloads Monthly Downloads Daily Downloads

A simple php library which contains assertions and guard methods for input validation (not filtering!) in business-model, libraries and application low-level code. The library can be used to implement pre-/post-conditions on input data.

Idea is to reduce the amount of code for implementing assertions in your model and also simplify the code paths to implement assertions. When assertions fail, an exception is thrown, removing the necessity for if-clauses in your code.

The library is not using Symfony or Zend Validators for a reason: The checks have to be low-level, fast, non-object-oriented code to be used everywhere necessary. Using any of the two libraries requires instantiation of several objects, using a locale component, translations, you name it. Its too much bloat.

Installation

Using Composer:

composer require beberlei/assert

Example usages

<?php
use Assert\Assertion;

function duplicateFile($file, $times)
{
    Assertion::file($file);
    Assertion::digit($times);

    for ($i = 0; $i < $times; $i++) {
        copy($file, $file . $i);
    }
}

Real time usage with Azure Blob Storage:

<?php
public function putBlob($containerName = '', $blobName = '', $localFileName = '', $metadata = array(), $leaseId = null, $additionalHeaders = array())
{
    Assertion::notEmpty($containerName, 'Container name is not specified');
    self::assertValidContainerName($containerName);
    Assertion::notEmpty($blobName, 'Blob name is not specified.');
    Assertion::notEmpty($localFileName, 'Local file name is not specified.');
    Assertion::file($localFileName, 'Local file name is not specified.');
    self::assertValidRootContainerBlobName($containerName, $blobName);

    // Check file size
    if (filesize($localFileName) >= self::MAX_BLOB_SIZE) {
        return $this->putLargeBlob($containerName, $blobName, $localFileName, $metadata, $leaseId, $additionalHeaders);
    }

    // Put the data to Windows Azure Storage
    return $this->putBlobData($containerName, $blobName, file_get_contents($localFileName), $metadata, $leaseId, $additionalHeaders);
}

NullOr helper

A helper method (Assertion::nullOr*) is provided to check if a value is null OR holds for the assertion:

<?php
Assertion::nullOrMax(null, 42); // success
Assertion::nullOrMax(1, 42);    // success
Assertion::nullOrMax(1337, 42); // exception

All helper

The Assertion::all* method checks if all provided values hold for the assertion. It will throw an exception of the assertion does not hold for one of the values:

<?php
Assertion::allIsInstanceOf(array(new \stdClass, new \stdClass), 'stdClass'); // success
Assertion::allIsInstanceOf(array(new \stdClass, new \stdClass), 'PDO');      // exception

Assert::that() Chaining

Using the static API on values is very verbose when checking values against multiple assertions. Starting with 2.6.7 of Assert the Assert class provides a much nicer fluent API for assertions, starting with Assert::that($value) and then receiving the assertions you want to call on the fluent interface. You only have to specify the $value once.

<?php
Assert::that($value)->notEmpty()->integer();
Assert::that($value)->nullOr()->string()->startsWith("Foo");
Assert::that($values)->all()->float();

There are also two shortcut function Assert::thatNullOr() and Assert::thatAll() enabling the "nullOr" or "all" helper respectively.

Lazy Assertions

There are many cases in web development, especially when involving forms, you want to collect several errors instead of aborting directly on the first error. This is what lazy assertions are for. Their API works exactly like the fluent Assert::that() API, but instead of throwing an Exception directly, they collect all errors and only trigger the exception when the method verifyNow() is called on the Assert\SoftAssertion object.

<?php
Assert::lazy()
    ->that(10, 'foo')->string()
    ->that(null, 'bar')->notEmpty()
    ->that('string', 'baz')->isArray()
    ->verifyNow();

The method that($value, $propertyPath) requires a property path (name), so that you know how to differentiate the errors afterwards.

On failure verifyNow() will throw an exception Assert\\LazyAssertionException with a combined message:

The following 3 assertions failed:
1) foo: Value "10" expected to be string, type integer given.
2) bar: Value "<NULL>" is empty, but non empty value was expected.
3) baz: Value "string" is not an array.

You can also retrieve all the AssertionFailedExceptions by calling getErrorExceptions(). This can be useful for example to build a failure response for the user.

For those looking to capture multiple errors on a single value when using a lazy assertion chain, you may follow your call to that with tryAll to run all assertions against the value, and capture all of the resulting failed assertion error messages. Here's an example:

Assert::lazy()
    ->that(10, 'foo')->tryAll()->integer()->between(5, 15)
    ->that(null, 'foo')->tryAll()->notEmpty()->string()
    ->verifyNow();

The above shows how to use this functionality to finely tune the behavior of reporting failures, but to make catching all failures even easier, you may also call tryAll before making any assertions like below. This helps to reduce method calls, and has the same behavior as above.

Assert::lazy()->tryAll()
    ->that(10, 'foo')->integer()->between(5, 15)
    ->that(null, 'foo')->notEmpty()->string()
    ->verifyNow();

Functional Constructors

The following functions exist as aliases to Assert static constructors:

  • Assert\that()
  • Assert\thatAll()
  • Assert\thatNullOr()
  • Assert\lazy()

Using the functional or static constructors is entirely personal preference.

Note: The functional constructors will not work with an Assertion extension. However it is trivial to recreate these functions in a way that point to the extended class.

List of assertions

<?php
use Assert\Assertion;

Assertion::alnum(mixed $value);
Assertion::base64(string $value);
Assertion::between(mixed $value, mixed $lowerLimit, mixed $upperLimit);
Assertion::betweenExclusive(mixed $value, mixed $lowerLimit, mixed $upperLimit);
Assertion::betweenLength(mixed $value, int $minLength, int $maxLength);
Assertion::boolean(mixed $value);
Assertion::choice(mixed $value, array $choices);
Assertion::choicesNotEmpty(array $values, array $choices);
Assertion::classExists(mixed $value);
Assertion::contains(mixed $string, string $needle);
Assertion::count(array|Countable|ResourceBundle|SimpleXMLElement $countable, int $count);
Assertion::date(string $value, string $format);
Assertion::defined(mixed $constant);
Assertion::digit(mixed $value);
Assertion::directory(string $value);
Assertion::e164(string $value);
Assertion::email(mixed $value);
Assertion::endsWith(mixed $string, string $needle);
Assertion::eq(mixed $value, mixed $value2);
Assertion::eqArraySubset(mixed $value, mixed $value2);
Assertion::extensionLoaded(mixed $value);
Assertion::extensionVersion(string $extension, string $operator, mixed $version);
Assertion::false(mixed $value);
Assertion::file(string $value);
Assertion::float(mixed $value);
Assertion::greaterOrEqualThan(mixed $value, mixed $limit);
Assertion::greaterThan(mixed $value, mixed $limit);
Assertion::implementsInterface(mixed $class, string $interfaceName);
Assertion::inArray(mixed $value, array $choices);
Assertion::integer(mixed $value);
Assertion::integerish(mixed $value);
Assertion::interfaceExists(mixed $value);
Assertion::ip(string $value, int $flag = null);
Assertion::ipv4(string $value, int $flag = null);
Assertion::ipv6(string $value, int $flag = null);
Assertion::isArray(mixed $value);
Assertion::isArrayAccessible(mixed $value);
Assertion::isCallable(mixed $value);
Assertion::isCountable(array|Countable|ResourceBundle|SimpleXMLElement $value);
Assertion::isInstanceOf(mixed $value, string $className);
Assertion::isJsonString(mixed $value);
Assertion::isObject(mixed $value);
Assertion::isResource(mixed $value);
Assertion::isTraversable(mixed $value);
Assertion::keyExists(mixed $value, string|int $key);
Assertion::keyIsset(mixed $value, string|int $key);
Assertion::keyNotExists(mixed $value, string|int $key);
Assertion::length(mixed $value, int $length);
Assertion::lessOrEqualThan(mixed $value, mixed $limit);
Assertion::lessThan(mixed $value, mixed $limit);
Assertion::max(mixed $value, mixed $maxValue);
Assertion::maxCount(array|Countable|ResourceBundle|SimpleXMLElement $countable, int $count);
Assertion::maxLength(mixed $value, int $maxLength);
Assertion::methodExists(string $value, mixed $object);
Assertion::min(mixed $value, mixed $minValue);
Assertion::minCount(array|Countable|ResourceBundle|SimpleXMLElement $countable, int $count);
Assertion::minLength(mixed $value, int $minLength);
Assertion::noContent(mixed $value);
Assertion::notBlank(mixed $value);
Assertion::notContains(mixed $string, string $needle);
Assertion::notEmpty(mixed $value);
Assertion::notEmptyKey(mixed $value, string|int $key);
Assertion::notEq(mixed $value1, mixed $value2);
Assertion::notInArray(mixed $value, array $choices);
Assertion::notIsInstanceOf(mixed $value, string $className);
Assertion::notNull(mixed $value);
Assertion::notRegex(mixed $value, string $pattern);
Assertion::notSame(mixed $value1, mixed $value2);
Assertion::null(mixed $value);
Assertion::numeric(mixed $value);
Assertion::objectOrClass(mixed $value);
Assertion::phpVersion(string $operator, mixed $version);
Assertion::propertiesExist(mixed $value, array $properties);
Assertion::propertyExists(mixed $value, string $property);
Assertion::range(mixed $value, mixed $minValue, mixed $maxValue);
Assertion::readable(string $value);
Assertion::regex(mixed $value, string $pattern);
Assertion::same(mixed $value, mixed $value2);
Assertion::satisfy(mixed $value, callable $callback);
Assertion::scalar(mixed $value);
Assertion::startsWith(mixed $string, string $needle);
Assertion::string(mixed $value);
Assertion::subclassOf(mixed $value, string $className);
Assertion::true(mixed $value);
Assertion::uniqueValues(array $values);
Assertion::url(mixed $value);
Assertion::uuid(string $value);
Assertion::version(string $version1, string $operator, string $version2);
Assertion::writeable(string $value);

Remember: When a configuration parameter is necessary, it is always passed AFTER the value. The value is always the first parameter.

Exception & Error Handling

If any of the assertions fails a Assert\AssertionFailedException is thrown. You can pass an argument called $message to any assertion to control the exception message. Every exception contains a default message and unique message code by default.

<?php
use Assert\Assertion;
use Assert\AssertionFailedException;

try {
    Assertion::integer($value, "The pressure of gas is measured in integers.");
} catch(AssertionFailedException $e) {
    // error handling
    $e->getValue(); // the value that caused the failure
    $e->getConstraints(); // the additional constraints of the assertion.
}

Assert\AssertionFailedException is just an interface and the default implementation is Assert\InvalidArgumentException which extends the SPL InvalidArgumentException. You can change the exception being used on a package based level.

Customised exception messages

You can pass a callback as the message parameter, allowing you to construct your own message only if an assertion fails, rather than every time you run the test.

The callback will be supplied with an array of parameters that are for the assertion.

As some assertions call other assertions, your callback will need to example the array to determine what assertion failed.

The array will contain a key called ::assertion that indicates which assertion failed.

The callback should return the string that will be used as the exception message.

Your own Assertion class

To shield your library from possible bugs, misinterpretations or BC breaks inside Assert you should introduce a library/project based assertion subclass, where you can override the exception thrown as well.

In addition, you can override the Assert\Assertion::stringify() method to provide your own interpretations of the types during error handling.

<?php
namespace MyProject;

use Assert\Assertion as BaseAssertion;

class Assertion extends BaseAssertion
{
    protected static $exceptionClass = 'MyProject\AssertionFailedException';
}

As of V2.9.2, Lazy Assertions now have access to any additional assertions present in your own assertion classes.

Contributing

Please see CONTRIBUTING for more details.

Comments
  • Restore factory functions

    Restore factory functions

    The factory functions removed in #184 were helpful in that they provided the same fluent interface with less code. I would like to propose that the following functions be restored as aliases (or perhaps a facade) to the static Assert:: methods:

    use function Assert\that;
    use function Assert\lazy;
    

    I see no reason to have thatAll or thatNullOr be included, since they are just shortcuts to existing functionality.

    opened by shadowhand 18
  • objectOrClass, propertyExists, and propertiesExist

    objectOrClass, propertyExists, and propertiesExist

    • add assertion to ensure parameter is an object or a class that exists.
    • add assertions to validate that an object (or class) has a property, and that an object (or class) has a set of properties.
    opened by abacaphiliac 18
  • Functions file causes collisions if package is used more than once

    Functions file causes collisions if package is used more than once

    The functions.php file is pulled in throught the Composer autoloader file mechanism: https://github.com/beberlei/assert/blob/master/composer.json#L20

    If this package is used more than once in one PHP session (my use case is several WordPress plugins including it), this causes a fatal error:

    Fatal error: Cannot redeclare Assert\that() [...]
    

    I know that Composer should be used at the site level, not multiple times in one site. However, this could easily be fixed to allow for that use case, too, which would at least simplify the development process.

    opened by schlessera 14
  • Custom assertions

    Custom assertions

    Provides a lot of hooks for people who want to be able to add their own assertions but don't want to lose the power of chaining and fluent interfaces. Having to recreate the that*() functions isn't ideal, but if someone is keen enough in their desire for custom assertions then it's a pretty small overhead.

    opened by rhysr 14
  • Add psalm assertions

    Add psalm assertions

    These allow anyone using Psalm (or any other tool that understands its annotations) to understand the effect of beberlei/assert calls in their code.

    Similar to https://github.com/sebastianbergmann/phpunit/pull/3708

    opened by muglug 12
  • 2.9.6: Assertion::url('https://www.domain.ext') throws exception on PHP 7.3.2

    2.9.6: Assertion::url('https://www.domain.ext') throws exception on PHP 7.3.2

    For version beberlei/assert 2.9.6, Assertion::url('http://www.domain.ext'); fails on PHP 7.3.2, while it worked on 7.1.

    Any idea what the cause is of this? Does PHP 7.3.2 interpret the regular expression differently?

    Is that the reason why the regular expression was changed as mentioned here: https://github.com/beberlei/assert/issues/263 and documented here: https://github.com/beberlei/assert/blob/master/CHANGELOG.md#301---2018-07-04

    I suppose this might be due to the upgrade to from PCRE to PCRE2 in PHP 7.3...

    An upgrade to beberlei/assert 3.2.0 resolved this issue.

    Maybe the 2.x versions should require PHP < 7.3. Not sure whether changing that "backwards" is a back practice though 😄

    opened by holtkamp 12
  • Added ability to capture multiple errors on a single value in a chain

    Added ability to capture multiple errors on a single value in a chain

    Using the existing LazyAssertion implementation, I found in cumbersome to capture multiple assertion failure messages pertaining to a single value. With this feature, I hope that this will be alleviated.

    The purpose of the feature is to allow one to capture multiple assertion failures per value by dictating the behavior of the LazyAssertion class via special method call; the method is tryAll. What it will do specifically for this feature is, it will set a flag to keep the assertion chain going even after a failure is detected with a previous assertion.

    This behavior can already be achieved, however it is necessary to call that multiple times, and this leads to multiple AssertionChain objects being created. For the sake of writing cleaner code and using resources more effectively, I felt this would be a worthwhile feature to propose.

    Here is a list of exactly what I have included in this pull request:

    • Added tryAll method to \Assert\LazyAssertion
    • Added appropriate unit tests
    • Updated the documentation
    enhancement 
    opened by alecgunnar 11
  • Assertion::url doesn't respect underscore in domain names

    Assertion::url doesn't respect underscore in domain names

    e.g. http://t_rost.rosfirm.ru/ is valid URL, may be it's not corresponds to some specs but it works replace ([\pL\pN\pS-]+\.)+[\pL]+ # a domain name with ([\pL\pN\pS-_]+\.)+[\pL]+ # a domain name

    opened by dzentota 10
  • LazyAssertion not open for extension

    LazyAssertion not open for extension

    I wanted to extend the LazyAssertion in order to overload the that method. As I need to pass some additional details into the exception created by the assertion lib.

    With all the properties on the LazyAssertion are private this doesn't allow for easy extending.

    Would you be willing to accept a PR which would change the properties on the LazyAssertion from private too protected? (Like the Assert class already has, which can easily be extended)

    enhancement 
    opened by DannyvdSluijs 9
  • @aliasOf annotation error

    @aliasOf annotation error

    @aliaOf annotation in inArray method causing the failing error

    Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation "@aliasOf" in method Assert\Assertion::inArray() was never imported. Did you maybe forget to add a "use" statement for this annotation?

    Removing the annotation seems to work. Should we remove it? Is there another workaround?

    opened by koutsoumposval 8
  • Use static factory methods instead of functions in the Assert namespace

    Use static factory methods instead of functions in the Assert namespace

    The functions in the Assert namespace can not be autoloaded, nor can they be used with alternative exception classes. This pull request resolves these issues by introducing a static factory class (\Assert\Assert) that provides these functions as static methods. This will also solve beberlei/assert#57.

    enhancement 
    opened by tacovandenbroek 8
  • Support to return false when an assertion fails

    Support to return false when an assertion fails

    This is my suggestion to support returning false in case of failure :

     public static function notEmpty($value, $message = null, string $propertyPath = null): bool
     {
            if (empty($value)) {
                $message = \sprintf(
                    static::generateMessage($message ?: 'Value "%s" is empty, but non empty value was expected.'),
                    static::stringify($value)
                );
    
                // throw static::createException($value, $message, static::VALUE_EMPTY, $propertyPath);
                return static::handleFailure($value, $message, static::VALUE_EMPTY, $propertyPath);
            }
    
            return true;
      }
    
     protected static function handleFailure($value, $message, $code, $propertyPath = null, array $constraints = []): bool
     {
            $exceptionClass = static::$exceptionClass;
    
            throw new $exceptionClass($message, $code, $propertyPath, $value, $constraints);
     }
    

    That way anyone can inherit from Assertion class and override handleFailure to return false instead of throwing an exception. This is helpfull in many situations for example for a ternary condition...

    opened by luxferoo 0
  • Add enumExists and enumCase assertions

    Add enumExists and enumCase assertions

    This PR features new assertions for PHP8.1 enums.

    Provides :

    • Assertion::enumExists($value) that checks if $value is a valid enum FQCN
    • Assertion::enumCase($value, $enumClass) that checks if $value is valid backing value for the $enumClass enum
    opened by neghmurken 0
  • API to improve describing property paths

    API to improve describing property paths

    I am using validation in my models and want to be specific about the validation errors. I want to know from which class and property and error came. I am aware that it is possible by setting the 'defaultPropertyPath' to something like 'Address.street', but this will cause a lot of duplication. For each 'that' call you'd have to specify the property.

    What I am looking for is an API which looks more like this:

    Assert::lazy('Address')
                ->that($street, 'street')->notEmpty()
                ->that($number, 'number')->notEmpty()
                ->verifyNow();
    
    Assert::that('Address', 'street')->notEmpty();
    

    For the "root" it might also be a nice idea to add a 'getRootPath' function that can be overriden. So that someone can pass in $this or $something::class and then format it inside this function, for example: reading $this::class and stripping it down to the basename.

    I already have an implementation for this. Of course, to be backwards compatible it would mean that the that function can not be used; so maybe a new function called thatProperty.

    opened by arjanfrans 0
Releases(v3.3.2)
  • v3.3.2(Dec 17, 2021)

    What's Changed

    • PHP 8.1 compatible by @frankvanhest in https://github.com/beberlei/assert/pull/320
    • Improve performance of Assertion Chain class by @scyzoryck in https://github.com/beberlei/assert/pull/318

    New Contributors

    • @frankvanhest made their first contribution in https://github.com/beberlei/assert/pull/320
    • @scyzoryck made their first contribution in https://github.com/beberlei/assert/pull/318

    Full Changelog: https://github.com/beberlei/assert/compare/v3.3.1...v3.3.2

    Source code(tar.gz)
    Source code(zip)
  • v3.3.0-beta1(Nov 13, 2020)

    • #302 PHP 8 support thanks to @ptondereau
    • #304 Migrate from TravisCI to Github Actions
    • #296 Add Assert::uniqueValues thanks to @gronostajo
    Source code(tar.gz)
    Source code(zip)
  • v3.2.7(Dec 19, 2019)

    3.2.7 - 2019-12-19

    Fixes

    • Reinstated the @method return type for Assert\LazyAssertion methods to show that the return type is LazyAssertion.
    Source code(tar.gz)
    Source code(zip)
  • v3.2.6(Oct 10, 2019)

  • v3.2.5(Oct 10, 2019)

    3.2.5 - 2019-10-10 - Fix the broken things release.

    Notice

    • Sigh!
      • Richard Quadling

    Fixes

    • REALLY Removed dependency of the intl extension.
    • Updated the Docblocks for Assert\Assertion::all() helper to show that the value is expected to be an array.
    Source code(tar.gz)
    Source code(zip)
  • v3.2.4(Oct 10, 2019)

    3.2.4 - 2019-10-09 - Fix the broken things release.

    Notice

    • It seems I've been slightly lax in verifying the signature changes and expected extensions. Hopefully, both of these have been fixed in this version. Truly sorry for breaking the internet!
      • Richard Quadling

    Fixes

    • Restored \Assert\Assertion::createException() signature to 3.2.2.
    • Removed dependency of the intl extension. If the extension is available, then Assert\Assertion::count(), Assert\Assertion::isCountable(), Assert\Assertion::minCount(), and Assert\Assertion::maxCount() will operate on ResourceBundles.
    • Fixed the @method return type for Assert\LazyAssertion methods to show that the return type is static for extensions of Assert\LazyAssertion.
      NOTE : Docblock does not have the ability to differentiate between a non static @method whose returns type is of the subclass and a @method that is called statically (PSR-5#899). So the use of static static is a fudge that sort of works for IDEs that need to know about the method that MAY be overridden in a subclass.
    Source code(tar.gz)
    Source code(zip)
  • v3.2.3(Aug 23, 2019)

  • v3.2.2(Aug 23, 2019)

  • v3.2.1(May 28, 2019)

    3.2.1 - 2019-05-28

    Fixes

    Other changes

    • Added PHP 7.3.0, PHP 7.3.1, and PHP 7.3.2 to Travis pipeline as there are differences in PCRE
    • Updated docblocks for Assert\Assertion::NullOrXxxx() to show that the first parameter can be null.
    • Updated docblocks for Assert\LazyAssertion to show that the return type is $this to aid IDE's static analysis.
    Source code(tar.gz)
    Source code(zip)
  • v2.9.9(May 28, 2019)

  • v2.9.8(May 28, 2019)

  • v3.2.0(Dec 24, 2018)

  • v3.1.0(Oct 29, 2018)

  • v3.0.1(Oct 11, 2018)

  • v3.0.0(Jul 4, 2018)

  • v2.9.6(Jun 11, 2018)

  • v2.9.5(Apr 16, 2018)

  • v2.9.4(Apr 9, 2018)

  • v2.9.3(Mar 16, 2018)

  • v2.9.2(Jan 25, 2018)

  • v2.9.1(Jan 25, 2018)

  • v2.8.1(Nov 30, 2017)

    2.8.1 - 2017-11-30

    Fixes

    • Assertion::integerish() has had several issues in the last couple of versions.
      Hopefully these are now fixed. Thanks to Erik Roelofs and Michał Mleczko

    Deprecation notice

    • The functions \Assert\that(), \Assert\thatAll(), \Assert\thatNullOr(), and \Assert\lazy() are no longer marked as deprecated.
      Both the functional and static constructors work together. Whichever you wish to use is a personal preference.
    Source code(tar.gz)
    Source code(zip)
  • v2.7.11(Nov 13, 2017)

  • v2.7.10(Nov 13, 2017)

  • v2.7.9(Nov 13, 2017)

  • v2.7.8(Oct 20, 2017)

  • v2.7.7(Oct 18, 2017)

  • v2.7.6(May 4, 2017)

  • v2.7.5(Apr 26, 2017)

Owner
Benjamin Eberlei
Founder of @tideways, PHP performance monitoring, profiling and exception tracking software. @doctrine core member and occasional @php contributor
Benjamin Eberlei
The main scope of this extension is to help phpstan to detect the type of object after the Assert\Assertion validation.

PHPStan beberlei/assert extension PHPStan beberlei/assert Description The main scope of this extension is to help phpstan to detect the type of object

PHPStan 33 Jan 2, 2023
Empower your business to accept payments globally, earn rewards and invest in crypto with lazerpay laravel sdk in your laravel project.

Lazerpay Laravel Package pipedev/lazerpay is a laravel sdk package that access to laravel api Installation PHP 5.4+ and Composer are required. To get

Muritala David 24 Dec 10, 2022
This library implements a fuzzer for PHP, which can be used to find bugs in libraries

PHP Fuzzer This library implements a fuzzer for PHP, which can be used to find bugs in libraries (particularly parsing libraries) by feeding them "ran

Nikita Popov 341 Dec 25, 2022
GPT-3 powered business idea generator

The idea (lol) is to give you inspiration to make something cool, if you lack inspiration right now. Many ideas might not be perfect but they might give you the spark to start thinking to get to a really good idea further on.

levelsio 17 Feb 9, 2022
Start using Whatsapp Business Cloud API in your app

Use The Most Used Whatsapp's Cloud API Start using Whatsapp Business Cloud API in your app! Support us Investing on this package is defintely a good m

Ricardo Sawir 15 Dec 14, 2022
This project is very diverse and based upon many languages and libraries such as C++, Python, JavaScript, PHP and MQTT

ADMS-Real-time-project This project is very diverse and based upon many languages and libraries such as C++, Python, JavaScript, PHP and MQTT Advance_

Nitya parikh 1 Dec 1, 2021
Foundation 3 Framework for Magento 1.7. Foundation styles and libraries. Magento Responsive theme. Off-canvas Left-Right sidebar columns for mobile.

Magento Foundation 3 Framework Zurb Foundation 3 framework for Magento 1.7. Magento Foundation 3 Version 1.3.0. Demo page: http://magendation.internet

Nando Boronat 62 Apr 1, 2022
Hoa is a modular, extensible and structured set of PHP libraries

Hoa is a modular, extensible and structured set of PHP libraries. Moreover, Hoa aims at being a bridge between industrial and research worlds. Hoa\Ust

Hoa 403 Dec 20, 2022
Android libraries and/or signatures with classification (type, tags, anti-features)

Android Libraries A list of Android libraries and/or trackers along with classification such as type, categories and ant-features. Development Status:

Muntashir Al-Islam 6 Dec 25, 2022
A plugin for working with popular money libraries in Pest

This package is a plugin for Pest PHP. It allows you to write tests against monetary values provided by either brick/money or moneyphp/money using the same declarative syntax you're used to with Pest's expectation syntax.

Luke Downing 19 Oct 30, 2022
Admidio is a free open source user management system for websites of organizations and groups. The system has a flexible role model so that it’s possible to reflect the structure and permissions of your organization.

Admidio Admidio is a free open source user management system for websites of organizations and groups. The system has a flexible role model so that it

Admidio 212 Dec 30, 2022
Auto-expiring tags with additional payload data on any eloquent model.

Laravel TempTag Auto-expiring tags with additional payload data on any eloquent model. Installation first you need to install and configure mongodb in

masoud nazarpoor 2 Sep 18, 2021
Pheature flags toggle model implementation

Pheature Flags Toggle Model implementation Pheature flags toggle model implementation Installation Describe package installation composer require phea

Pheature Flags 5 Dec 12, 2022
Mirror Laravel model inside Firestore collection.

Laravel Firestore Mirror This package can be used to store copy of Laravel model inside Firestore collection. Installation Install package: composer r

Firevel 5 Feb 27, 2022
The package provides an expressive "fluent" way to define model attributes.

The package provides an expressive "fluent" way to define model attributes. It automatically builds casts at the runtime and adds a native autocompletion to the models' properties.

Boris Lepikhin 506 Dec 28, 2022
3D trashcan model with a bunch of features

3D Trashcan plugin with a bunch of features.

broki 5 Jun 20, 2022
SilverStripe Model Annotations Task

A SilverStripe Task to generate data object model annotations for defined db fields. Also for configs from data extensions.

CSoellinger 2 Apr 21, 2022
[READ-ONLY] Properties define model metadata.

Charcoal Property Properties define object's metadata. They provide the building blocks of the Model's definition. Properties are defined globally for

The Charcoal PHP Framework 0 Jun 21, 2022