Compare commits

...

12 commits

Author SHA1 Message Date
6d7f8cff6a
chore: bump version 2022-01-23 17:27:44 -06:00
Roy Verrips
a84cdd8917 Remove phpstan from dependancies - want to keep this compatible with php 7.0 as per github build steps 2022-01-23 17:26:15 -06:00
Roy Verrips
7cebbfc06a Refactors to satisfy phpstan level 8 2022-01-23 17:26:15 -06:00
Roy Verrips
6e973db521 Add phpstan with config set to max 2022-01-23 17:26:15 -06:00
Roy Verrips
63a52c853b PHP 8.1: Implicit incompatible float to int conversion is deprecated
In PHP 8.1 floats are not implicitly converted to integers as before. 
The array_slice on line 139 requires an integer as the third parameter (the $count variable) so added line 117 to do the conversion of $count.
2022-01-23 17:26:15 -06:00
c9e2957c23 feat: ensure passed tags are strings
Newer versions of PHP raise a warning if you attempt to use array syntax
against non-strings / non-arrays. Added sanity check to ensure we're
working with a string, otherwise skip it.

Also added in PHP 8.1 to the testing suite and bumped the copyright.

Bumped version to 2.0 since as the change in expected output is a
breaking change.
2022-01-04 22:01:25 -06:00
peter279k
ae53465dad Improvements about namespace and PHPUnit version 2020-12-29 16:23:21 -06:00
732be48504 test: update assertion syntax
Tweaked the assertion syntax based on some upcoming changes to PHPUnit.
2020-10-12 18:01:46 -05:00
Umair Khan
007b7a211e Fix #7 Change visibility of $words
The PHPDoc block of `$words` say that the visibility / access of `$words` is private but its `public` in php code.
https://github.com/joshtronic/php-loremipsum/blob/master/src/LoremIpsum.php#L37-L40
2020-10-02 10:50:21 -05:00
f0ec43a045 ci: switch to github actions
Dropped Travis CI and Coveralls for GitHub Actions and CodeCov.
2020-06-01 22:25:24 -05:00
73e356956c
docs: update funding 2020-03-02 20:53:03 -06:00
cdb2e05cf4 chore(ci): test against PHP 7.4
* Updated to test again PHP 7.4 and to use that for coverage reporting.
* Added PHP nightly builds as an allowable failure.
* Added a git ignore as well as a `phpunit` configuration.
* Updated the tests and CI configuration to better handle the juggling of PHP and `phpunit` versions.
* Updated the coveralls dependency to be the latest and greatest instead of the deprecated package.
* Tweaked the README, updated the LICENSE years and bumped this package's version.
* Dropped Patreon link in favor of using Github Sponsors.
2020-01-09 21:49:13 -06:00
13 changed files with 272 additions and 141 deletions

View file

@ -1 +0,0 @@
service_name: travis-ci

29
.github/workflows/test.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Test
on: [push, pull_request]
jobs:
test:
name: Test PHP ${{ matrix.php-version }}
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
- name: PHP Version
run: php --version
- name: Composer Version
run: composer --version
- name: Install Dependencies
run: COMPOSER_MEMORY_LIMIT=-1 composer install
- name: Run Tests
run: vendor/bin/phpunit --coverage-clover ./coverage.xml
- name: Upload Coverage
if: ${{ matrix.php-version == '8.1' }}
uses: codecov/codecov-action@v1
with:
file: ./coverage.xml

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
composer.lock
composer.phar
.phpunit.result.cache
/vendor/

View file

@ -1,40 +0,0 @@
language: php
dist: bionic
sudo: required
matrix:
include:
- php: 5.3
dist: precise
- php: 5.4
dist: trusty
- php: 5.5
dist: trusty
- php: 5.6
dist: trusty
- php: 7.0
dist: xenial
env: PHPUNIT=5.7
- php: 7.1
- php: 7.2
- php: 7.3
install:
- composer install
- if [[ $PHPUNIT == 5.7 ]]; then composer require "phpunit/phpunit:5.7"; fi
before_script:
- mkdir -p build/logs
- cd tests
script:
- |
if [[ $PHPUNIT == 5.7 ]]; then
../vendor/bin/phpunit --colors --coverage-clover ../build/logs/clover.xml .
else
phpunit --colors --coverage-clover ../build/logs/clover.xml .
fi
after_success:
- cd ..
- php vendor/bin/coveralls --config .coveralls.yml -v

1
FUNDING.yml Normal file
View file

@ -0,0 +1 @@
github: joshtronic

View file

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Josh Sherman
Copyright (c) 2014-2022 Josh Sherman
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View file

@ -1,13 +1,13 @@
# php-loremipsum
[![Build Status](https://travis-ci.org/joshtronic/php-loremipsum.svg?branch=master)](https://travis-ci.org/joshtronic/php-loremipsum)
[![Coverage Status](https://coveralls.io/repos/github/joshtronic/php-loremipsum/badge.svg?branch=master)](https://coveralls.io/github/joshtronic/php-loremipsum?branch=master)
[![Total Downloads](https://poser.pugx.org/joshtronic/php-loremipsum/downloads)](https://packagist.org/packages/joshtronic/php-loremipsum)
[![License](https://img.shields.io/packagist/l/joshtronic/php-loremipsum?style=for-the-badge)](https://github.com/joshtronic/php-loremipsum/blob/master/LICENSE)
![PHP Version](https://img.shields.io/packagist/php-v/joshtronic/php-loremipsum?style=for-the-badge)
[![Test Status](https://img.shields.io/github/workflow/status/joshtronic/php-loremipsum/Test?style=for-the-badge)](https://github.com/joshtronic/php-loremipsum/actions)
[![Code Coverage](https://img.shields.io/codecov/c/github/joshtronic/php-loremipsum?style=for-the-badge)](https://codecov.io/gh/joshtronic/php-loremipsum)
[![Monthly Downloads](https://img.shields.io/packagist/dm/joshtronic/php-loremipsum?style=for-the-badge)](https://packagist.org/packages/joshtronic/php-loremipsum)
Lorem ipsum generator in PHP without dependencies. Compatible with PHP 5.3+.
[![Become a Patron](https://joshtronic.com/images/become-patron.png)](https://www.patreon.com/joshtronic)
## Installation
The preferred installation method is via `composer`. First add the following to
@ -105,7 +105,7 @@ Suggestions and bug reports are always welcome, but karma points are earned for
pull requests.
Unit tests are required for all contributions. You can run the test suite from
the `tests` directory simply by running `phpunit .`
the project's root directory simply by running `phpunit`.
## Credits

20
codecov.yml Normal file
View file

@ -0,0 +1,20 @@
codecov:
require_ci_to_pass: yes
coverage:
precision: 2
round: down
range: "70...100"
parsers:
gcov:
branch_detection:
conditional: yes
loop: yes
method: no
macro: no
comment:
layout: "reach,diff,flags,tree"
behavior: default
require_changes: no

View file

@ -1,7 +1,7 @@
{
"name": "joshtronic/php-loremipsum",
"description": "Lorem ipsum generator in PHP without dependencies",
"version": "1.0.4",
"version": "2.1.0",
"type": "library",
"keywords": [
"lorem",
@ -10,22 +10,25 @@
],
"homepage": "https://github.com/joshtronic/php-loremipsum",
"license": "MIT",
"authors": [
{
"authors": [{
"name": "Josh Sherman",
"email": "hello@joshtronic.com",
"homepage": "https://joshtronic.com"
}
],
}],
"require": {
"php": ">=5.3.0"
"php": ">=5.3"
},
"require-dev": {
"satooshi/php-coveralls": "~1.0"
"phpunit/phpunit": "^4.8.36 || ^9.0"
},
"autoload": {
"psr-4": {
"joshtronic\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"joshtronic\\Tests\\": "tests/"
}
}
}

14
phpstan.neon Normal file
View file

@ -0,0 +1,14 @@
parameters:
paths:
- src
# The level 8 is the highest level
level: max
excludePaths:
- ./*/*/FileToBeExcluded.php
checkMissingIterableValueType: true
#editorUrl: 'vscode://file/%%file%%:%%line%%'

24
phpunit.xml Normal file
View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
failOnRisky="true"
stopOnError="true"
stopOnFailure="true"
stopOnIncomplete="true"
verbose="true"
>
<testsuites>
<testsuite name="Lorem Ipsum">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory>./src</directory>
</whitelist>
</filter>
</phpunit>

View file

@ -9,7 +9,7 @@
* Redistribution of these files must retain the above copyright notice.
*
* @author Josh Sherman <hello@joshtronic.com>
* @copyright Copyright 2014, 2015, 2016, 2017, 2018, 2019 Josh Sherman
* @copyright Copyright 2014-2022 Josh Sherman
* @license http://www.opensource.org/licenses/mit-license.html
* @link https://github.com/joshtronic/php-loremipsum
*/
@ -24,7 +24,7 @@ class LoremIpsum
* Whether or not we should be starting the string with "Lorem ipsum..."
*
* @access private
* @var boolean
* @var mixed
*/
private $first = true;
@ -35,9 +35,9 @@ class LoremIpsum
* a complete list exists and if so, where to get it.
*
* @access private
* @var array
* @var array<string>
*/
public $words = array(
private $words = array(
// Lorem ipsum...
'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit',
@ -83,7 +83,7 @@ class LoremIpsum
*/
public function word($tags = false)
{
return $this->words(1, $tags);
return strval($this->words(1, $tags));
}
/**
@ -94,7 +94,7 @@ class LoremIpsum
* @access public
* @param integer $count how many words to generate
* @param mixed $tags string or array of HTML tags to wrap output with
* @return array generated lorem ipsum words
* @return mixed generated lorem ipsum words
*/
public function wordsArray($count = 1, $tags = false)
{
@ -114,6 +114,7 @@ class LoremIpsum
*/
public function words($count = 1, $tags = false, $array = false)
{
$count = (int) $count;
$words = array();
$word_count = 0;
@ -151,7 +152,7 @@ class LoremIpsum
*/
public function sentence($tags = false)
{
return $this->sentences(1, $tags);
return strval($this->sentences(1, $tags));
}
/**
@ -162,7 +163,7 @@ class LoremIpsum
* @access public
* @param integer $count how many sentences to generate
* @param mixed $tags string or array of HTML tags to wrap output with
* @return array generated lorem ipsum sentences
* @return mixed generated lorem ipsum sentences
*/
public function sentencesArray($count = 1, $tags = false)
{
@ -204,7 +205,7 @@ class LoremIpsum
*/
public function paragraph($tags = false)
{
return $this->paragraphs(1, $tags);
return strval($this->paragraphs(1, $tags));
}
/**
@ -215,15 +216,18 @@ class LoremIpsum
* @access public
* @param integer $count how many paragraphs to generate
* @param mixed $tags string or array of HTML tags to wrap output with
* @return array generated lorem ipsum paragraphs
* @return array<string> generated lorem ipsum paragraphs
*/
public function paragraphsArray($count = 1, $tags = false)
{
// The $array parameter set to true means an array is returned.
// Return type is mixed, we should probably cast to array.
// @phpstan-ignore-next-line
return $this->paragraphs($count, $tags, true);
}
/**
* Paragraphss
* Paragraphs
*
* Generates paragraphs of lorem ipsum.
*
@ -238,11 +242,14 @@ class LoremIpsum
$paragraphs = array();
for ($i = 0; $i < $count; $i++) {
$paragraphs[] = $this->sentences($this->gauss(5.8, 1.93));
$paragraphs[] = strval($this->sentences($this->gauss(5.8, 1.93)));
}
if ($array) {
return $this->output($paragraphs, $tags, $array, "\n\n");
}
return strval($this->output($paragraphs, $tags, false, "\n\n"));
}
/**
* Gaussian Distribution
@ -255,7 +262,7 @@ class LoremIpsum
* @access private
* @param double $mean average value
* @param double $std_dev stadnard deviation
* @return double calculated distribution
* @return int calculated distribution
*/
private function gauss($mean, $std_dev)
{
@ -263,7 +270,7 @@ class LoremIpsum
$y = mt_rand() / mt_getrandmax();
$z = sqrt(-2 * log($x)) * cos(2 * pi() * $y);
return $z * $std_dev + $mean;
return intval($z * $std_dev + $mean);
}
/**
@ -273,6 +280,7 @@ class LoremIpsum
* the first time we are generating the text.
*
* @access private
* @return void
*/
private function shuffle()
{
@ -298,18 +306,18 @@ class LoremIpsum
* first word of the sentence.
*
* @access private
* @param array $sentences the sentences we would like to punctuate
* @param array<string> $sentences the sentences we would like to punctuate
* @return void
*/
private function punctuate(&$sentences)
{
foreach ($sentences as $key => $sentence) {
$words = count($sentence);
// Only worry about commas on sentences longer than 4 words
if ($words > 4) {
$mean = log($words, 6);
$std_dev = $mean / 6;
$commas = round($this->gauss($mean, $std_dev));
$commas = $this->gauss($mean, $std_dev);
for ($i = 1; $i <= $commas; $i++) {
$word = round($i * $words / ($commas + 1));
@ -333,7 +341,7 @@ class LoremIpsum
* into a string or not.
*
* @access private
* @param array $strings an array of generated strings
* @param array<string> $strings an array of generated strings
* @param mixed $tags string or array of HTML tags to wrap output with
* @param boolean $array whether an array or a string should be returned
* @param string $delimiter the string to use when calling implode()
@ -351,12 +359,14 @@ class LoremIpsum
foreach ($strings as $key => $string) {
foreach ($tags as $tag) {
if (is_string($tag)) {
// Detects / applies back reference
if ($tag[0] == '<') {
$string = str_replace('$1', $string, $tag);
} else {
$string = sprintf('<%1$s>%2$s</%1$s>', $tag, $string);
}
}
$strings[$key] = $string;
}
@ -370,4 +380,3 @@ class LoremIpsum
return $strings;
}
}

View file

@ -1,130 +1,198 @@
<?php
namespace joshtronic\Tests;
use joshtronic\LoremIpsum;
use PHPUnit\Framework\TestCase;
require_once '../src/LoremIpsum.php';
if (
!class_exists('\PHPUnit_Framework_TestCase')
&& class_exists('\PHPUnit\Framework\TestCase')
) {
class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');
class LoremIpsumTest extends TestCase
{
/**
* @doesNotPerformAssertions
*/
public function testAssertRegExp() {
if (version_compare(PHP_VERSION, '7.3.0', '>=')) {
return 'assertMatchesRegularExpression';
}
class LoremIpsumTest extends PHPUnit_Framework_TestCase
{
private $lipsum;
public function setUp()
{
$this->lipsum = new joshtronic\LoremIpsum();
return 'assertRegExp';
}
public function testWord()
/**
* @depends testAssertRegExp
*/
public function testWord($assertRegExp)
{
$this->assertRegExp('/^[a-z]+$/i', $this->lipsum->word());
$lipsum = new LoremIpsum();
$this->$assertRegExp('/^[a-z]+$/i', $lipsum->word());
}
public function testWords()
/**
* @depends testAssertRegExp
*/
public function testWords($assertRegExp)
{
$this->assertRegExp(
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^[a-z]+ [a-z]+ [a-z]+$/i',
$this->lipsum->words(3)
$lipsum->words(3)
);
}
public function testWordsArray()
/**
* @depends testAssertRegExp
*/
public function testWordsArray($assertRegExp)
{
$words = $this->lipsum->wordsArray(3);
$lipsum = new LoremIpsum();
$words = $lipsum->wordsArray(3);
$this->assertTrue(is_array($words));
$this->assertCount(3, $words);
foreach ($words as $word) {
$this->assertRegExp('/^[a-z]+$/i', $word);
$this->$assertRegExp('/^[a-z]+$/i', $word);
}
}
public function testWordsExceedingVocab()
/**
* @depends testAssertRegExp
*/
public function testWordsExceedingVocab($assertRegExp)
{
$this->assertCount(500, $this->lipsum->wordsArray(500));
$lipsum = new LoremIpsum();
$this->assertCount(500, $lipsum->wordsArray(500));
}
public function testSentence()
/**
* @depends testAssertRegExp
*/
public function testSentence($assertRegExp)
{
$this->assertRegExp('/^[a-z, ]+\.$/i', $this->lipsum->sentence());
$lipsum = new LoremIpsum();
$this->$assertRegExp('/^[a-z, ]+\.$/i', $lipsum->sentence());
}
public function testSentences()
/**
* @depends testAssertRegExp
*/
public function testSentences($assertRegExp)
{
$this->assertRegExp('/^[a-z, ]+\. [a-z, ]+\. [a-z, ]+\.$/i', $this->lipsum->sentences(3));
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^[a-z, ]+\. [a-z, ]+\. [a-z, ]+\.$/i',
$lipsum->sentences(3)
);
}
public function testSentencesArray()
/**
* @depends testAssertRegExp
*/
public function testSentencesArray($assertRegExp)
{
$sentences = $this->lipsum->sentencesArray(3);
$lipsum = new LoremIpsum();
$sentences = $lipsum->sentencesArray(3);
$this->assertTrue(is_array($sentences));
$this->assertCount(3, $sentences);
foreach ($sentences as $sentence) {
$this->assertRegExp('/^[a-z, ]+\.$/i', $sentence);
$this->$assertRegExp('/^[a-z, ]+\.$/i', $sentence);
}
}
public function testParagraph()
/**
* @depends testAssertRegExp
*/
public function testParagraph($assertRegExp)
{
$this->assertRegExp('/^([a-z, ]+\.)+$/i', $this->lipsum->paragraph());
$lipsum = new LoremIpsum();
$this->$assertRegExp('/^([a-z, ]+\.)+$/i', $lipsum->paragraph());
}
public function testParagraphs()
/**
* @depends testAssertRegExp
*/
public function testParagraphs($assertRegExp)
{
$this->assertRegExp(
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^([a-z, ]+\.)+\n\n([a-z, ]+\.)+\n\n([a-z, ]+\.)+$/i',
$this->lipsum->paragraphs(3)
$lipsum->paragraphs(3)
);
}
public function testParagraphsArray()
/**
* @depends testAssertRegExp
*/
public function testParagraphsArray($assertRegExp)
{
$paragraphs = $this->lipsum->paragraphsArray(3);
$lipsum = new LoremIpsum();
$paragraphs = $lipsum->paragraphsArray(3);
$this->assertTrue(is_array($paragraphs));
$this->assertCount(3, $paragraphs);
foreach ($paragraphs as $paragraph) {
$this->assertRegExp('/^([a-z, ]+\.)+$/i', $paragraph);
$this->$assertRegExp('/^([a-z, ]+\.)+$/i', $paragraph);
}
}
public function testMarkupString()
/**
* @depends testAssertRegExp
*/
public function testMarkupString($assertRegExp)
{
$this->assertRegExp(
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^<li>[a-z]+<\/li>$/i',
$this->lipsum->word('li')
$lipsum->word('li')
);
}
public function testMarkupArray()
/**
* @depends testAssertRegExp
*/
public function testMarkupArray($assertRegExp)
{
$this->assertRegExp(
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^<div><p>[a-z]+<\/p><\/div>$/i',
$this->lipsum->word(array('div', 'p'))
$lipsum->word(array('div', 'p'))
);
}
public function testMarkupBackReference()
/**
* @depends testAssertRegExp
*/
public function testMarkupBackReference($assertRegExp)
{
$this->assertRegExp(
$lipsum = new LoremIpsum();
$this->$assertRegExp(
'/^<li><a href="[a-z]+">[a-z]+<\/a><\/li>$/i',
$this->lipsum->word('<li><a href="$1">$1</a></li>')
$lipsum->word('<li><a href="$1">$1</a></li>')
);
}
public function testMarkupArrayReturn()
/**
* @depends testAssertRegExp
*/
public function testMarkupArrayReturn($assertRegExp)
{
$words = $this->lipsum->wordsArray(3, 'li');
$lipsum = new LoremIpsum();
$words = $lipsum->wordsArray(3, 'li');
$this->assertTrue(is_array($words));
$this->assertCount(3, $words);
foreach ($words as $word) {
$this->assertRegExp('/^<li>[a-z]+<\/li>$/i', $word);
}
$this->$assertRegExp('/^<li>[a-z]+<\/li>$/i', $word);
}
}
/**
* @depends testAssertRegExp
*/
public function testSkipNonStringTag($assertRegExp)
{
$lipsum = new LoremIpsum();
$this->$assertRegExp('/^[a-z]+$/i', $lipsum->word(123));
$this->$assertRegExp('/^[a-z]+$/i', $lipsum->word(array(1, 2, 3)));
$this->$assertRegExp('/^[a-z]+$/i', $lipsum->word(true));
}
}