Git Product home page Git Product logo

laminas-romans's Introduction

laminas-romans

Laminas Project Romans Integration

Build Status Latest Stable Version License

Description

This package provides a Laminas Project integration for Romans library, providing tools to filter a string with a Roman number to int and vice-versa, validate a string that contains this type of number and, finally, hydrate the content to int.

Installation

This package uses Composer as default repository. You can install it adding the name of package in require attribute of composer.json, pointing to the last stable version.

{
    "require": {
        "wandersonwhcr/laminas-romans": "^1.0"
    }
}

Usage

This package provide filters, validators and hydrators to use with Laminas projects. Also, this package is provided as a Laminas module, automatically configuring services inside application, but this action is not required.

Filters

Laminas Romans provides a couple of filters to convert a string with Roman number to int and a Integer to a string that represents the input as Roman number.

use Laminas\Romans\Filter\RomanToInt as RomanToIntFilter;
use Laminas\Romans\Filter\IntToRoman as IntToRomanFilter;

$value = 'MCMXCIX';

$filter = new RomanToIntFilter();
$value  = $filter->filter($value); // 1999

$filter = new IntToRomanFilter();
$value  = $filter->filter($value); // MCMXCIX

Validator

Also, this package include a validator to verify if a string contains a valid Roman number.

use Laminas\Romans\Validator\Roman as RomanValidator;

$validator = new RomanValidator();

$result = $validator->isValid('MCMXCIX'); // true

$result   = $validator->isValid('IAI'); // false
$messages = $validator->getMessages();

/*
$messages = [
    'unknownToken' => 'Unknown token "A" at position 1',
];
*/

$result   = $validator->isValid('XIIIX'); // false
$messages = $validator->getMessages();

/*
$messages = [
    'invalidRoman' => 'Invalid Roman number "XIIX"',
];
 */

Hydrator

There is a hydrator strategy, responsible to handle Roman numbers. Like any other Laminas strategy, exceptions will be throw for errors.

use InvalidArgumentException;
use Laminas\Romans\Hydrator\Strategy\Roman as RomanHydratorStrategy;

$value    = 'MCMXCIX';
$strategy = new RomanHydratorStrategy();

try {
    $value = $strategy->hydrate($value); // 1999
    $value = $strategy->extract($value); // MCMXCIX
} catch (InvalidArgumentException $e) {
    // unable to convert
}

ViewHelper

Finally, there is a view helper to convert int to Roman numbers directly, using an internal filter for this job.

use Laminas\Romans\View\Helper\Roman as RomanViewHelper;

$helper = new RomanViewHelper();

// Simple Access
echo $helper(1999); // MCMXCIX

// ... or Inside ViewRenderer
echo $this->roman(1999); // MCMXCIX

Module

This package is provided as a Laminas module. To initialize this module, add the package namespace into application loaded modules configuration.

<?php
return [
    'modules' => [
        // ...
        'Laminas\Romans',
        // ...
    ],
];

Using this feature you must require Laminas ModuleManager and ServiceManager in your composer.json file.

{
    "require": {
        "laminas/laminas-modulemanager": "2.10.*",
        "laminas/laminas-servicemanager": "3.6.*"
    }
}

Services Available

If you configure this package as a Laminas module, there is a lot of services configured. The list below shows all services available with Laminas\Romans module. Items with double-arrow represents services aliases.

  • Romans\Grammar\Grammar
  • Romans\Lexer\Lexer
  • Romans\Parser\Parser
  • Romans\Filter\IntToRoman
  • Romans\Filter\RomanToInt
  • Laminas\Romans\Hydrator\Strategy\Roman
  • FilterManager
    • Laminas\Romans\Filter\IntToRoman
    • Laminas\Romans\Filter\RomanToInt
    • IntToRoman => Laminas\Romans\Filter\IntToRoman
    • intToRoman => Laminas\Romans\Filter\IntToRoman
    • inttoroman => Laminas\Romans\Filter\IntToRoman
    • RomanToInt => Laminas\Romans\Filter\RomanToInt
    • romanToInt => Laminas\Romans\Filter\RomanToInt
    • romantoint => Laminas\Romans\Filter\RomanToInt
  • ValidatorManager
    • Laminas\Romans\Validator\Roman
    • Roman => Laminas\Romans\Validator\Roman
    • roman => Laminas\Romans\Validator\Roman
  • ViewHelperManager
    • Laminas\Romans\View\Helper\Roman
    • Roman => Laminas\Romans\View\Helper\Roman
    • roman => Laminas\Romans\View\Helper\Roman

Development

You can use Docker Compose to build an image and run a container to develop and test this package.

docker-compose build
docker-compose run romans composer install
docker-compose run romans composer test

License

This package is opensource and available under license MIT described in LICENSE.

laminas-romans's People

Contributors

wandersonwhcr avatar

Watchers

 avatar

laminas-romans's Issues

Update Namespaces Breaks Tests

Currently I am trying to update namespaces from Zend\Romans to Laminas\Romans.

https://github.com/wandersonwhcr/laminas-romans/tree/feature/laminas 7234cda

In this branch I updated every requirement (include developing packages) and everything works like a charm.

But

https://github.com/wandersonwhcr/laminas-romans/tree/feature/laminas-with-errors 82b0dfa

This branch 82b0dfa is 1 commit ahead 7234cda and I only renamed namespaces. When I run composer test we find a problem with filter (service) manager because it can't find RomanToInt service.

php vendor/bin/phpunit --filter testRomanToIntFilter

This command shows the test with problem.

    public function testRomanToIntFilter()
    {
        $manager = $this->buildApplication()->getServiceManager()->get('FilterManager');

        $this->assertService($manager, Filter\RomanToInt::class, ['RomanToInt', 'romanToInt', 'romantoint']);
    }

Debugging our code, I realized that method Laminas\Romans\Module::getFilterConfig was automatically called on commit 7234cda and it wasn't on 82b0dfa, so our services are not initialized.

How can we fix that?

Composer

We must add this package to Packagist as Laminas.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.