From 1bf9752a74afaae059ff7c1b470828d4deae8893 Mon Sep 17 00:00:00 2001
From: Francois Zaninotto <fzaninotto@gmail.com>
Date: Mon, 24 Oct 2011 00:19:35 +0200
Subject: [PATCH] make BaseProvider methods public, and therefore accessible as
 formatters

---
 readme.md                                  | 12 +++-
 src/Faker/Documentor.php                   |  9 ++-
 src/Faker/ORM/Propel/ColumnTypeGuesser.php |  2 +-
 src/Faker/Provider/Base.php                | 20 ++++---
 src/Faker/Provider/Miscellaneous.php       | 10 ----
 test/Faker/Provider/BaseTest.php           | 69 ++++++++--------------
 6 files changed, 53 insertions(+), 69 deletions(-)

diff --git a/readme.md b/readme.md
index d56d2a0c..dd6c1aaa 100644
--- a/readme.md
+++ b/readme.md
@@ -141,8 +141,16 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle
     md5                     // 'de99a620c50f2990e87144735cd357e7'  
     sha1                    // 'f08e7f04ca1a413807ebc47551a40a20a0b4de5c'  
     sha256                  // '0061e4c60dac5c1d82db0135a42e00c89ae3a333e7c26485321f24348c7e98a5'  
-    number($nbDigits = 3)   // 23
-    choose(array('a', 'b', 'c')) // 'b'
+
+### `Faker\Provider\Base`
+
+    randomDigit             // 7  
+    randomNumber($nbDigits = NULL) // 79907610  
+    randomLetter            // 'b'  
+    randomElement($array = array ('a','b','c')) // 'b'  
+    numerify($string = '###') // '609'  
+    lexify($string = '????') // 'wgts'  
+    bothify($string = '## ??') // '42 jz' 
 
 ## Localization
 
diff --git a/src/Faker/Documentor.php b/src/Faker/Documentor.php
index c1e69ebd..c8f60f19 100644
--- a/src/Faker/Documentor.php
+++ b/src/Faker/Documentor.php
@@ -14,13 +14,18 @@ class Documentor
 	public function getFormatters()
 	{
 		$formatters = array();
-		foreach ($this->generator->getProviders() as $provider) {
+		$providers = $this->generator->getProviders();
+		$providers[]= new \Faker\Provider\Base($this->generator);
+		foreach ($providers as $provider) {
 			$providerClass = get_class($provider);
 			$formatters[$providerClass] = array();
 			$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 ($methodName == '__construct') {
+				if ($reflmethod->isConstructor()) {
 					continue;
 				}
 				$parameters = array();
diff --git a/src/Faker/ORM/Propel/ColumnTypeGuesser.php b/src/Faker/ORM/Propel/ColumnTypeGuesser.php
index 5464a7d2..418b0ca7 100644
--- a/src/Faker/ORM/Propel/ColumnTypeGuesser.php
+++ b/src/Faker/ORM/Propel/ColumnTypeGuesser.php
@@ -31,7 +31,7 @@ class ColumnTypeGuesser
 			case PropelColumnTypes::NUMERIC:
 			case PropelColumnTypes::DECIMAL:
 				$size = $column->getSize();
-				return function() use ($generator, $size) { return $generator->randomNumber($size * 100) / 100; };
+				return function() use ($generator, $size) { return $generator->randomNumber($size + 2) / 100; };
 			case PropelColumnTypes::TINYINT:
 				return function() { return mt_rand(0,255); };
 			case PropelColumnTypes::SMALLINT:
diff --git a/src/Faker/Provider/Base.php b/src/Faker/Provider/Base.php
index c3b1cd0a..b9ca4d04 100644
--- a/src/Faker/Provider/Base.php
+++ b/src/Faker/Provider/Base.php
@@ -16,7 +16,7 @@ class Base
 	 *
 	 * @return integer
 	 */
-	protected static function randomDigit()
+	public static function randomDigit()
 	{
 		return mt_rand(0, 9);
 	}
@@ -25,12 +25,16 @@ class Base
 	 * Returns a random number with 0 to $nbDigits digits
 	 *
 	 * @param integer $nbDigits
+	 * @example 79907610
 	 *
 	 * @return integer
 	 */
-	protected static function randomNumber($nbDigits = 3)
+	public static function randomNumber($nbDigits = null)
 	{
-		return mt_rand(0, $nbDigits * 10);
+		if (null === $nbDigits) {
+			$nbDigits = static::randomDigit();
+		}
+		return mt_rand(0, pow(10, $nbDigits) - 1);
 	}
 	
 	/**
@@ -38,7 +42,7 @@ class Base
 	 *
 	 * @return string
 	 */
-	protected static function randomLetter()
+	public static function randomLetter()
 	{
 		return chr(mt_rand(97, 122));
 	}
@@ -49,7 +53,7 @@ class Base
 	 * @param array $array
 	 * @return mixed
 	 */	
-	protected static function randomElement($array)
+	public static function randomElement($array = array('a', 'b', 'c'))
 	{
 		return $array[mt_rand(0, count($array) - 1)];
 	}
@@ -60,7 +64,7 @@ class Base
 	 * @param string $string String that needs to bet parsed
 	 * @return string
 	 */
-	protected static function numerify($string)
+	public static function numerify($string = '###')
 	{
 		return preg_replace_callback('/\#/', 'static::randomDigit', $string);
 	}
@@ -71,7 +75,7 @@ class Base
 	 * @param string $string String that needs to bet parsed
 	 * @return string
 	 */
-	protected static function lexify($string)
+	public static function lexify($string = '????')
 	{
 		return preg_replace_callback('/\?/', 'static::randomLetter', $string);
 	}
@@ -82,7 +86,7 @@ class Base
 	 * @param string $string String that needs to bet parsed
 	 * @return string
 	 */
-	protected static function bothify($string)
+	public static function bothify($string = '## ??')
 	{
 		return static::lexify(static::numerify($string));
 	}
diff --git a/src/Faker/Provider/Miscellaneous.php b/src/Faker/Provider/Miscellaneous.php
index 5a636e20..79113cbc 100644
--- a/src/Faker/Provider/Miscellaneous.php
+++ b/src/Faker/Provider/Miscellaneous.php
@@ -38,15 +38,5 @@ class Miscellaneous extends \Faker\Provider\Base
 	{
 		return hash('sha256', mt_rand());
 	}
-	
-	public static function number($nbDigits = 3)
-	{
-		return static::randomNumber($nbDigits);
-	}
-
-	public static function choose($list)
-	{
-		return static::randomElement($list);
-	}
 
 }
\ No newline at end of file
diff --git a/test/Faker/Provider/BaseTest.php b/test/Faker/Provider/BaseTest.php
index 839bb7c6..1b91b6ff 100644
--- a/test/Faker/Provider/BaseTest.php
+++ b/test/Faker/Provider/BaseTest.php
@@ -10,94 +10,71 @@ class BaseTest extends \PHPUnit_Framework_TestCase
 {
 	public function testRandomDigitReturnsInteger()
 	{
-		$this->assertTrue(is_integer(TestProvider::randomDigit()));
+		$this->assertTrue(is_integer(BaseProvider::randomDigit()));
 	}
 
 	public function testRandomDigitReturnsDigit()
 	{
-		$this->assertTrue(TestProvider::randomDigit() >= 0);
-		$this->assertTrue(TestProvider::randomDigit() < 10);
+		$this->assertTrue(BaseProvider::randomDigit() >= 0);
+		$this->assertTrue(BaseProvider::randomDigit() < 10);
+	}
+	
+	public function testRandomNumberReturnsInteger()
+	{
+		$this->assertTrue(is_integer(BaseProvider::randomNumber()));
+	}
+
+	public function testRandomNumberReturnsDigit()
+	{
+		$this->assertTrue(BaseProvider::randomNumber(3) >= 0);
+		$this->assertTrue(BaseProvider::randomNumber(3) < 1000);
 	}
 
 	public function testRandomLetterReturnsString()
 	{
-		$this->assertTrue(is_string(TestProvider::randomLetter()));
+		$this->assertTrue(is_string(BaseProvider::randomLetter()));
 	}
 
 	public function testRandomLetterReturnsSingleLetter()
 	{
-		$this->assertEquals(1, strlen(TestProvider::randomLetter()));
+		$this->assertEquals(1, strlen(BaseProvider::randomLetter()));
 	}
 
 	public function testRandomLetterReturnsLowercaseLetter()
 	{
 		$lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
-		$this->assertTrue(strpos($lowercaseLetters, TestProvider::randomLetter()) !== false);
+		$this->assertTrue(strpos($lowercaseLetters, BaseProvider::randomLetter()) !== false);
 	}
 	
 	public function testRandomElementReturnsElementFromArray()
 	{
 		$elements = array('23', 'e', 32, '#');
-		$this->assertContains(TestProvider::randomElement($elements), $elements);
+		$this->assertContains(BaseProvider::randomElement($elements), $elements);
 	}
 
 	public function testNumerifyReturnsSameStringWhenItContainsNoHashSign()
 	{
-		$this->assertEquals('fooBar?', TestProvider::numerify('fooBar?'));
+		$this->assertEquals('fooBar?', BaseProvider::numerify('fooBar?'));
 	}
 
 	public function testNumerifyReturnsStringWithHashSignsReplacedByDigits()
 	{
-		$this->assertRegExp('/foo\dBa\dr/', TestProvider::numerify('foo#Ba#r'));
+		$this->assertRegExp('/foo\dBa\dr/', BaseProvider::numerify('foo#Ba#r'));
 	}
 
 	public function testLexifyReturnsSameStringWhenItContainsNoQuestionMark()
 	{
-		$this->assertEquals('fooBar#', TestProvider::lexify('fooBar#'));
+		$this->assertEquals('fooBar#', BaseProvider::lexify('fooBar#'));
 	}
 
 	public function testNumerifyReturnsStringWithQuestionMarksReplacedByLetters()
 	{
-		$this->assertRegExp('/foo[a-z]Ba[a-z]r/', TestProvider::lexify('foo?Ba?r'));
+		$this->assertRegExp('/foo[a-z]Ba[a-z]r/', BaseProvider::lexify('foo?Ba?r'));
 	}
 	
 	public function testBothifyCombinesNumerifyAndLexify()
 	{
-		$this->assertRegExp('/foo[a-z]Ba\dr/', TestProvider::bothify('foo?Ba#r'));
+		$this->assertRegExp('/foo[a-z]Ba\dr/', BaseProvider::bothify('foo?Ba#r'));
 	}
 	
-}
-
-class TestProvider extends BaseProvider
-{
-	public static function randomDigit()
-	{
-		return parent::randomDigit();
-	}
-	
-	public static function randomLetter()
-	{
-		return parent::randomLetter();
-	}
-
-	public static function randomElement($array)
-	{
-		return parent::randomElement($array);
-	}
-
-	public static function numerify($string)
-	{
-		return parent::numerify($string);
-	}
-	
-	public static function lexify($string)
-	{
-		return parent::lexify($string);
-	}
-	
-	public static function bothify($string)
-	{
-		return parent::bothify($string);
-	}
-
 }
\ No newline at end of file