lk-geimfari / mimesis

Mimesis is a robust data generator for Python that can produce a wide range of fake data in multiple languages.
https://mimesis.name
MIT License
4.44k stars 336 forks source link

Locale not respected for business.currency_iso_code() #663

Closed slackline closed 5 years ago

slackline commented 5 years ago

Bug report

What's wrong

I'm trying to use mimesis to generate mock data for tests I'm going to develop and am writing schema to do so.

I set the locale when instantiating an object of class Field(), but on calling business.currency_iso_code() I get random ISO currency codes, whilst I was expecting (or hoping!) to get those for the current locale.

import random
from mimesis.schema import Field, Schema

class SlotData2():
    def __init__(self, locale, max_currency=10):
        self.field = Field(locale)
        self.max_currency = max_currency

    def _generate_cost(self):
        cost = (
            lambda: {
                'amount': self.field('business.price'),
                'currency': self.field('business.currency_iso_code'),
            }
        )
        cost_schema = Schema(schema=cost)
        return cost_schema.create(random.randint(1, self.max_currency))

The business.price is always the correct locale, but the business.currency_iso_code varies as the following shows...

In [200]: test2 = SlotData2('en-gb', 10)

In [201]: test2._generate_cost()
Out[201]: 
[{'amount': '196.66 £', 'currency': 'BZD'},
 {'amount': '223.12 £', 'currency': 'VUV'}]

In [202]: test2._generate_cost()
Out[202]: 
[{'amount': '626.08 £', 'currency': 'XCD'},
 {'amount': '904.78 £', 'currency': 'BOV'},
 {'amount': '836.96 £', 'currency': 'XUA'},
 {'amount': '529.19 £', 'currency': 'LYD'},
 {'amount': '341.14 £', 'currency': 'ILS'},
 {'amount': '136.68 £', 'currency': 'MGA'},
 {'amount': '691.84 £', 'currency': 'KHR'},
 {'amount': '493.02 £', 'currency': 'SDG'},
 {'amount': '250.04 £', 'currency': 'BGN'},
 {'amount': '649.36 £', 'currency': 'AUD'}]

In [203]: test2._generate_cost()
Out[203]: 
[{'amount': '963.86 £', 'currency': 'MNT'},
 {'amount': '707.13 £', 'currency': 'TRY'},
 {'amount': '322.74 £', 'currency': 'SHP'}]

I checked with Generic('en-gb') and it too returns random ISO currency codes rather than the expected GBP...

In [204]: g = Generic('en-gb')

In [205]: g.business.currency_iso_code()
Out[205]: 'AFN'

In [206]: g.business.currency_iso_code()
Out[206]: 'USD'

In [207]: g.business.currency_iso_code()
Out[207]: 'ALL'

How is that should be

I would expect business.currency_iso_code() to return the code for the specified locale.

System information

python --version
Python 3.6.7
In [209]: mimesis.__version__
Out[209]: '3.1.0'
lk-geimfari commented 5 years ago

@slackline Hi! Thanks for your interest. It seems like at this moment we do not count locale on generating currency iso code.

lk-geimfari commented 5 years ago

@ceccoemi Are you interesting? It's can be done easily, but I'm busy until this weekends.

lk-geimfari commented 5 years ago

@slackline We will work on it ASAP. Thanks again for your report.

slackline commented 5 years ago

Thanks for the rapid response @lk-geimfari. I've started looking at the code to see if I could come up with a solution, if I can work it out before then I'll submit a PR.

lk-geimfari commented 5 years ago

What we need to do:

  1. Add currency code for all locales to file business.json
  2. Return code from json file, not from the list
  3. Add parameter allow_random=True to have availability of support much more currency codes (so as not to limit their number - the number of languages supported.).
sinecode commented 5 years ago

@lk-geimfari @slackline I'm working on this

lk-geimfari commented 5 years ago

@ceccoemi Great! Thank you very much!

slackline commented 5 years ago

Thanks @ceccoemi