Skip to content

Commit

Permalink
Added service description in docs, expose all valuable functions to it
Browse files Browse the repository at this point in the history
  • Loading branch information
wapmorgan committed Aug 8, 2023
1 parent f1be0ad commit 4182da3
Show file tree
Hide file tree
Showing 7 changed files with 272 additions and 62 deletions.
8 changes: 5 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
FROM ghcr.io/roadrunner-server/roadrunner:2023.2.1 AS roadrunner
FROM composer:2.4.4 AS composer
FROM php:8.1-cli-alpine
FROM php:8.2.8-cli-alpine
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=roadrunner /usr/bin/rr /usr/local/bin/rr
RUN apk add unzip && docker-php-ext-install -j$(nproc) sockets
RUN apk add --no-cache linux-headers unzip && docker-php-ext-install -j$(nproc) sockets
WORKDIR /app
COPY . /app
RUN composer install --prefer-dist --optimize-autoloader && composer require --prefer-dist --optimize-autoloader spiral/roadrunner-http nyholm/psr7 nikic/fast-route
ENTRYPOINT rr --WorkDir /app --debug serve
ENTRYPOINT rr --WorkDir /app serve
# Service starts at 8080 port in container
# So make sure use of this port
EXPOSE 8080
ENV NUM_WORKERS 4
ENV NUM_REQUESTS_BEFORE_RESET 0
Expand Down
9 changes: 8 additions & 1 deletion README-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,17 @@ echo '10 '.NounPluralization::pluralize('foot') => '10 feet'
// or you can use shortcut
$n = 1;
echo pluralize($n, 'foot') => '1 foot'
// or API: GET /en/pluralize?count=...&word=...
```

## Numerals

All number creation classes are similar and have one common methods:

- `string generate($number)` - Generates a cardinal numeral for a number.
- `OrdinalNumeralGenerator::generate($number, bool $short= false)` - Generates an ordinal numeral for a number.
- API: `GET /en/ordinal?number=...`
- `CardinalNumeralGenerator::generate($number)` - Generates a cardinal numeral for a number.
- API: `GET /en/cardinal?number=...`

### Cardinal

Expand Down Expand Up @@ -87,4 +91,7 @@ $interval = new DateInterval('P5Y2M');

TimeSpeller::spellInterval($interval) => '5 years 2 months'
TimeSpeller::spellInterval($interval, TimeSpeller::SEPARATE) => '5 years and 2 months'

// or with API: GET /en/time/spellDifference?dateTime=...&options=...&limit=...
// or with API: GET /en/time/spellInterval?interval=...&options=...&limit=...
```
35 changes: 23 additions & 12 deletions README-ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ Internals:

Чтобы просклонять все части имени можно использовать следующую функцию:

- PHP: `string inflectName($fullname, $case, $gender = null)`
- api: `GET /ru/name?fullname=...&case=...&gender=...`
- `string inflectName($fullname, $case, $gender = null)`
- API: `GET /ru/name?fullname=...&case=...&gender=...`

Аргументы:
- `$fullname` - имя в формате `Имя`, `Фамилия Имя` или `Фамилия Имя Отчество`.
Expand All @@ -71,7 +71,7 @@ inflectName('Базанов Иосиф', 'дательный') => 'Базано
inflectName('Иосиф', 'творительный') => 'Иосифом'
```

Чтобы получить сразу все склонения для имени, используйте другую функцию:
Чтобы получить сразу все склонения для имени, используйте другую функцию (либо вызов API без указания `case`):

```php
array getNameCases($fullname, $gender = null)
Expand Down Expand Up @@ -99,17 +99,19 @@ getNameCases('Базанов Иосиф Валерьянович') => array(6) {

Если есть необходимость определить пол по имени, воспользуйтесь функцией:

- PHP: `string|null detectGender($name)`
- api: `GET /ru/detectGender?name=...`
Если удалось определить пол, будет возвращена одна из констант класса `morphos\Gender`, `null` в ином случае.
- `string|null detectGender($name)`
- API: `GET /ru/detectGender?name=...`
Если удалось определить пол, будет возвращена одна из констант класса `morphos\Gender`, `null` в ином случае.

## Географические названия

Вы можете склонять географические названия, такие как названия городов, стран, улиц и так далее. Класс для склонения `GeographicalNamesInflection` имеет похожие методы:

- `boolean isMutable($name)` - проверяет, что имя склоняемо.
- API: `GET /ru/geo/isMutable?name=...`
- `string getCase($name, $case)` - склоняет имя и возвращает результат.`$case` - это одна из констант `morphos\Cases` или `morphos\Russian\Cases`.
- `array getCases($word)` - склоняет имя во всех падежах и возвращает результат в виде массива. В отличие от всех других склоняещих компонентов, `GeographicalNamesInflection` возвращает не 6, а 7 форм слова - с локативным падежом (вторым предложным) - `morphos\Russian\Cases::LOCATIVE`.
- API: `GET /ru/geo/cases?word=...`

Что склоняется:
- Название населённого пункта, страны без приставки: `Москва`, `Россия`, `Франция`.
Expand Down Expand Up @@ -137,8 +139,8 @@ GeographicalNamesInflection::getCases('Саратов') => array(6) {

Для склонения существительных, используемых с количеством предметов/чего-либо предназначена функция `pluralize`:

- PHP: `pluralize($count, $noun, $animateness = false, $case = null)`
- api: `GET /ru/pluralize?count=...&noun=...&animateness=...&case=...`
- `pluralize($count, $noun, $animateness = false, $case = null)`
- API: `GET /ru/pluralize?count=...&noun=...&animateness=...&case=...`

Аргументы:
- `$count` - количество предметов.
Expand All @@ -163,10 +165,11 @@ echo pluralize(10, 'новый и свободный дом', false, morphos\Rus

## Числа

Оба классы по генерации числительных (количественных и порядковых) из чисел имеют два похожих метода:
Оба класса по генерации числительных (количественных и порядковых) из чисел имеют два похожих метода:

- `getCase($number, $case, $gender = Gender::MALE): string` - получить одну форму числительного
- `getCases($number, $gender = Gender::MALE): array` - получить все формы числительного.
- API: `GET /ru/(cardinal|ordinal)/cases?number=...&gender=...`

`$gender` может быть `morphos\Gender::MALE` (или просто `m`) или `morphos\Gender::FEMALE` (или просто `f`) or `morphos\Gender::NEUTER` (средний род; или просто `n`).

Expand Down Expand Up @@ -223,6 +226,9 @@ OrdinalNumeralGenerator::getCases($number) => array(6) {
## Валюты
Вы можете генерировать значения денежных сумм, записанных в виде текста с помощью класса `MoneySpeller`.

- `spell($value, $currency, $format = self::NORMAL_FORMAT, $case = null, $skipFractionalPartIfZero = null)`
- API: `GET /ru/money/spell?value=...&currency=...&format=...&case=...&skipFractionalPartIfZero=...`

_Пример._

```php
Expand Down Expand Up @@ -280,9 +286,10 @@ MoneySpeller::spell(123.45, MoneySpeller::RUBLE, MoneySpeller::NORMAL_FORMAT, '
)` - временной интервал между текущим временем и `$dateTime`. `$dateTime` может быть:
- объектом `DateTime`
- числом секунд с эпохи Unix (unix timestamp)
- строкой с датой & временем (которую может прочитать `strtotime()`)
- `TimeSpeller::spellInterval(DateInterval $dateTime, $options = 0, $limit = 0)` - $dateTime
, задаваемый объектом `DateInterval`
- строкой с датой & временем (которую может прочитать `strtotime()`)
- API: `GET /ru/time/spellDifference?dateTime=...&options=...&limit=...`
- `TimeSpeller::spellInterval(DateInterval $interval, $options = 0, $limit = 0)` - `$dateTime`, задаваемый объектом `DateInterval`
- API: `GET /ru/time/spellInterval?interval=...&options=...&limit=...`

_Пример._

Expand Down Expand Up @@ -325,9 +332,13 @@ TimeSpeller::spellInterval(new DateInterval('P5Y1DT10H2M'), TimeSpeller::SEPARAT
В классе `morphos\Russian\RussianLanguage` есть следующие методы для добавления предлогов или изменения окончаний разных слов:

* `in($word)` - добавляет предлог `в` или `во` в зависимости от того, с каких букв начинается слово.
* API: `GET /ru/prep/in?word=...`
* `with($word)` - добавляет предлог `с` или `со` в зависимости от того, с каких букв начинается слово.
* API: `GET /ru/prep/with?word=...`
* `about($word)` - добавляет предлог `о`, `об` или `обо` в зависимости от того, с каких букв начинается слово.
* API: `GET /ru/prep/about?word=...`
* `verb($verb, $gender)` - изменяет окончание глагола в прошедшем времени в зависимости от рода.
* API: `GET /ru/verb/ending?verb=...&gender=...`

### Предлоги

Expand Down
29 changes: 27 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Morphos
A morphological solution for Russian and English language written completely in PHP.
A morphological solution for Russian and English language written completely in PHP and delivered as a PHP library or
docker image to integrate in non-PHP stack.

[![Latest Stable Version](https://poser.pugx.org/wapmorgan/morphos/v/stable)](https://packagist.org/packages/wapmorgan/morphos)
[![License](https://poser.pugx.org/wapmorgan/morphos/license)](https://packagist.org/packages/wapmorgan/morphos)
Expand Down Expand Up @@ -29,17 +30,41 @@ Tests & Quality: [![Build Status](https://app.travis-ci.com/wapmorgan/Morphos.sv

## Installation

### As PHP library

* Download library through composer:
```
composer require wapmorgan/morphos
```

### Adapters
or install via adapter:

- Adapter for Blade: [wapmorgan/morphos-blade](https://github.com/wapmorgan/Morphos-Blade)
- Adapter for Twig: [wapmorgan/morphos-twig](https://github.com/wapmorgan/Morphos-Twig)
- Adapter for Yii2: [wapmorgan/yii2-inflection](https://github.com/wapmorgan/yii2-inflection)

### As a separate service

A server started in container and listens 8080 port for GET-requests.

Integrate service into your stack (for example, docker compose)
```yaml
services:
morphos:
image: wapmorgan/morphos:3.2.28
ports:
- 8093:8080
```
or standalone container:
```bash
docker run --env NUM_WORKERS=4 --rm --publish 8093:8080 -v wapmorgan/morphos:3.2.28
```

_Tip_: adjust `NUM_WORKERS` env variable if you will send a lot of load to service. By default, it's 4.

There are a **API:** marks in documentation for functions, that exposed as service endpoints. Just pass them the same
arguments as to PHP-functions/methods.

## Quick Start

#### Russian
Expand Down
35 changes: 35 additions & 0 deletions src/Service/English.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace morphos\Service;

use morphos\English\CardinalNumeralGenerator;
use morphos\English\OrdinalNumeralGenerator;
use function morphos\English\pluralize;

class English
{
public function pluralize(array $args)
{
return pluralize($args['count'], $args['word']);
}

public function cardinal(array $args)
{
return \morphos\English\CardinalNumeralGenerator::generate($args['number']);
}

public function ordinal(array $args)
{
return \morphos\English\OrdinalNumeralGenerator::generate($args['number'], $args['short'] ?? false);
}

public function spellTimeDifference(array $args)
{
return \morphos\English\TimeSpeller::spellDifference($args['dateTime'], $args['options'] ?? 0, $args['limit'] ?? 0);
}

public function spellTimeInterval(array $args)
{
return \morphos\English\TimeSpeller::spellInterval(new \DateInterval($args['interval']), $args['options'] ?? 0, $args['limit'] ?? 0);
}
}
126 changes: 126 additions & 0 deletions src/Service/Russian.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?php

namespace morphos\Service;

use morphos\English\CardinalNumeralGenerator;
use morphos\English\OrdinalNumeralGenerator;
use morphos\Russian\MoneySpeller;
use morphos\Russian\RussianLanguage;

class Russian {
public function cases()
{
return \morphos\CasesHelper::getAllCases();
}

public function name(array $args)
{
return \morphos\Russian\inflectName($args['name'], $args['case'] ?? null, $args['gender'] ?? null);
}

public function detectGender(array $args)
{
return \morphos\Russian\detectGender($args['name']);
}

public function pluralize(array $args)
{
return \morphos\Russian\pluralize($args['count'], $args['word'], $args['animateness'] ?? false, $args['case'] ?? null);
}

public function nounDeclensionCases(array $args)
{
return \morphos\Russian\NounDeclension::getCases($args['word'], $args['animateness'] ?? false);
}

public function nounDeclensionDetectGender(array $args)
{
return \morphos\Russian\NounDeclension::detectGender($args['word']);
}

public function nounDeclensionDetect(array $args)
{
return \morphos\Russian\NounDeclension::getDeclension($args['word'], $args['animateness'] ?? false);
}

public function nounDeclensionIsMutable(array $args)
{
return \morphos\Russian\NounDeclension::isMutable($args['word'], $args['animateness'] ?? false);
}

public function nounPluralizationCases(array $args)
{
return \morphos\Russian\NounPluralization::getCases($args['word'], $args['animateness'] ?? false);
}

public function nounPluralizationNumeralForm(array $args)
{
return \morphos\Russian\NounPluralization::getNumeralForm($args['count']);
}

public function cardinalCases(array $args)
{
return \morphos\Russian\CardinalNumeralGenerator::getCases($args['number'], $args['gender'] ?? CardinalNumeralGenerator::MALE);
}

public function ordinalCases(array $args)
{
return \morphos\Russian\OrdinalNumeralGenerator::getCases($args['number'], $args['gender'] ?? OrdinalNumeralGenerator::MALE);
}

public function geoCases(array $args)
{
return \morphos\Russian\GeographicalNamesInflection::getCases($args['name']);
}

public function geoIsMutable(array $args)
{
return \morphos\Russian\GeographicalNamesInflection::isMutable($args['name']);
}

public function spellMoney(array $args)
{
return \morphos\Russian\MoneySpeller::spell(
$args['value'],
$args['currency'],
$args['format'] ?? MoneySpeller::NORMAL_FORMAT,
$args['case'] ?: null,
match ($args['skipFractionalPartIfZero'] ?? null) {
'', null => null,
'true', '1' => true,
'false', '0' => false,
default => $args['skipFractionalPartIfZero']
}
);
}

public function spellTimeDifference(array $args)
{
return \morphos\Russian\TimeSpeller::spellDifference($args['dateTime'], $args['options'] ?? 0, $args['limit'] ?? 0);
}

public function spellTimeInterval(array $args)
{
return \morphos\Russian\TimeSpeller::spellInterval(new \DateInterval($args['interval']), $args['options'] ?? 0, $args['limit'] ?? 0);
}

public function prepIn(array $args)
{
return RussianLanguage::in($args['word']);
}

public function prepWith(array $args)
{
return RussianLanguage::with($args['word']);
}

public function prepAbout(array $args)
{
return RussianLanguage::about($args['word']);
}

public function verbEnding(array $args)
{
return RussianLanguage::verb($args['verb'], $args['gender']);
}
}
Loading

0 comments on commit 4182da3

Please sign in to comment.