Repository: joke2k/faker
Pull request #215 (2015-03-30 06:46:38)

Add localized providers ja_JP
I added ja_JP(Japanese) provider, and tests.


Patch:
diff --git a/faker/providers/address/ja_JP/__init__.py b/faker/providers/address/ja_JP/__init__.py
new file mode 100644
index 00000000..ec12a688
--- /dev/null
+++ b/faker/providers/address/ja_JP/__init__.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from .. import Provider as AddressProvider
+
+
+class Provider(AddressProvider):
+    countries = (
+        'アフガニスタン', 'アルバニア', 'アルジェリア', 'アメリカ領サモア', 'アンドラ', 'アンゴラ', 'アンギラ', '南極大陸', 'アンティグアバーブーダ', 'アルゼンチン', 'アルメニア', 'アルバ', 'オーストラリア', 'オーストリア', 'アゼルバイジャン',
+        'バハマ', 'バーレーン', 'バングラデシュ', 'バルバドス', 'ベラルーシ', 'ベルギー', 'ベリーズ', 'ベナン', 'バミューダ島', 'ブータン', 'ボリビア', 'ボスニア・ヘルツェゴビナ', 'ボツワナ', 'ブーベ島', 'ブラジル', 'イギリス領インド洋地域', 'イギリス領ヴァージン諸島', 'ブルネイ', 'ブルガリア', 'ブルキナファソ', 'ブルンジ',
+        'カンボジア', 'カメルーン', 'カナダ', 'カーボベルデ', 'ケイマン諸島', '中央アフリカ共和国', 'チャド', 'チリ', '中国', 'クリスマス島', 'ココス諸島', 'コロンビア', 'コモロ', 'コンゴ共和国', 'クック諸島', 'コスタリカ', 'コートジボワール', 'クロアチア', 'キューバ', 'キプロス共和国', 'チェコ共和国',
+        'デンマーク', 'ジブチ共和国', 'ドミニカ国', 'ドミニカ共和国',
+        'エクアドル', 'エジプト', 'エルサルバドル', '赤道ギニア共和国', 'エリトリア', 'エストニア', 'エチオピア',
+        'フェロー諸島', 'フォークランド諸島', 'フィジー共和国', 'フィンランド', 'フランス', 'フランス領ギアナ', 'フランス領ポリネシア', 'フランス領極南諸島',
+        'ガボン', 'ガンビア', 'グルジア', 'ドイツ', 'ガーナ', 'ジブラルタル', 'ギリシャ', 'グリーンランド', 'グレナダ', 'グアドループ', 'グアム', 'グアテマラ', 'ガーンジー', 'ギニア', 'ギニアビサウ', 'ガイアナ',
+        'ハイチ', 'ハード島とマクドナルド諸島', 'バチカン市国', 'ホンジュラス', '香港', 'ハンガリー',
+        'アイスランド', 'インド', 'インドネシア', 'イラン', 'イラク', 'アイルランド共和国', 'マン島', 'イスラエル', 'イタリア',
+        'ジャマイカ', '日本', 'ジャージー島', 'ヨルダン',
+        'カザフスタン', 'ケニア', 'キリバス', '朝鮮', '韓国', 'クウェート', 'キルギス共和国',
+        'ラオス人民民主共和国', 'ラトビア', 'レバノン', 'レソト', 'リベリア', 'リビア国', 'リヒテンシュタイン', 'リトアニア', 'ルクセンブルク',
+        'マカオ', 'マケドニア共和国', 'マダガスカル', 'マラウィ', 'マレーシア', 'モルディブ', 'マリ', 'マルタ共和国', 'マーシャル諸島', 'マルティニーク', 'モーリタニア・イスラム共和国', 'モーリシャス', 'マヨット', 'メキシコ', 'ミクロネシア連邦', 'モルドバ共和国', 'モナコ公国', 'モンゴル', 'モンテネグロ共和国', 'モントセラト', 'モロッコ', 'モザンビーク', 'ミャンマー',
+        'ナミビア', 'ナウル', 'ネパール', 'オランダ領アンティル', 'オランダ', 'ニューカレドニア', 'ニュージーランド', 'ニカラグア', 'ニジェール', 'ナイジェリア', 'ニース', 'ノーフォーク島', '北マリアナ諸島', 'ノルウェー',
+        'オマーン',
+        'パキスタン', 'パラオ', 'パレスチナ自治区', 'パナマ', 'パプアニューギニア', 'パラグアイ', 'ペルー', 'フィリピン', 'ピトケアン諸島', 'ポーランド', 'ポルトガル', 'プエルトリコ',
+        'カタール',
+        'レユニオン', 'ルーマニア', 'ロシア', 'ルワンダ',
+        'サン・バルテルミー島', 'セントヘレナ', 'セントクリストファー・ネイビス連邦', 'セントルシア', 'セント・マーチン島', 'サンピエール島・ミクロン島', 'セントビンセント・グレナディーン', 'サモア', 'サンマリノ', 'サントメプリンシペ', 'サウジアラビア', 'セネガル', 'セルビア', 'セイシェル', 'シエラレオネ', 'シンガポール', 'スロバキア', 'スロベニア', 'ソロモン諸島', 'ソマリア', '南アフリカ共和国', 'サウスジョージア・サウスサンドウィッチ諸島', 'スペイン', 'スリランカ', 'スーダン', 'スリナム', 'スヴァールバル諸島およびヤンマイエン島', 'スワジランド王国', 'スウェーデン', 'スイス', 'シリア',
+        '台湾', 'タジキスタン共和国', 'タンザニア', 'タイ', '東ティモール', 'トーゴ', 'トケラウ', 'トンガ', 'トリニダード・トバゴ', 'チュニジア', 'トルコ', 'トルクメニスタン', 'タークス・カイコス諸島', 'ツバル',
+        'ウガンダ', 'ウクライナ', 'アラブ首長国連邦', 'イギリス', 'アメリカ合衆国', '合衆国領有小離島', 'アメリカ領ヴァージン諸島', 'ウルグアイ', 'ウズベキスタン',
+        'バヌアツ', 'ベネズエラ', 'ベトナム',
+'ウォリス・フツナ', '西サハラ',
+        'イエメン',
+        'ザンビア', 'ジンバブエ'
+    )
diff --git a/faker/providers/company/ja_JP/__init__.py b/faker/providers/company/ja_JP/__init__.py
new file mode 100644
index 00000000..c0e2b18b
--- /dev/null
+++ b/faker/providers/company/ja_JP/__init__.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from .. import Provider as CompanyProvider
+
+
+class Provider(CompanyProvider):
+    formats = (
+        '{{company_prefix}} {{last_name}}',
+    )
+
+    company_prefixes = ('株式会社', '有限会社', '合同会社')
+
+    @classmethod
+    def company_prefix(cls):
+        return cls.random_element(cls.company_prefixes)
diff --git a/faker/providers/person/ja_JP/__init__.py b/faker/providers/person/ja_JP/__init__.py
new file mode 100644
index 00000000..0c4946cd
--- /dev/null
+++ b/faker/providers/person/ja_JP/__init__.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from .. import Provider as PersonProvider
+
+
+class Provider(PersonProvider):
+    formats_female = (
+        '{{last_name}} {{first_name_female}}',
+    )
+
+    formats_male = (
+        '{{last_name}} {{first_name_male}}',
+    )
+
+    formats = formats_male + formats_female
+
+    first_names_female = (
+        '明美', 'あすか', '香織', '加奈', 'くみ子', 'さゆり', '知実', '千代',
+        '直子', '七夏', '花子', '春香', '真綾', '舞', '美加子', '幹', '桃子', '結衣', '裕美子', '陽子', '里佳',
+    )
+
+    first_names_male = (
+        '晃', '篤司', '治', '和也', '京助', '健一', '修平', '翔太', '淳', '聡太郎', '太一', '太郎', '拓真', '翼', '智也',
+        '直樹', '直人', '英樹', '浩', '学', '充', '稔', '裕樹', '裕太', '康弘', '陽一', '洋介', '亮介', '涼平', '零',
+    )
+
+    first_names = first_names_male + first_names_female
+
+    last_names = (
+        '青田', '青山', '石田', '井高', '伊藤', '井上', '宇野', '江古田', '大垣',
+        '加藤', '加納', '喜嶋', '木村', '桐山', '工藤', '小泉', '小林', '近藤',
+        '斉藤', '坂本', '佐々木', '佐藤', '笹田', '鈴木', '杉山',
+        '高橋', '田中', '田辺', '津田',
+        '中島', '中村', '渚', '中津川', '西之園', '野村',
+        '原田', '浜田', '廣川', '藤本',
+        '松本', '三宅', '宮沢', '村山',
+        '山岸', '山口', '山田', '山本', '吉田', '吉本',
+        '若松', '渡辺',
+    )
+
+    kana_formats = (
+        '{{last_kana_name}} {{first_kana_name_female}}',
+        '{{last_kana_name}} {{first_kana_name_male}}',
+    )
+
+    first_kana_names_female = (
+        'アキラ', 'アケミ', 'アスカ',
+        'カオリ', 'カナ', 'クミコ',
+        'サユリ',
+        'チヨ', 'ツバサ', 'トモミ',
+        'ナオコ', 'ナナカ',
+        'ハナコ', 'ハルカ',
+        'マアヤ', 'マイ', 'ミキ', 'モモコ',
+        'ユイ', 'ヨウコ', 'ユミコ',
+        'レイ', 'リカ',
+    )
+
+    first_kana_names_male = (
+        'アキラ', 'アツシ', 'オサム',
+        'キョウスケ', 'ケンイチ',
+        'ジュン', 'ソウタロウ',
+        'タイチ', 'タクマ', 'タロウ', 'ツバサ', 'トモヤ',
+        'ナオキ', 'ナオト',
+        'ヒデキ', 'ヒロシ',
+        'マナブ', 'ミツル', 'ミノル', 'ヒロキ',
+        'ユウタ', 'ヤスヒロ', 'ヨウイチ', 'ヨウスケ',
+        'リョウスケ', 'リョウヘイ',
+    )
+
+    first_kana_names = first_kana_names_male + first_kana_names_female
+
+    last_kana_names = (
+        'アオタ', 'アオヤマ', 'イシダ', 'イダカ', 'イトウ', 'ウノ', 'エコダ', 'オオガキ',
+        'カノウ', 'カノウ', 'キジマ', 'キムラ', 'キリヤマ', 'クドウ', 'コイズミ', 'コバヤシ', 'コンドウ',
+        'サイトウ', 'サカモト', 'ササキ', 'サトウ', 'ササダ', 'スズキ', 'スギヤマ',
+        'タカハシ', 'タナカ', 'タナベ', 'ツダ', 'ツチヤ',
+        'ナカジマ', 'ナカムラ', 'ナギサ', 'ナカツガワ', 'ニシノソノ', 'ノムラ',
+        'ハラダ', 'ハマダ', 'ヒロカワ', 'フジモト',
+        'マツモト', 'ミヤケ', 'ミヤザワ', 'ムラヤマ',
+        'ヤマギシ', 'ヤマグチ', 'ヤマダ', 'ヤマモト', 'ヨシダ', 'ヨシモト',
+        'ワカマツ', 'ワタナベ',
+    )
+
+    def kana_name(self):
+        '''
+        @example 'アオタ アキラ'
+        '''
+        pattern = self.random_element(self.kana_formats)
+        return self.generator.parse(pattern)
+
+    @classmethod
+    def first_kana_name(cls):
+        '''
+        @example 'アキラ'
+        '''
+        return cls.random_element(cls.first_kana_names)
+
+    @classmethod
+    def first_kana_name_female(cls):
+        return cls.random_element(cls.first_kana_names_female)
+
+    @classmethod
+    def first_kana_name_male(cls):
+        return cls.random_element(cls.first_kana_names_male)
+
+    @classmethod
+    def last_kana_name(cls):
+        '''
+        @example 'アオタ'
+        '''
+        return cls.random_element(cls.last_kana_names)
diff --git a/faker/providers/phone_number/ja_JP/__init__.py b/faker/providers/phone_number/ja_JP/__init__.py
new file mode 100644
index 00000000..59d10d42
--- /dev/null
+++ b/faker/providers/phone_number/ja_JP/__init__.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from .. import Provider as PhoneNumberProvider
+
+
+class Provider(PhoneNumberProvider):
+    formats = (
+        '070-####-####',
+        '080-####-####',
+        '090-####-####',
+        '##-####-####',
+    )


Test patch:
diff --git a/faker/tests/ja_JP/__init__.py b/faker/tests/ja_JP/__init__.py
new file mode 100644
index 00000000..b63fcb26
--- /dev/null
+++ b/faker/tests/ja_JP/__init__.py
@@ -0,0 +1,96 @@
+# coding=utf-8
+
+from __future__ import unicode_literals
+
+import unittest
+
+from faker import Factory
+from .. import string_types
+
+
+class ja_JP_FactoryTestCase(unittest.TestCase):
+    def setUp(self):
+        self.factory = Factory.create('ja')
+
+    def test_ja_JP_address(self):
+        from faker.providers.address.ja_JP import Provider
+        countries = Provider.countries
+
+        country = self.factory.country()
+        assert country
+        assert isinstance(country, string_types)
+        assert country in countries
+
+    def test_ja_JP_company(self):
+        from faker.providers.company.ja_JP import Provider
+        prefixes = Provider.company_prefixes
+
+        prefix = self.factory.company_prefix()
+        assert prefix
+        assert isinstance(prefix, string_types)
+        assert prefix in prefixes
+
+        company = self.factory.company()
+        assert company
+        assert isinstance(company, string_types)
+        assert any(prefix in company for prefix in prefixes)
+        assert any(company.startswith(prefix) for prefix in prefixes)
+
+    def test_ja_JP_person(self):
+        name = self.factory.name()
+        assert name
+        assert isinstance(name, string_types)
+
+        first_name = self.factory.first_name()
+        assert first_name
+        assert isinstance(first_name, string_types)
+
+        last_name = self.factory.last_name()
+        assert last_name
+        assert isinstance(last_name, string_types)
+
+        kana_name = self.factory.kana_name()
+        assert kana_name
+        assert isinstance(kana_name, string_types)
+
+        first_kana_name = self.factory.first_kana_name()
+        assert first_kana_name
+        assert isinstance(first_kana_name, string_types)
+
+        first_kana_name_male = self.factory.first_kana_name_male()
+        assert first_kana_name_male
+        assert isinstance(first_kana_name_male, string_types)
+
+        first_kana_name_female = self.factory.first_kana_name_female()
+        assert first_kana_name_female
+        assert isinstance(first_kana_name_female, string_types)
+
+        last_kana_name = self.factory.last_kana_name()
+        assert last_kana_name
+        assert isinstance(last_kana_name, string_types)
+
+    def test_ja_JP_phone_number(self):
+        pn = self.factory.phone_number()
+        formats = (
+            '070',
+            '080',
+            '090',
+        )
+
+        assert pn
+        assert isinstance(pn, string_types)
+        first, second, third = pn.split('-')
+        assert first
+        assert first.isdigit()
+        assert second
+        assert second.isdigit()
+        assert third
+        assert third.isdigit()
+        if len(first) == 2:
+            assert len(second) == 4
+            assert len(third) == 4
+        else:
+            assert len(first) == 3
+            assert len(second) == 4
+            assert len(third) == 4
+            assert first in formats