mirror of
https://github.com/askn/faker.git
synced 2023-08-10 21:13:01 +03:00
Compare commits
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c8875e3183 | ||
![]() |
99afcf6407 | ||
![]() |
979e5b2bc4 | ||
![]() |
7f32a1197b | ||
![]() |
e2c95c114d | ||
![]() |
9f8608f7cd | ||
![]() |
c1094112ee | ||
![]() |
3570ade457 | ||
![]() |
0d54d8e729 | ||
![]() |
ea898d7352 | ||
![]() |
bfda3f2fd8 | ||
![]() |
86dcfb72ad | ||
![]() |
352c3905fc | ||
![]() |
12e5de36f1 | ||
![]() |
77ec8b25f3 | ||
![]() |
ffab21cdc5 | ||
![]() |
fa7f556864 | ||
![]() |
112bfd0ba0 | ||
![]() |
56a48c18bd | ||
![]() |
5caaca1080 | ||
![]() |
5b7a1a9e92 | ||
![]() |
83c938838b | ||
![]() |
06ad8f03e5 | ||
![]() |
544bb80025 | ||
![]() |
bd1a8efc6c | ||
![]() |
4d8f2e6f6e | ||
![]() |
0b8c158403 | ||
![]() |
5b53bf19c5 | ||
![]() |
df79923101 | ||
![]() |
da14470383 | ||
![]() |
9243265586 | ||
![]() |
5e4fc757e5 | ||
![]() |
68316d43a1 | ||
![]() |
6e5e8fad11 | ||
![]() |
76edfcec5d | ||
![]() |
c25ae912bf | ||
![]() |
ed11040aa5 | ||
![]() |
4176ac1e5d | ||
![]() |
284782b26a | ||
![]() |
8610498397 | ||
![]() |
7b8db5e83d | ||
![]() |
ad6ea8dfdb | ||
![]() |
2f5358eb0d | ||
![]() |
5fc00a3a6f | ||
![]() |
828efc4d56 | ||
![]() |
ae84c91f94 | ||
![]() |
fb5c4708f7 | ||
![]() |
bc5c00e912 | ||
![]() |
0b5942bf58 | ||
![]() |
ca166af7af | ||
![]() |
ed6663e116 | ||
![]() |
a2b3ede6fa | ||
![]() |
393096792d |
25
.github/workflows/ci.yml
vendored
Normal file
25
.github/workflows/ci.yml
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
name: Tests
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 10 1 * *'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
jobs:
|
||||
build:
|
||||
name: Test
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
container:
|
||||
image: crystallang/crystal:latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- run: crystal --version
|
||||
- run: shards install
|
||||
- run: crystal spec
|
||||
- run: crystal run examples/test.cr
|
||||
- run: crystal run examples/test2.cr
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -2,9 +2,8 @@
|
|||
/libs/
|
||||
/.crystal/
|
||||
/.shards/
|
||||
|
||||
.DS_Store
|
||||
|
||||
# Libraries don't need dependency lock
|
||||
# Dependencies will be locked in application that uses them
|
||||
/shard.lock
|
||||
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
language: crystal
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Aşkın Gedik
|
||||
Copyright (c) 2021 Aşkın Gedik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
105
README.md
105
README.md
|
@ -1,5 +1,7 @@
|
|||
# faker
|
||||
|
||||
[![Build Status](https://travis-ci.org/askn/faker.svg?branch=master)](https://travis-ci.org/askn/faker)
|
||||
|
||||
This shard is a port of [Faker](https://github.com/stympy/faker) gem that generates fake data.
|
||||
|
||||
|
||||
|
@ -21,7 +23,11 @@ require "faker"
|
|||
Faker::Name.name
|
||||
```
|
||||
|
||||
### Faker::Address
|
||||
### Faker.seed
|
||||
|
||||
If you wish to seed the random data, you can call `Faker.seed number` and then all subsequent calls will be deterministic.
|
||||
|
||||
### Faker::Address
|
||||
|
||||
```crystal
|
||||
Faker::Address.city #=> "Imogeneborough"
|
||||
|
@ -53,12 +59,14 @@ Faker::Address.state_abbr #=> "AP"
|
|||
|
||||
Faker::Address.country #=> "French Guiana"
|
||||
|
||||
Faker::Address.country_code #=> "IT"
|
||||
|
||||
Faker::Address.latitude #=> "-58.17256227443719"
|
||||
|
||||
Faker::Address.longitude #=> "-156.65548382095133"
|
||||
```
|
||||
|
||||
### Faker::Business
|
||||
### Faker::Business
|
||||
|
||||
```crystal
|
||||
|
||||
|
@ -71,20 +79,36 @@ Faker::Business.credit_card_type #=> "visa"
|
|||
```
|
||||
|
||||
|
||||
### Faker::Commerce
|
||||
### Faker::Code
|
||||
|
||||
```crystal
|
||||
|
||||
Faker::Code.isbn #=> "640354399-7"
|
||||
|
||||
Faker::Code.imei #=> "531691246033652"
|
||||
|
||||
```
|
||||
|
||||
|
||||
### Faker::Commerce
|
||||
|
||||
```crystal
|
||||
|
||||
Faker::Commerce.color #=> "lavender"
|
||||
|
||||
# Optional arguments max=3, fixed_amount=false
|
||||
Faker::Commerce.department #=> "Grocery, Health & Beauty"
|
||||
Faker::Commerce.department(5) #=> "Grocery, Books, Health & Beauty"
|
||||
Faker::Commerce.department(2, true) #=> "Books & Tools"
|
||||
|
||||
Faker::Commerce.product_name #=> "Practical Granite Shirt"
|
||||
|
||||
Faker::Commerce.price #=> "44.6"
|
||||
|
||||
Faker::Commerce.material #=> "Plastic"
|
||||
```
|
||||
|
||||
### Faker::Company
|
||||
### Faker::Company
|
||||
|
||||
```crystal
|
||||
|
||||
|
@ -97,7 +121,25 @@ Faker::Company.logo #=> "https://pigment.github.com/fake-logos/logos/medium/colo
|
|||
```
|
||||
|
||||
|
||||
### Faker::Internet
|
||||
### Faker::Date
|
||||
|
||||
```crystal
|
||||
|
||||
Faker::Date.birthday.to_s("%Y-%m-%d") #=> "1993-03-09"
|
||||
|
||||
Faker::Date.between("2020-01-01", "2020-08-15").to_s("%Y-%m-%d") #=> "2020-03-29"
|
||||
|
||||
Faker::Date.between_except("2020-01-01", "2020-08-15", "2020-05-10").to_s("%Y-%m-%d") #=> "2020-03-29"
|
||||
|
||||
Faker::Date.forward(days: 30).to_s("%Y-%m-%d") #=> "2022-02-09"
|
||||
|
||||
Faker::Date.backward(days: 30).to_s("%Y-%m-%d") #=> "2021-12-12"
|
||||
|
||||
Faker::Date.in_date_period(year: 2005).to_s("%Y-%m-%d") #=> "2005-02-12"
|
||||
```
|
||||
|
||||
|
||||
### Faker::Internet
|
||||
|
||||
```crystal
|
||||
# Optional argument name=nil
|
||||
|
@ -122,10 +164,16 @@ Faker::Internet.user_name('Nancy') #=> "nancy"
|
|||
|
||||
Faker::Internet.user_name('Nancy Johnson', %w(. _ -)) #=> "johnson-nancy"
|
||||
|
||||
# Optional argument min_length=0
|
||||
Faker::Internet.password #=> "doloremquealiquidrerum"
|
||||
# Optional arguments: min_length=8, max_length=16
|
||||
Faker::Internet.password #=> "vg5msvy1uerg7"
|
||||
|
||||
Faker::Internet.password(8) #=> "consecteturadasperiores"
|
||||
Faker::Internet.password(8) #=> "yfgjik0hgzdqs0"
|
||||
|
||||
Faker::Internet.password(10, 20) #=> "eoc9shwd1hwq4vbgfw"
|
||||
|
||||
Faker::Internet.password(10, 20, true) #=> "3k5qS15aNmG"
|
||||
|
||||
Faker::Internet.password(10, 20, true, true) #=> "*%NkOnJsH4"
|
||||
|
||||
Faker::Internet.domain_name #=> "effertz.info"
|
||||
|
||||
|
@ -153,7 +201,7 @@ Faker::Internet.slug('foo bar', '-') #=> "foo-bar"
|
|||
|
||||
```
|
||||
|
||||
### Faker::Lorem
|
||||
### Faker::Lorem
|
||||
|
||||
```crystal
|
||||
|
||||
|
@ -194,7 +242,7 @@ Faker::Lorem.paragraphs(1, true) #=> ""
|
|||
|
||||
```
|
||||
|
||||
### Faker::Name
|
||||
### Faker::Name
|
||||
|
||||
```crystal
|
||||
Faker::Name.name #=> "Tyshawn Johns Sr."
|
||||
|
@ -211,7 +259,7 @@ Faker::Name.title #=> "Legacy Creative Director"
|
|||
|
||||
```
|
||||
|
||||
### Faker::Number
|
||||
### Faker::Number
|
||||
|
||||
```crystal
|
||||
|
||||
|
@ -223,12 +271,20 @@ Faker::Number.decimal(2) #=> "11.88"
|
|||
|
||||
Faker::Number.decimal(2, 3) #=> "18.843"
|
||||
|
||||
# Required parameter: digits
|
||||
Faker::Number.hexadecimal(3) #=> "e74"
|
||||
|
||||
Faker::Number.between(1, 10) #=> 7
|
||||
|
||||
Faker::Number.positive #=> 235.59238499107653
|
||||
|
||||
Faker::Number.negative #=> -4480.042585669558
|
||||
|
||||
Faker::Number.digit #=> "1"
|
||||
|
||||
```
|
||||
|
||||
### Faker::PhoneNumber
|
||||
### Faker::PhoneNumber
|
||||
|
||||
```crystal
|
||||
|
||||
|
@ -237,6 +293,31 @@ Faker::PhoneNumber.phone_number #=> "397.693.1309"
|
|||
```
|
||||
|
||||
|
||||
### Faker::Hacker
|
||||
---------------------
|
||||
Are you having trouble writing tech-savvy dialogue for your latest screenplay?
|
||||
Worry not! Hollywood-grade technical talk is ready to fill out any form where you need to look smart.
|
||||
|
||||
```crystal
|
||||
# Full Phrase
|
||||
Faker::Hacker.say_something_smart #=> "Try to compress the SQL interface, maybe it will program the back-end hard drive!"
|
||||
|
||||
# Short technical abbreviations
|
||||
Faker::Hacker.abbreviation #=> "RAM"
|
||||
|
||||
# Hacker centric adjectives
|
||||
Faker::Hacker.adjective #=> "open-source"
|
||||
|
||||
# Only the best hacker related nouns
|
||||
Faker::Hacker.noun #=> "bandwidth"
|
||||
|
||||
# Actions that hackers take
|
||||
Faker::Hacker.verb #=> "bypass"
|
||||
|
||||
# Verbs that end in -ing
|
||||
Faker::Hacker.ingverb #=> "synthesizing"
|
||||
```
|
||||
|
||||
### Faker::Team
|
||||
|
||||
```crystal
|
||||
|
|
|
@ -23,9 +23,15 @@ puts Faker::Address.longitude
|
|||
puts "\n### Faker::Commerce\n\n"
|
||||
|
||||
puts Faker::Commerce.color
|
||||
puts Faker::Commerce.unique_color
|
||||
puts Faker::Commerce.department
|
||||
puts Faker::Commerce.unique_department
|
||||
puts Faker::Commerce.unique_department(2)
|
||||
puts Faker::Commerce.unique_department(2, true)
|
||||
puts Faker::Commerce.product_name
|
||||
puts Faker::Commerce.price
|
||||
puts Faker::Commerce.unique_price
|
||||
puts Faker::Commerce.unique_price(0.0..10_000.00)
|
||||
|
||||
puts "\n### Faker::Company\n\n"
|
||||
|
||||
|
@ -38,10 +44,16 @@ puts "\n\t### Faker::Internet\n\n"
|
|||
|
||||
puts Faker::Internet.email
|
||||
puts Faker::Internet.email("Nancy")
|
||||
puts Faker::Internet.unique_email("Nancy")
|
||||
puts Faker::Internet.unique_email("Nancy")
|
||||
puts Faker::Internet.free_email
|
||||
puts Faker::Internet.unique_free_email
|
||||
puts Faker::Internet.free_email("Nancy")
|
||||
puts Faker::Internet.unique_free_email("Nancy")
|
||||
puts Faker::Internet.safe_email
|
||||
puts Faker::Internet.unique_safe_email
|
||||
puts Faker::Internet.safe_email("Nancy")
|
||||
puts Faker::Internet.unique_safe_email("Nancy")
|
||||
|
||||
puts Faker::Internet.user_name
|
||||
puts Faker::Internet.user_name("Nancy")
|
||||
|
@ -88,12 +100,25 @@ puts Faker::Name.prefix
|
|||
puts Faker::Name.suffix
|
||||
puts Faker::Name.title
|
||||
|
||||
puts "\n\t### Faker::Avatar\n\n"
|
||||
|
||||
puts Faker::Avatar.image
|
||||
puts Faker::Avatar.image("borp")
|
||||
puts Faker::Avatar.unique_image("borp")
|
||||
puts Faker::Avatar.unique_image("borp")
|
||||
|
||||
puts "\n\t### Faker::Number\n\n"
|
||||
|
||||
puts Faker::Number.number(10)
|
||||
# puts Faker::Number.unique_number(10)
|
||||
# puts Faker::Number.unique_number(10)
|
||||
# puts Faker::Number.unique_number(10)
|
||||
puts Faker::Number.decimal(2)
|
||||
puts Faker::Number.decimal(2, 3)
|
||||
puts Faker::Number.unique_decimal(2)
|
||||
# puts Faker::Number.unique_decimal(2, 3)
|
||||
puts Faker::Number.digit
|
||||
puts Faker::Number.unique_digit
|
||||
|
||||
puts "\n\t### Faker::PhoneNumber\n\n"
|
||||
|
||||
|
@ -101,6 +126,10 @@ puts Faker::PhoneNumber.phone_number
|
|||
|
||||
puts "\n\t### Faker::Business\n\n"
|
||||
|
||||
p Faker::Business.credit_card_number
|
||||
p Faker::Business.credit_card_expiry_date
|
||||
p Faker::Business.credit_card_type
|
||||
puts Faker::Business.credit_card_number
|
||||
puts Faker::Business.credit_card_expiry_date
|
||||
puts Faker::Business.credit_card_type
|
||||
|
||||
puts Faker::Business.unique_credit_card_number
|
||||
puts Faker::Business.unique_credit_card_expiry_date
|
||||
puts Faker::Business.unique_credit_card_type
|
||||
|
|
213
examples/test2.cr
Normal file
213
examples/test2.cr
Normal file
|
@ -0,0 +1,213 @@
|
|||
require "../src/faker"
|
||||
|
||||
p "### Faker::Address"
|
||||
|
||||
p Faker::Address.city # => "Imogeneborough"
|
||||
|
||||
p Faker::Address.street_name # => "Larkin Fork"
|
||||
|
||||
p Faker::Address.street_address # => "282 Kevin Brook"
|
||||
|
||||
p Faker::Address.secondary_address # => "Apt. 672"
|
||||
|
||||
p Faker::Address.building_number # => "7304"
|
||||
|
||||
p Faker::Address.zip_code # => "58517"
|
||||
|
||||
p Faker::Address.postcode # => "58517"
|
||||
|
||||
p Faker::Address.time_zone # => "Asia/Yakutsk"
|
||||
|
||||
p Faker::Address.street_suffix # => "Street"
|
||||
|
||||
p Faker::Address.city_suffix # => "fort"
|
||||
|
||||
p Faker::Address.city_prefix # => "Lake"
|
||||
|
||||
p Faker::Address.state # => "California"
|
||||
|
||||
p Faker::Address.state_abbr # => "AP"
|
||||
|
||||
p Faker::Address.country # => "French Guiana"
|
||||
|
||||
p Faker::Address.latitude # => "-58.17256227443719"
|
||||
|
||||
p Faker::Address.longitude # => "-156.65548382095133"
|
||||
|
||||
p "### Faker::Business"
|
||||
|
||||
p Faker::Business.credit_card_number # => "1228-1221-1221-1431"
|
||||
|
||||
p Faker::Business.credit_card_expiry_date # => <Time: 2015-11-11>
|
||||
|
||||
p Faker::Business.credit_card_type # => "visa"
|
||||
|
||||
p "### Faker::Commerce"
|
||||
|
||||
p Faker::Commerce.color # => "lavender"
|
||||
|
||||
p Faker::Commerce.department # => "Grocery, Health & Beauty"
|
||||
p Faker::Commerce.product_name # => "Practical Granite Shirt"
|
||||
|
||||
p Faker::Commerce.price # => "44.6"
|
||||
|
||||
p "### Faker::Company"
|
||||
|
||||
p Faker::Company.name # => "Hirthe-Ritchie"
|
||||
|
||||
p Faker::Company.suffix # => "Group"
|
||||
|
||||
p Faker::Company.logo # => "https://pigment.github.com/fake-logos/logos/medium/color/5.png"
|
||||
|
||||
p "### Faker::Internet"
|
||||
|
||||
# Optional argument name=nil
|
||||
p Faker::Internet.email # => "eliza@mann.net"
|
||||
|
||||
p Faker::Internet.email("Nancy") # => "nancy@terry.biz"
|
||||
|
||||
# Optional argument name=nil
|
||||
p Faker::Internet.free_email # => "freddy@gmail.com"
|
||||
|
||||
p Faker::Internet.free_email("Nancy") # => "nancy@yahoo.com"
|
||||
|
||||
# Optional argument name=nil
|
||||
p Faker::Internet.safe_email # => "christelle@example.org"
|
||||
|
||||
p Faker::Internet.safe_email("Nancy") # => "nancy@example.net"
|
||||
|
||||
# Optional arguments specifier=nil, separators=%w(. _)
|
||||
p Faker::Internet.user_name # => "alexie"
|
||||
|
||||
p Faker::Internet.user_name("Nancy") # => "nancy"
|
||||
|
||||
p Faker::Internet.user_name("Nancy Johnson", %w(. _ -)) # => "johnson-nancy"
|
||||
|
||||
# Optional argument min_length=0
|
||||
p Faker::Internet.password # => "doloremquealiquidrerum"
|
||||
|
||||
p Faker::Internet.password(8) # => "consecteturadasperiores"
|
||||
|
||||
p Faker::Internet.domain_name # => "effertz.info"
|
||||
|
||||
p Faker::Internet.domain_word # => "haleyziemann"
|
||||
|
||||
p Faker::Internet.domain_suffix # => "info"
|
||||
|
||||
p Faker::Internet.ip_v4_address # => "24.29.18.175"
|
||||
|
||||
p Faker::Internet.ip_v6_address # => "ac5f:d696:3807:1d72:2eb5:4e81:7d2b:e1df"
|
||||
|
||||
# Optional argument prefix=""
|
||||
p Faker::Internet.mac_address # => "e6:0d:00:11:ed:4f"
|
||||
p Faker::Internet.mac_address("55:44:33") # => "55:44:33:02:1d:9b"
|
||||
|
||||
# Optional arguments: host=domain_name, path="/#{user_name}"
|
||||
p Faker::Internet.url # => "http://thiel.com/chauncey_simonis"
|
||||
p Faker::Internet.url("example.com") # => "http://example.com/clotilde.swift"
|
||||
p Faker::Internet.url("example.com", "/foobar.html") # => "http://example.com/foobar.html"
|
||||
|
||||
# Optional arguments: words=nil, glue=nil
|
||||
p Faker::Internet.slug # => "pariatur_laudantium"
|
||||
p Faker::Internet.slug("foo bar") # => "foo.bar"
|
||||
p Faker::Internet.slug("foo bar", "-") # => "foo-bar"
|
||||
|
||||
p "### Faker::Lorem"
|
||||
|
||||
p Faker::Lorem.word # => "repellendus"
|
||||
|
||||
# Optional arguments: num=3, supplemental=false
|
||||
p Faker::Lorem.words # => ["dolores", "adipisci", "nesciunt"]
|
||||
p Faker::Lorem.words(4) # => ["culpa", "recusandae", "aut", "omnis"]
|
||||
p Faker::Lorem.words(4, true) # => ["colloco", "qui", "vergo", "deporto"]
|
||||
|
||||
# Optional arguments: char_count=255
|
||||
p Faker::Lorem.characters # => "uw1ep04lhs0c4d931n1jmrspprf5wrj85fefue0y7y6m56b6omquh7br7dhqijwlawejpl765nb1716idmp3xnfo85v349pzy2o9rir23y2qhflwr71c1585fnynguiphkjm8p0vktwitcsm16lny7jzp9t4drwav3qmhz4yjq4k04x14gl6p148hulyqioo72tf8nwrxxcclfypz2lc58lsibgfe5w5p0xv95peafjjmm2frkhdc6duoky0aha"
|
||||
p Faker::Lorem.characters(10) # => "ang9cbhoa8"
|
||||
|
||||
# Optional arguments: word_count=4, supplemental=false, random_words_to_add=6
|
||||
p Faker::Lorem.sentence # => "Dolore illum animi et neque accusantium."
|
||||
p Faker::Lorem.sentence(3) # => "Commodi qui minus deserunt sed vero quia."
|
||||
p Faker::Lorem.sentence(3, true) # => "Inflammatio denego necessitatibus caelestis autus illum."
|
||||
p Faker::Lorem.sentence(3, false, 4) # => "Aut voluptatem illum fugit ut sit."
|
||||
p Faker::Lorem.sentence(3, true, 4) # => "Accusantium tantillus dolorem timor."
|
||||
|
||||
# Optional arguments: sentence_count=3, supplemental=false
|
||||
p Faker::Lorem.sentences # => ["Vero earum commodi soluta.", "Quaerat fuga cumque et vero eveniet omnis ut.", "Cumque sit dolor ut est consequuntur."]
|
||||
p Faker::Lorem.sentences(1) # => ["Ut perspiciatis explicabo possimus doloribus enim quia."]
|
||||
p Faker::Lorem.sentences(1, true) # => ["Quis capillus curo ager veritatis voro et ipsum."]
|
||||
|
||||
# Optional arguments: sentence_count=3, supplemental=false, random_sentences_to_add=3
|
||||
p Faker::Lorem.paragraph # => "Neque dicta enim quasi. Qui corrupti est quisquam. Facere animi quod aut. Qui nulla consequuntur consectetur sapiente."
|
||||
p Faker::Lorem.paragraph(2) # => "Illo qui voluptas. Id sit quaerat enim aut cupiditate voluptates dolorum. Porro necessitatibus numquam dolor quia earum."
|
||||
p Faker::Lorem.paragraph(2, true) # => ""
|
||||
p Faker::Lorem.paragraph(2, false, 4) # => "Neque aut et nemo aut incidunt voluptates. Dolore cum est sint est. Vitae assumenda porro odio dolores fugiat. Est voluptatum quia rerum."
|
||||
p Faker::Lorem.paragraph(2, true, 4) # => "Vomito unde uxor annus. Et patior utilis sursum."
|
||||
|
||||
# Optional arguments: paragraph_count=3, supplemental=false
|
||||
p Faker::Lorem.paragraphs # => ""
|
||||
p Faker::Lorem.paragraphs(1) # => ""
|
||||
p Faker::Lorem.paragraphs(1, true) # => ""
|
||||
|
||||
p "### Faker::Name"
|
||||
|
||||
p Faker::Name.name # => "Tyshawn Johns Sr."
|
||||
|
||||
p Faker::Name.first_name # => "Kaci"
|
||||
|
||||
p Faker::Name.last_name # => "Ernser"
|
||||
|
||||
p Faker::Name.prefix # => "Mr."
|
||||
|
||||
p Faker::Name.suffix # => "IV"
|
||||
|
||||
p Faker::Name.title # => "Legacy Creative Director"
|
||||
|
||||
p "### Faker::Number"
|
||||
|
||||
# Required parameter: digits
|
||||
p Faker::Number.number(10) # => "1968353479"
|
||||
|
||||
# Required parameter: l_digits
|
||||
p Faker::Number.decimal(2) # => "11.88"
|
||||
|
||||
p Faker::Number.decimal(2, 3) # => "18.843"
|
||||
|
||||
p Faker::Number.digit # => "1"
|
||||
|
||||
p "### Faker::PhoneNumber"
|
||||
|
||||
p Faker::PhoneNumber.phone_number # => "397.693.1309"
|
||||
|
||||
p "### Faker::Team"
|
||||
|
||||
# Random Team Creature
|
||||
p Faker::Team.creature # => "gooses"
|
||||
|
||||
# Random Team Name created from random US State (Faker::Address.state) prepended to a random Team Creature
|
||||
p Faker::Team.name # => "Oregon vixens"
|
||||
|
||||
# Random Team State
|
||||
p Faker::Team.state # => "Oregon"
|
||||
|
||||
# ---
|
||||
# Required parameter: digits
|
||||
p Faker::Number.number(10) # => "1968353479"
|
||||
|
||||
# Required parameter: l_digits
|
||||
p Faker::Number.decimal(2) # => "11.88"
|
||||
|
||||
p Faker::Number.decimal(2, 3) # => "18.843"
|
||||
|
||||
# Required parameter: digits
|
||||
p Faker::Number.hexadecimal(3) # => "e74"
|
||||
|
||||
p Faker::Number.between(1, 10) # => 7
|
||||
|
||||
p Faker::Number.positive # => 235.59238499107653
|
||||
|
||||
p Faker::Number.negative # => -4480.042585669558
|
||||
|
||||
p Faker::Number.digit # => "1"
|
||||
|
||||
p Faker::Address.country_code # => "IT"
|
|
@ -1,7 +1,9 @@
|
|||
name: faker
|
||||
version: 0.1.0
|
||||
version: 0.8.0
|
||||
|
||||
authors:
|
||||
- Aşkın Gedik <askn@bil.omu.edu.tr>
|
||||
|
||||
license: MIT
|
||||
|
||||
crystal: "~> 1.0, >= 1.0.0"
|
||||
|
|
35
spec/address_spec.cr
Normal file
35
spec/address_spec.cr
Normal file
|
@ -0,0 +1,35 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Address do
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Address.city.should eq "Kemmerland"
|
||||
Faker::Address.street_name.should eq "Boyer Views"
|
||||
Faker::Address.street_address.should eq "82059 Batz Passage"
|
||||
Faker::Address.secondary_address.should eq "Apt. 856"
|
||||
Faker::Address.building_number.should eq "22820"
|
||||
Faker::Address.zip_code.should eq "89366"
|
||||
Faker::Address.postcode.should eq "JA95 9QF"
|
||||
Faker::Address.time_zone.should eq "Pacific/Honolulu"
|
||||
Faker::Address.street_suffix.should eq "Loop"
|
||||
Faker::Address.city_suffix.should eq "mouth"
|
||||
Faker::Address.city_prefix.should eq "Lake"
|
||||
Faker::Address.state.should eq "Montana"
|
||||
Faker::Address.state_abbr.should eq "VA"
|
||||
Faker::Address.country.should eq "Swaziland"
|
||||
Faker::Address.country_code.should eq "MK"
|
||||
Faker::Address.latitude.should eq "-23.850993082533705"
|
||||
Faker::Address.longitude.should eq "-4.488135572134695"
|
||||
end
|
||||
|
||||
it "should generate unique result" do
|
||||
Faker.seed 123456
|
||||
vals = Array(String).new
|
||||
|
||||
10_000.times do |t|
|
||||
vals << Faker::Address.unique_city
|
||||
end
|
||||
|
||||
vals.size.should eq vals.uniq.size
|
||||
end
|
||||
end
|
10
spec/business_spec.cr
Normal file
10
spec/business_spec.cr
Normal file
|
@ -0,0 +1,10 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Business do
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Business.credit_card_number.should eq "1228-1221-1221-1431"
|
||||
Faker::Business.credit_card_expiry_date.should eq Time.local(2013, 9, 12)
|
||||
Faker::Business.credit_card_type.should eq "mastercard"
|
||||
end
|
||||
end
|
22
spec/code_spec.cr
Normal file
22
spec/code_spec.cr
Normal file
|
@ -0,0 +1,22 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Code do
|
||||
it "base 10 isbn" do
|
||||
Faker::Code.isbn.match(/^\d{9}-[\d|X]$/).should_not eq nil
|
||||
end
|
||||
|
||||
it "base 13 isbn" do
|
||||
Faker::Code.isbn(13).match(/^\d{12}-\d$/).should_not eq nil
|
||||
end
|
||||
|
||||
it "imei" do
|
||||
Faker::Code.imei.match(/\A[\d.:\-\s]+\z/i).should_not eq nil
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Code.isbn.should eq "394314441-0"
|
||||
Faker::Code.isbn(13).should eq "205982563728-9"
|
||||
Faker::Code.imei.should eq "860839366575918"
|
||||
end
|
||||
end
|
66
spec/commerce_spec.cr
Normal file
66
spec/commerce_spec.cr
Normal file
|
@ -0,0 +1,66 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Commerce do
|
||||
it "color" do
|
||||
Faker::Commerce.color.match(/[a-z]+\.?/).should_not eq nil
|
||||
end
|
||||
|
||||
it "department" do
|
||||
Faker::Commerce.department.match(/[A-Z][a-z]+\.?/).should_not eq nil
|
||||
end
|
||||
|
||||
it "single_department_should_not_contain_separators" do
|
||||
Faker::Commerce.department(1).match(/\A[A-Za-z]+\z/).should_not eq nil
|
||||
end
|
||||
|
||||
it "department_should_have_ampersand_as_default_separator" do
|
||||
Faker::Commerce.department(2, true).scan(" & ").should_not eq nil
|
||||
end
|
||||
|
||||
it "department_should_have_exact_number_of_categories_when_fixed_amount" do
|
||||
Faker::Commerce.department(10, true).match(/\A([A-Za-z]+, ){8}[A-Za-z]+ & [A-Za-z]+\z/).should_not eq nil
|
||||
end
|
||||
|
||||
it "department_should_never_exceed_the_max_number_of_categories_when_random_amount" do
|
||||
100.times do
|
||||
Faker::Commerce.department(6).match(/\A([A-Za-z]+(, | & )){0,5}[A-Za-z]+\z/).should_not eq nil
|
||||
end
|
||||
end
|
||||
|
||||
it "department_should_have_no_duplicate_categories" do
|
||||
department = Faker::Commerce.department(10, true)
|
||||
|
||||
departments = department.split(/[,& ]+/)
|
||||
departments.should eq departments.uniq
|
||||
end
|
||||
|
||||
it "product_name" do
|
||||
Faker::Commerce.product_name.match(/[A-Z][a-z]+\.?/).should_not eq nil
|
||||
end
|
||||
|
||||
it "material" do
|
||||
Faker::Commerce.material.match(/[A-Z][a-z]+\.?/).should_not eq nil
|
||||
end
|
||||
|
||||
it "price" do
|
||||
(0 <= Faker::Commerce.price <= 100).should be_true
|
||||
(5 <= Faker::Commerce.price(5..6) <= 6).should be_true
|
||||
(990 <= Faker::Commerce.price(990...1000) <= 1000).should be_true
|
||||
Faker::Commerce.price(5..6).is_a?(Float).should be_true
|
||||
end
|
||||
|
||||
it "price_is_float" do
|
||||
Faker::Commerce.price.is_a?(Float).should be_true
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Commerce.color.should eq "fuchsia"
|
||||
Faker::Commerce.department.should eq "Garden & Tools"
|
||||
Faker::Commerce.department(5).should eq "Kids, Health, Tools & Music"
|
||||
Faker::Commerce.department(2, true).should eq "Garden & Industrial"
|
||||
Faker::Commerce.product_name.should eq "Durable Aluminum Bag"
|
||||
Faker::Commerce.price.should eq 62.86
|
||||
Faker::Commerce.material.should eq "Leather"
|
||||
end
|
||||
end
|
|
@ -5,4 +5,11 @@ describe Faker::Company do
|
|||
it "logo" do
|
||||
Faker::Company.logo.match(%r{https://pigment.github.io/fake-logos/logos/medium/color/\d+\.png}).should_not eq nil
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Company.name.should eq "Kemmer-Gleichner"
|
||||
Faker::Company.suffix.should eq "Inc"
|
||||
Faker::Company.logo.should eq "https://pigment.github.io/fake-logos/logos/medium/color/10.png"
|
||||
end
|
||||
end
|
||||
|
|
106
spec/date_spec.cr
Normal file
106
spec/date_spec.cr
Normal file
|
@ -0,0 +1,106 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Date do
|
||||
describe "#between" do
|
||||
it "should return between date" do
|
||||
from = Time.parse("2019-01-01", "%Y-%m-%d", Time::Location::UTC)
|
||||
to = Time.parse("2022-01-01", "%Y-%m-%d", Time::Location::UTC)
|
||||
|
||||
100.times do
|
||||
random_date = Faker::Date.between(from: from, to: to)
|
||||
random_date.should be >= from
|
||||
random_date.should be <= to
|
||||
end
|
||||
end
|
||||
|
||||
it "should raise and exception on invalid date" do
|
||||
from = "2019-01-01"
|
||||
to = "0000-00-00"
|
||||
|
||||
expect_raises(ArgumentError, "Invalid time") do
|
||||
Faker::Date.between(from: from, to: to)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#between_except" do
|
||||
it "should return between date except gvien one" do
|
||||
from = "2012-01-01"
|
||||
to = "2012-01-05"
|
||||
excepted = "2012-01-03"
|
||||
|
||||
100.times do
|
||||
random_date = Faker::Date.between_except(from: from, to: to, excepted: excepted)
|
||||
random_date.should_not be_nil
|
||||
random_date.should_not eq(Time.parse(excepted, "%Y-%m-%d", Time::Location::UTC))
|
||||
end
|
||||
end
|
||||
|
||||
it "should raise an excpetion when all args are the same" do
|
||||
from = "2012-01-01"
|
||||
to = "2012-01-01"
|
||||
excepted = "2012-01-01"
|
||||
|
||||
expect_raises(ArgumentError, "From date, to date and excepted date must not be the same") do
|
||||
Faker::Date.between_except(from: from, to: to, excepted: excepted)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#birthday" do
|
||||
it "should return a birthday" do
|
||||
min = 40
|
||||
max = 90
|
||||
|
||||
t = Time.utc
|
||||
birthday_min = Time.utc(t.year - max, t.month, t.day)
|
||||
birthday_max = Time.utc(t.year - min, t.month, t.day)
|
||||
|
||||
100.times do
|
||||
birthday = Faker::Date.birthday(min_age: min, max_age: max)
|
||||
|
||||
birthday.should be >= birthday_min
|
||||
birthday.should be <= birthday_max
|
||||
end
|
||||
end
|
||||
|
||||
it "should return today when min_age and max_age are the same" do
|
||||
min = 0
|
||||
max = 0
|
||||
|
||||
t = Time.utc
|
||||
birthday = Faker::Date.birthday(min_age: min, max_age: max)
|
||||
|
||||
birthday.should eq Time.utc(t.year, t.month, t.day)
|
||||
end
|
||||
end
|
||||
|
||||
it "should return a forward date" do
|
||||
today = Time.utc
|
||||
|
||||
100.times do
|
||||
random_date = Faker::Date.forward(days: 5)
|
||||
random_date.should be > today
|
||||
end
|
||||
end
|
||||
|
||||
it "should return a backward date" do
|
||||
today = Time.utc
|
||||
|
||||
100.times do
|
||||
random_date = Faker::Date.backward(days: 5)
|
||||
random_date.should be < today
|
||||
end
|
||||
end
|
||||
|
||||
describe "#date_in_period" do
|
||||
it "should work with default params" do
|
||||
current_year = Time.utc.year
|
||||
|
||||
10.times do
|
||||
date = Faker::Date.in_date_period
|
||||
date.year.should eq(current_year)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
42
spec/hacker_spec.cr
Normal file
42
spec/hacker_spec.cr
Normal file
|
@ -0,0 +1,42 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Hacker do
|
||||
it { (Faker::Hacker.phrases.size == 8).should be_true }
|
||||
|
||||
it "phrases" do
|
||||
Faker::Hacker.phrases.each do |phrase|
|
||||
phrase.nil?.should be_false
|
||||
(phrase == "").should be_false
|
||||
end
|
||||
end
|
||||
|
||||
it "noun" do
|
||||
Faker::Hacker.noun.match(/\w+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "abbreviation" do
|
||||
Faker::Hacker.abbreviation.match(/\w+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "adjective" do
|
||||
Faker::Hacker.adjective.match(/\w+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "verb" do
|
||||
Faker::Hacker.verb.match(/\w+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "ingverb" do
|
||||
Faker::Hacker.ingverb.match(/\w+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Hacker.say_something_smart.should eq "backing up the transmitter won't do anything, we need to bypass the optical RSS firewall!"
|
||||
Faker::Hacker.abbreviation.should eq "USB"
|
||||
Faker::Hacker.adjective.should eq "virtual"
|
||||
Faker::Hacker.noun.should eq "port"
|
||||
Faker::Hacker.verb.should eq "transmit"
|
||||
Faker::Hacker.ingverb.should eq "calculating"
|
||||
end
|
||||
end
|
|
@ -23,7 +23,7 @@ describe Faker::Internet do
|
|||
|
||||
it "user_name_with_integer_arg" do
|
||||
(1..32).to_a.each do |min_length|
|
||||
assert { Faker::Internet.user_name(min_length).size >= min_length }
|
||||
(Faker::Internet.user_name(min_length).size >= min_length).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -31,8 +31,8 @@ describe Faker::Internet do
|
|||
(1..32).to_a.each do |min_length|
|
||||
(min_length..32).each do |max_length|
|
||||
l = Faker::Internet.user_name((min_length..max_length)).size
|
||||
assert { l >= min_length }
|
||||
assert { l <= max_length }
|
||||
(l >= min_length).should be_true
|
||||
(l <= max_length).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -41,8 +41,8 @@ describe Faker::Internet do
|
|||
(1..32).to_a.each do |min_length|
|
||||
(min_length + 1..33).each do |max_length|
|
||||
l = Faker::Internet.user_name((min_length...max_length)).size
|
||||
assert { l >= min_length }
|
||||
assert { l <= max_length - 1 }
|
||||
(l >= min_length).should be_true
|
||||
(l <= max_length - 1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -51,8 +51,8 @@ describe Faker::Internet do
|
|||
(1..32).to_a.each do |min_length|
|
||||
(min_length + 1..33).each do |max_length|
|
||||
u = Faker::Internet.user_name((min_length...max_length), %w(=))
|
||||
assert { u.size.between? min_length, max_length - 1 }
|
||||
assert { u.match(/\A[a-z]+((=)?[a-z]*)*\z/) }
|
||||
(min_length <= u.size <= max_length - 1).should be_true
|
||||
u.match(/\A[a-z]+((=)?[a-z]*)*\z/).should_not eq nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -62,32 +62,32 @@ describe Faker::Internet do
|
|||
end
|
||||
|
||||
it "password_with_integer_arg" do
|
||||
# (1..32).to_a.each do |min_length|
|
||||
# assert { Faker::Internet.password(min_length).size >= min_length }
|
||||
# end
|
||||
(1..32).to_a.each do |min_length|
|
||||
(Faker::Internet.password(min_length).size >= min_length).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "password_max_with_integer_arg" do
|
||||
# (1..32).to_a.each do |min_length|
|
||||
# max_length = min_length + 4
|
||||
# assert { Faker::Internet.password(min_length, max_length).size <= max_length }
|
||||
# end
|
||||
(1..32).to_a.each do |min_length|
|
||||
max_length = min_length + 4
|
||||
(Faker::Internet.password(min_length, max_length).size <= max_length).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "password_with_mixed_case" do
|
||||
assert { Faker::Internet.password.match(/[A-Z]+/) }
|
||||
Faker::Internet.password.match(/[A-Z]+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "password_without_mixed_case" do
|
||||
# Faker::Internet.password(8, 12, false).match(/[^A-Z]+/).should_not eq nil
|
||||
Faker::Internet.password(8, 12, false).match(/[^A-Z]+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "password_with_special_chars" do
|
||||
# Faker::Internet.password(8, 12, true, true).match(/[!@#\$%\^&\*]+/).should_not eq nil
|
||||
Faker::Internet.password(8, 12, true, true).match(/[!@#\$%\^&\*]+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "password_without_special_chars" do
|
||||
# Faker::Internet.password(8, 12, true).match(/[^!@#\$%\^&\*]+/).should_not eq nil
|
||||
Faker::Internet.password(8, 12, true).match(/[^!@#\$%\^&\*]+/).should_not eq nil
|
||||
end
|
||||
|
||||
it "domain_name" do
|
||||
|
@ -106,7 +106,7 @@ describe Faker::Internet do
|
|||
Faker::Internet.ip_v4_address.count('.').should eq 3
|
||||
|
||||
100.times do
|
||||
assert { Faker::Internet.ip_v4_address.split(".").map { |octet| octet.to_i }.max <= 255 }
|
||||
(Faker::Internet.ip_v4_address.split(".").map { |octet| octet.to_i }.max <= 255).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -119,11 +119,11 @@ describe Faker::Internet do
|
|||
|
||||
1000.times do
|
||||
# address = Faker::Internet.public_ip_v4_address
|
||||
# assert_not_match ten_dot, address
|
||||
# assert_not_match one_two_seven, address
|
||||
# assert_not_match one_six_nine, address
|
||||
# assert_not_match one_nine_two, address
|
||||
# assert_not_match one_seven_two, address
|
||||
# it_not_match ten_dot, address
|
||||
# it_not_match one_two_seven, address
|
||||
# it_not_match one_six_nine, address
|
||||
# it_not_match one_nine_two, address
|
||||
# it_not_match one_seven_two, address
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -132,18 +132,18 @@ describe Faker::Internet do
|
|||
Faker::Internet.mac_address("").count(":").should eq 5
|
||||
|
||||
100.times do
|
||||
assert { Faker::Internet.mac_address.split(":").map { |d| d.to_i(16) }.max <= 255 }
|
||||
(Faker::Internet.mac_address.split(":").map { |d| d.to_i(16) }.max <= 255).should be_true
|
||||
end
|
||||
|
||||
assert { Faker::Internet.mac_address("fa:fa:fa").starts_with?("fa:fa:fa") }
|
||||
assert { Faker::Internet.mac_address("01:02").starts_with?("01:02") }
|
||||
(Faker::Internet.mac_address("fa:fa:fa").starts_with?("fa:fa:fa")).should be_true
|
||||
(Faker::Internet.mac_address("01:02").starts_with?("01:02")).should be_true
|
||||
end
|
||||
|
||||
it "ip_v6_address" do
|
||||
Faker::Internet.ip_v6_address.count(":").should eq 7
|
||||
|
||||
100.times do
|
||||
# assert { Faker::Internet.ip_v6_address.split(".").map { |h| "0x#{h}".to_i }.max <= 65535 }
|
||||
# it { Faker::Internet.ip_v6_address.split(".").map { |h| "0x#{h}".to_i }.max <= 65535 }
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -166,4 +166,35 @@ describe Faker::Internet do
|
|||
it "device_token" do
|
||||
# Faker::Internet.device_token.size.should eq 64
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Internet.email.should eq "danyka.gleichner@fay.net"
|
||||
Faker::Internet.email("Nancy").should eq "nancy@barrows.name"
|
||||
Faker::Internet.free_email.should eq "dayne_brown@hotmail.com"
|
||||
Faker::Internet.free_email("Nancy").should eq "nancy@yahoo.com"
|
||||
Faker::Internet.safe_email.should eq "cassie@example.net"
|
||||
Faker::Internet.safe_email("Nancy").should eq "nancy@example.org"
|
||||
Faker::Internet.user_name.should eq "eve_batz"
|
||||
Faker::Internet.user_name("Nancy").should eq "nancy"
|
||||
Faker::Internet.user_name("Nancy Johnson", [".", "_", "-"] of ::String).should eq "nancy-johnson"
|
||||
Faker::Internet.password.should eq "P2AtB7Vm"
|
||||
Faker::Internet.password(8).should eq "XzKdXc0qG"
|
||||
Faker::Internet.password(10, 20).should eq "Vj9gVt6lDlQ"
|
||||
Faker::Internet.password(10, 20, true).should eq "7c2s0zXmQlT"
|
||||
Faker::Internet.password(10, 20, true, true).should eq "@6IpGuR8PvG"
|
||||
Faker::Internet.domain_name.should eq "beatty.io"
|
||||
Faker::Internet.domain_word.should eq "veum"
|
||||
Faker::Internet.domain_suffix.should eq "io"
|
||||
Faker::Internet.ip_v4_address.should eq "230.101.43.38"
|
||||
Faker::Internet.ip_v6_address.should eq "a970:ba8b:26b8:f682:cc5a:cb38:94d3:7911"
|
||||
Faker::Internet.mac_address.should eq "00:68:df:77:d0:57"
|
||||
Faker::Internet.mac_address("55:44:33").should eq "55:44:33:d9:d8:d5"
|
||||
Faker::Internet.url.should eq "http://raugottlieb.com/mia_hills"
|
||||
Faker::Internet.url("example.com").should eq "http://example.com/daron_nolan"
|
||||
Faker::Internet.url("example.com", "/foobar.html").should eq "http://example.com/foobar.html"
|
||||
Faker::Internet.slug.should eq "doloribus_quidem"
|
||||
Faker::Internet.slug("foo bar").should eq "foo_bar"
|
||||
Faker::Internet.slug("foo bar", "-").should eq "foo-bar"
|
||||
end
|
||||
end
|
||||
|
|
29
spec/lorem_spec.cr
Normal file
29
spec/lorem_spec.cr
Normal file
|
@ -0,0 +1,29 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Lorem do
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Lorem.word.should eq "consequatur"
|
||||
Faker::Lorem.words.should eq ["porro", "eos", "velit"]
|
||||
Faker::Lorem.words(4).should eq ["illo", "omnis", "quam", "quia"]
|
||||
Faker::Lorem.words(4, true).should eq ["abstergo", "volo", "congregatio", "cenaculum"]
|
||||
Faker::Lorem.characters.should eq "rtu4oasce8rh8v9boy4o7dvw9da4ehtukyicl07az92gxkatlehuga41fqg8v06po1txnjcylbivmv5z9rcgg0hizegu4lck3rnja8kvpwiwp4lds3au07h9lk3k3y7a1c5ec2jtlo5zjtcm3blh6zgtk9rq8wpkqszhv0tstyydx8974aik0j2nkck9ve4kjmh0gn9als5wwxjwtot2yegk8jwe8plvbffu86w38abdq4cupnu4tig75lmu82g"
|
||||
Faker::Lorem.characters(10).should eq "qunro8qzs5"
|
||||
Faker::Lorem.sentence.should eq "Dicta laudantium aut aut et asperiores quidem accusamus impedit."
|
||||
Faker::Lorem.sentence(3).should eq "Quam eum fugit."
|
||||
Faker::Lorem.sentence(3, true).should eq "Caelum arma illum depopulo cupressus quaerat suus."
|
||||
Faker::Lorem.sentence(3, false, 4).should eq "Est non necessitatibus."
|
||||
Faker::Lorem.sentence(3, true, 4).should eq "Accedo venustas summisse cito sperno."
|
||||
Faker::Lorem.sentences.should eq ["Voluptatem similique quia architecto quo.", "Culpa fugiat pariatur facilis ea accusantium voluptatem consequatur.", "Similique quis velit excepturi quia."]
|
||||
Faker::Lorem.sentences(1).should eq ["Tempore repellat omnis."]
|
||||
Faker::Lorem.sentences(1, true).should eq ["Aedificium adhuc patruus capio valens molestiae sit."]
|
||||
Faker::Lorem.paragraph.should eq "Fugit repellendus suscipit dolores. Voluptatem adipisci nihil cupiditate quisquam ad. Est repellat consequuntur laboriosam reiciendis est sit. Vel molestiae ipsam."
|
||||
Faker::Lorem.paragraph(2).should eq "Non consectetur itaque aut voluptas cumque est numquam. Non impedit quaerat iusto consequatur tempora nemo amet."
|
||||
Faker::Lorem.paragraph(2, true).should eq "Pecus urbs curo vinitor volubilis. Coadunatio tunc quas compono. Vetus ascit adfectus civis minus tristis adulatio solio."
|
||||
Faker::Lorem.paragraph(2, false, 4).should eq "Minima ducimus officia reprehenderit dolorem. Labore quia ut asperiores eos excepturi. Quibusdam tempore incidunt sunt quaerat provident."
|
||||
Faker::Lorem.paragraph(2, true, 4).should eq "Tego vinco ultio celebrer eveniet cupio argentum speculum. Candidus arbor quibusdam angulus termes. Strenuus concido vulnero. Desino assentator deludo stabilis vallum autem demergo. Temeritas tristis nihil aperio acerbitas."
|
||||
Faker::Lorem.paragraphs.should eq ["Voluptatem id dolor tempora. Praesentium harum dolores et explicabo unde ut. Sit deleniti vel ullam enim neque non itaque. Rerum qui quam quis et voluptate. Modi tenetur eius molestiae.", "Eaque pariatur quasi optio aliquam nihil quibusdam inventore. Voluptas eaque est nesciunt tenetur vel. Accusamus et et.", "Distinctio cum deserunt quia natus eos debitis neque. Qui voluptates quisquam. Facilis voluptatem et. Nihil nostrum occaecati at."]
|
||||
Faker::Lorem.paragraphs(1).should eq ["Libero voluptatem neque et autem aspernatur earum animi. Ut iure sed quo quasi dolores aut. Voluptas possimus voluptatem nisi."]
|
||||
Faker::Lorem.paragraphs(1, true).should eq ["Cibo cognatus temporibus demulceo cinis. Voluptatibus vobis ver cursus aperiam sulum apostolus. Id animadverto caste. Summisse derideo vallum. Suspendo et denuo collum accendo tamisium verecundia iste."]
|
||||
end
|
||||
end
|
13
spec/name_spec.cr
Normal file
13
spec/name_spec.cr
Normal file
|
@ -0,0 +1,13 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Name do
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Name.name.should eq "Danyka Gleichner DDS"
|
||||
Faker::Name.first_name.should eq "Molly"
|
||||
Faker::Name.last_name.should eq "Fay"
|
||||
Faker::Name.prefix.should eq "Dr."
|
||||
Faker::Name.suffix.should eq "DDS"
|
||||
Faker::Name.title.should eq "Direct Markets Associate"
|
||||
end
|
||||
end
|
79
spec/number_spec.cr
Normal file
79
spec/number_spec.cr
Normal file
|
@ -0,0 +1,79 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::Number do
|
||||
it "number" do
|
||||
Faker::Number.number(10).match(/[0-9]{10}/).should_not eq nil
|
||||
10.times do |digits|
|
||||
digits += 1
|
||||
Faker::Number.number(digits).match(/^[0-9]{#{digits}}$/).should_not eq nil
|
||||
end
|
||||
end
|
||||
|
||||
it "decimal" do
|
||||
Faker::Number.decimal(2).match(/[0-9]{2}\.[0-9]{2}/).should_not eq nil
|
||||
Faker::Number.decimal(4, 5).match(/[0-9]{4}\.[0-9]{5}/).should_not eq nil
|
||||
end
|
||||
|
||||
it "digit" do
|
||||
Faker::Number.digit.match(/[0-9]{1}/).should_not eq nil
|
||||
end
|
||||
|
||||
it "between" do
|
||||
100.times do
|
||||
random_number = Faker::Number.between(-50, 50)
|
||||
(random_number >= -50).should eq true
|
||||
(random_number <= 50).should eq true
|
||||
end
|
||||
end
|
||||
|
||||
it "positive" do
|
||||
100.times do
|
||||
random_number = Faker::Number.positive(1, 100)
|
||||
(random_number >= 1).should be_true
|
||||
(random_number <= 100).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "negative" do
|
||||
100.times do
|
||||
random_number = Faker::Number.negative(-1, -100)
|
||||
(random_number <= -1).should be_true
|
||||
(random_number >= -100).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "force_positive" do
|
||||
random_number = Faker::Number.positive(-1, -100)
|
||||
(random_number >= 1).should be_true
|
||||
(random_number <= 100).should be_true
|
||||
end
|
||||
|
||||
it "force_negative" do
|
||||
random_number = Faker::Number.negative(1, 100)
|
||||
(random_number <= -1).should be_true
|
||||
(random_number >= -100).should be_true
|
||||
end
|
||||
|
||||
it "parameters_order" do
|
||||
random_number = Faker::Number.between(100, 1)
|
||||
(random_number >= 1).should be_true
|
||||
(random_number <= 100).should be_true
|
||||
end
|
||||
|
||||
it "hexadecimal" do
|
||||
Faker::Number.hexadecimal(4).match(/[0-9a-f]{4}/).should_not eq nil
|
||||
Faker::Number.hexadecimal(7).match(/[0-9a-f]{7}/).should_not eq nil
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Number.number(10).should eq "9394314441"
|
||||
Faker::Number.decimal(2).should eq "12.05"
|
||||
Faker::Number.decimal(2, 3).should eq "98.256"
|
||||
Faker::Number.hexadecimal(3).should eq "37c"
|
||||
Faker::Number.between(1, 10).should eq 9
|
||||
Faker::Number.positive.should eq 352.4124353316201
|
||||
Faker::Number.negative.should eq -4363.992315679857
|
||||
Faker::Number.digit.should eq "9"
|
||||
end
|
||||
end
|
8
spec/phone_number_spec.cr
Normal file
8
spec/phone_number_spec.cr
Normal file
|
@ -0,0 +1,8 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe Faker::PhoneNumber do
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::PhoneNumber.phone_number.should eq "894.314.4411 x20598"
|
||||
end
|
||||
end
|
|
@ -16,4 +16,11 @@ describe Faker::Team do
|
|||
it "sport" do
|
||||
# Faker::Team.sport.match(/(\w+){1}/).should_not eq nil
|
||||
end
|
||||
|
||||
it "should return deterministic results when seeded" do
|
||||
Faker.seed 123456
|
||||
Faker::Team.creature.should eq "vampires"
|
||||
Faker::Team.name.should eq "New Jersey griffins"
|
||||
Faker::Team.state.should eq "Arkansas"
|
||||
end
|
||||
end
|
||||
|
|
213
src/data.cr
213
src/data.cr
File diff suppressed because one or more lines are too long
46
src/faker.cr
46
src/faker.cr
|
@ -1,14 +1,21 @@
|
|||
require "./data.cr"
|
||||
require "./faker/base"
|
||||
require "./faker/*"
|
||||
|
||||
module Faker
|
||||
class_getter rng : Random = Random.new
|
||||
|
||||
def self.seed(number)
|
||||
@@rng = Random.new number
|
||||
end
|
||||
|
||||
def self.numerify(number_string)
|
||||
number_string = number_string as String
|
||||
number_string.sub(/#/) { (rand(9) + 1).to_s }.gsub(/#/) { rand(10).to_s }
|
||||
number_string = number_string.as String
|
||||
number_string.sub(/#/) { (@@rng.rand(9) + 1).to_s }.gsub(/#/) { @@rng.rand(10).to_s }
|
||||
end
|
||||
|
||||
def self.letterify(letter_string)
|
||||
letter_string.gsub(/\?/) { ("A".."Z").to_a.sample }
|
||||
letter_string.gsub(/\?/) { ("A".."Z").to_a.sample(@@rng) }
|
||||
end
|
||||
|
||||
def self.bothify(string)
|
||||
|
@ -17,26 +24,26 @@ module Faker
|
|||
|
||||
def self.regexify(re)
|
||||
re = re.source if re.is_a?(Regex)
|
||||
re.gsub(/^\/?\^?/, "").gsub(/\$?\/?$/, "") # Ditch the anchors
|
||||
.gsub(/\{(\d+)\}/) { "{#{$1},#{$1}}" }.gsub(/\?/, "{0,1}") # All {2} become {2,2} and ? become {0,1}
|
||||
.gsub(/(\[[^\]]+\])\{(\d+),(\d+)\}/) { |match| $1 * (Range.new($2.to_i, $3.to_i)).to_a.sample } # [12]{1,2} becomes [12] or [12][12]
|
||||
.gsub(/(\([^\)]+\))\{(\d+),(\d+)\}/) { |match| $1 * ($2.to_i..$3.to_i).to_a.sample } # (12|34){1,2} becomes (12|34) or (12|34)(12|34)
|
||||
.gsub(/(\\?.)\{(\d+),(\d+)\}/) { |match| $1 * ($2.to_i..$3.to_i).to_a.sample } # A{1,2} becomes A or AA or \d{3} becomes \d\d\d
|
||||
.gsub(/\((.*?)\)/) { |match| match.gsub(/[\(\)]/, "").split("|").sample } # (this|that) becomes "this" or "that"
|
||||
.gsub(/\[([^\]]+)\]/) { |match| match.gsub(/(\w\-\w)/) { |range| ((0...range.size).map { |i| range[i].to_s }).join("").split("-").to_a.sample } } # All A-Z inside of [] become C (or X, or whatever)
|
||||
.gsub(/\[([^\]]+)\]/) { |match| $1.split("").sample } # All [ABC] become B (or A or C)
|
||||
.gsub("\\d") { |match| (0..9).to_a.sample }
|
||||
.gsub("\\w") { |match| (("A".."Z").to_a + (0..9).to_a).sample }
|
||||
re.gsub(/^\/?\^?/, "").gsub(/\$?\/?$/, "") # Ditch the anchors
|
||||
.gsub(/\{(\d+)\}/) { "{#{$1},#{$1}}" }.gsub(/\?/, "{0,1}") # All {2} become {2,2} and ? become {0,1}
|
||||
.gsub(/(\[[^\]]+\])\{(\d+),(\d+)\}/) { |match| $1 * (Range.new($2.to_i, $3.to_i)).to_a.sample(@@rng) } # [12]{1,2} becomes [12] or [12][12]
|
||||
.gsub(/(\([^\)]+\))\{(\d+),(\d+)\}/) { |match| $1 * ($2.to_i..$3.to_i).to_a.sample(@@rng) } # (12|34){1,2} becomes (12|34) or (12|34)(12|34)
|
||||
.gsub(/(\\?.)\{(\d+),(\d+)\}/) { |match| $1 * ($2.to_i..$3.to_i).to_a.sample(@@rng) } # A{1,2} becomes A or AA or \d{3} becomes \d\d\d
|
||||
.gsub(/\((.*?)\)/) { |match| match.gsub(/[\(\)]/, "").split("|").sample(@@rng) } # (this|that) becomes "this" or "that"
|
||||
.gsub(/\[([^\]]+)\]/) { |match| match.gsub(/(\w\-\w)/) { |range| ((0...range.size).map { |i| range[i].to_s }).join("").split("-").to_a.sample(@@rng) } } # All A-Z inside of [] become C (or X, or whatever)
|
||||
.gsub(/\[([^\]]+)\]/) { |match| $1.split("").sample(@@rng) } # All [ABC] become B (or A or C)
|
||||
.gsub("\\d") { |match| (0..9).to_a.sample(@@rng) }
|
||||
.gsub("\\w") { |match| (("A".."Z").to_a + (0..9).to_a).sample(@@rng) }
|
||||
end
|
||||
|
||||
def self.fetch(data)
|
||||
data = data as Array
|
||||
fetched = data.sample as String
|
||||
data = data.as Array
|
||||
fetched = data.sample(@@rng).as String
|
||||
if fetched.match(/^\//) && fetched.match(/\/$/) # A regex
|
||||
fetched = Faker.regexify(fetched)
|
||||
end
|
||||
|
||||
Faker.parse(fetched) as String
|
||||
Faker.parse(fetched).as String
|
||||
end
|
||||
|
||||
def self.parse(st)
|
||||
|
@ -55,6 +62,7 @@ module Faker
|
|||
Name.name,
|
||||
Name.prefix,
|
||||
Name.suffix,
|
||||
Team.creature,
|
||||
], $1)
|
||||
end
|
||||
end
|
||||
|
@ -69,4 +77,10 @@ module Faker
|
|||
"Hoaydaaa"
|
||||
end
|
||||
end
|
||||
|
||||
# Generates a random value between the interval
|
||||
def self.rand_in_range(from, to)
|
||||
from, to = to, from if to < from
|
||||
@@rng.rand(from..to)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,26 +1,33 @@
|
|||
module Faker
|
||||
class Address
|
||||
class Address < Base
|
||||
def self.zip_code
|
||||
Faker.numerify(["#####", "#####-####"].sample)
|
||||
Faker.numerify(["#####", "#####-####"].sample(Faker.rng))
|
||||
end
|
||||
|
||||
{% for data_type in %w(state state_abbr city_suffix city_prefix country street_suffix) %}
|
||||
uniquify_builder(zip_code)
|
||||
|
||||
{% for data_type in %w(state state_abbr city_suffix city_prefix country street_suffix country_code) %}
|
||||
def self.{{data_type.id}}
|
||||
Faker.fetch(Data["address"]["{{data_type.id}}"])
|
||||
end
|
||||
uniquify_builder({{data_type.id}})
|
||||
{% end %}
|
||||
|
||||
def self.city
|
||||
Faker.fetch(Data["address"]["city"])
|
||||
end
|
||||
|
||||
uniquify_builder(city)
|
||||
|
||||
def self.street_name
|
||||
[
|
||||
->{ [Name.last_name, street_suffix].join(" ") },
|
||||
->{ [Name.first_name, street_suffix].join(" ") },
|
||||
].sample.call
|
||||
].sample(Faker.rng).call
|
||||
end
|
||||
|
||||
uniquify_builder(street_name)
|
||||
|
||||
def self.street_address
|
||||
Faker.numerify([
|
||||
->{ "##### %s" % street_name },
|
||||
|
@ -29,34 +36,48 @@ module Faker
|
|||
->{ "##### %s" % street_name },
|
||||
->{ "##### %s Apt. ###" % street_name },
|
||||
->{ "##### %s Suite ###" % street_name },
|
||||
].sample.call)
|
||||
].sample(Faker.rng).call)
|
||||
end
|
||||
|
||||
uniquify_builder(street_address)
|
||||
|
||||
def self.secondary_address
|
||||
Faker.numerify(Faker.fetch(Data["address"]["secondary_address"]))
|
||||
end
|
||||
|
||||
uniquify_builder(street_address)
|
||||
|
||||
def self.building_number
|
||||
Faker.bothify(Faker.fetch(Data["address"]["building_number"]))
|
||||
end
|
||||
|
||||
uniquify_builder(building_number)
|
||||
|
||||
def self.postcode
|
||||
Faker.bothify([
|
||||
->{ "??# #??" },
|
||||
->{ "??## #??" },
|
||||
].sample.call)
|
||||
].sample(Faker.rng).call)
|
||||
end
|
||||
|
||||
uniquify_builder(postcode)
|
||||
|
||||
def self.latitude
|
||||
((rand * 180) - 90).to_s
|
||||
((Faker.rng.rand * 180) - 90).to_s
|
||||
end
|
||||
|
||||
uniquify_builder(latitude)
|
||||
|
||||
def self.longitude
|
||||
((rand * 360) - 180).to_s
|
||||
((Faker.rng.rand * 360) - 180).to_s
|
||||
end
|
||||
|
||||
uniquify_builder(longitude)
|
||||
|
||||
def self.time_zone
|
||||
Faker.bothify(Faker.fetch(Data["address"]["time_zone"]))
|
||||
Faker.fetch(Data["address"]["time_zone"])
|
||||
end
|
||||
|
||||
uniquify_builder(time_zone)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
module Faker
|
||||
class Avatar
|
||||
class Avatar < Base
|
||||
def self.image(slug = nil)
|
||||
slug ||= Faker::Lorem.word
|
||||
"http://robohash.org/#{slug}"
|
||||
end
|
||||
|
||||
uniquify_builder(image, slug = nil)
|
||||
end
|
||||
end
|
||||
|
|
25
src/faker/base.cr
Normal file
25
src/faker/base.cr
Normal file
|
@ -0,0 +1,25 @@
|
|||
module Faker
|
||||
class NonUniqueValue < Exception
|
||||
end
|
||||
|
||||
class Base
|
||||
alias Any = String | Int32 | Float64 | Time
|
||||
|
||||
macro uniquify_builder(attribute_name, *modified_method_attributes)
|
||||
@@__unique_vals_for_{{attribute_name}} = Array(Any).new
|
||||
|
||||
def self.unique_{{attribute_name}}({% if !modified_method_attributes.empty? %}{{*modified_method_attributes}},{% end %} max_retries = 10_0000)
|
||||
max_retries.times do |t|
|
||||
val = self.{{attribute_name}}({{*modified_method_attributes}})
|
||||
|
||||
if !@@__unique_vals_for_{{attribute_name}}.includes?(val)
|
||||
@@__unique_vals_for_{{attribute_name}} << val
|
||||
return val
|
||||
end
|
||||
end
|
||||
|
||||
raise NonUniqueValue.new("Unable to generate unique value for {{attribute_name}}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,16 +1,22 @@
|
|||
module Faker
|
||||
class Business
|
||||
class Business < Base
|
||||
def self.credit_card_number
|
||||
Faker.fetch(Data["business"]["credit_card_numbers"])
|
||||
end
|
||||
|
||||
uniquify_builder(credit_card_number)
|
||||
|
||||
def self.credit_card_expiry_date
|
||||
credit_card_expiry_date = Faker.fetch(Data["business"]["credit_card_expiry_dates"]) as String
|
||||
Time.parse(credit_card_expiry_date, "%Y-%m-%d")
|
||||
credit_card_expiry_date = Faker.fetch(Data["business"]["credit_card_expiry_dates"]).as String
|
||||
Time.parse_local(credit_card_expiry_date, "%Y-%m-%d")
|
||||
end
|
||||
|
||||
uniquify_builder(credit_card_expiry_date)
|
||||
|
||||
def self.credit_card_type
|
||||
Faker.fetch(Data["business"]["credit_card_types"])
|
||||
end
|
||||
|
||||
uniquify_builder(credit_card_type)
|
||||
end
|
||||
end
|
||||
|
|
66
src/faker/code.cr
Normal file
66
src/faker/code.cr
Normal file
|
@ -0,0 +1,66 @@
|
|||
module Faker
|
||||
class Code < Base
|
||||
RBI = %w[01 10 30 33 35 44 45 49 50 51 52 53 54 86 91 98 99]
|
||||
|
||||
def self.isbn(base : Int32 = 10)
|
||||
case base
|
||||
when 10 then generate_base10_isbn
|
||||
when 13 then generate_base13_isbn
|
||||
else raise ArgumentError.new("base must be 10 or 13")
|
||||
end
|
||||
end
|
||||
|
||||
def self.imei
|
||||
str = Array.new(15, 0)
|
||||
sum = 0
|
||||
len = 15
|
||||
|
||||
# Fill in the first two values of the string based with the specified prefix.
|
||||
arr = RBI.sample(Faker.rng)
|
||||
str[0] = arr[0].to_i
|
||||
str[1] = arr[1].to_i
|
||||
pos = 2
|
||||
|
||||
# Fill all the remaining numbers except for the last one with random values.
|
||||
while pos < (len - 1)
|
||||
str[pos] = Faker.rng.rand(0..9)
|
||||
pos += 1
|
||||
end
|
||||
|
||||
# Calculate the Luhn checksum of the values thus far
|
||||
len_offset = (len + 1) % 2
|
||||
(0..(len - 1)).each do |position|
|
||||
if (position + len_offset).odd?
|
||||
t = str[position] * 2
|
||||
|
||||
t -= 9 if t > 9
|
||||
|
||||
sum += t
|
||||
else
|
||||
sum += str[position]
|
||||
end
|
||||
end
|
||||
str[len - 1] = (10 - (sum % 10)) % 10
|
||||
|
||||
str.join("")
|
||||
end
|
||||
|
||||
private def self.generate_base10_isbn
|
||||
values = Faker.regexify(/\d{9}/)
|
||||
remainder = sum(values) { |value, index| (index + 1) * value.to_i } % 11
|
||||
values += "-#{remainder == 10 ? 'X' : remainder}"
|
||||
end
|
||||
|
||||
private def self.generate_base13_isbn
|
||||
values = Faker.regexify(/\d{12}/)
|
||||
remainder = sum(values) { |value, index| index.even? ? value.to_i : value.to_i * 3 } % 10
|
||||
values += "-#{(10 - remainder) % 10}"
|
||||
end
|
||||
|
||||
private def self.sum(values)
|
||||
values.split(//).each_with_index.reduce(0) do |sum, (value, index)|
|
||||
sum + yield(value, index)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,20 +1,59 @@
|
|||
module Faker
|
||||
class Commerce
|
||||
class Commerce < Base
|
||||
def self.color
|
||||
Faker.fetch(Data["color"]["name"])
|
||||
end
|
||||
|
||||
def self.department
|
||||
Faker.fetch(Data["commerce"]["department"])
|
||||
uniquify_builder(color)
|
||||
|
||||
def self.department(max = 3, fixed_amount = false)
|
||||
num = max if fixed_amount
|
||||
num ||= 1 + Faker.rng.rand(max)
|
||||
|
||||
categories = categories(num)
|
||||
|
||||
if num > 1
|
||||
merge_categories(categories)
|
||||
else
|
||||
categories[0]
|
||||
end
|
||||
end
|
||||
|
||||
uniquify_builder(department, max = 3, fixed_amount = false)
|
||||
|
||||
def self.material
|
||||
product_name = Data["commerce"]["product_name"].as Hash
|
||||
Faker.fetch(product_name["material"])
|
||||
end
|
||||
|
||||
uniquify_builder(material)
|
||||
|
||||
def self.product_name
|
||||
product_name = Data["commerce"]["product_name"] as Hash
|
||||
product_name = Data["commerce"]["product_name"].as Hash
|
||||
Faker.fetch(product_name["adjective"]) + " " + Faker.fetch(product_name["material"]) + " " + Faker.fetch(product_name["product"])
|
||||
end
|
||||
|
||||
def self.price
|
||||
(rand(100) + rand).round(2)
|
||||
uniquify_builder(product_name)
|
||||
|
||||
def self.price(range = 0.0..100.0)
|
||||
(Faker.rng.rand(range) * 100).floor/100.0
|
||||
end
|
||||
|
||||
uniquify_builder(price, range = 0.0..100.0)
|
||||
|
||||
private def self.categories(num)
|
||||
categories = [] of String
|
||||
while categories.size < num
|
||||
category = Faker.fetch(Data["commerce"]["department"])
|
||||
categories << category unless categories.includes?(category)
|
||||
end
|
||||
categories
|
||||
end
|
||||
|
||||
private def self.merge_categories(categories)
|
||||
separator = " & "
|
||||
comma_separated = categories[0...-1].join(", ")
|
||||
[comma_separated, categories[-1]].join(separator)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,26 +1,36 @@
|
|||
module Faker
|
||||
class Company
|
||||
class Company < Base
|
||||
def self.name
|
||||
Faker.fetch(Data["company"]["name"])
|
||||
end
|
||||
|
||||
uniquify_builder(name)
|
||||
|
||||
def self.suffix
|
||||
Faker.fetch(Data["company"]["suffix"])
|
||||
end
|
||||
|
||||
uniquify_builder(suffix)
|
||||
|
||||
def self.catch_phrase
|
||||
data = Data["company"]["buzzwords"] as Array(Array(String))
|
||||
data = Data["company"]["buzzwords"].as Array(Array(String))
|
||||
Faker.fetch(data.flatten)
|
||||
end
|
||||
|
||||
uniquify_builder(catch_phrase)
|
||||
|
||||
def self.bs
|
||||
data = Data["company"]["bs"] as Array(Array(String))
|
||||
data = Data["company"]["bs"].as Array(Array(String))
|
||||
Faker.fetch(data.flatten)
|
||||
end
|
||||
|
||||
uniquify_builder(bs)
|
||||
|
||||
def self.logo
|
||||
rand_num = Random.rand(13) + 1
|
||||
rand_num = Faker.rng.rand(13) + 1
|
||||
"https://pigment.github.io/fake-logos/logos/medium/color/#{rand_num}.png"
|
||||
end
|
||||
|
||||
uniquify_builder(logo)
|
||||
end
|
||||
end
|
||||
|
|
74
src/faker/date.cr
Normal file
74
src/faker/date.cr
Normal file
|
@ -0,0 +1,74 @@
|
|||
module Faker
|
||||
class Date < Base
|
||||
def self.between(from : Time | String, to : Time | String) : Time
|
||||
from = parse_date(from)
|
||||
to = parse_date(to)
|
||||
|
||||
Time.unix(Faker.rand_in_range(from.to_unix, to.to_unix)).at_beginning_of_day
|
||||
end
|
||||
|
||||
def self.between_except(from : Time | String, to : Time | String, excepted : Time | String)
|
||||
raise ArgumentError.new("From date, to date and excepted date must not be the same") if from == to && to == excepted
|
||||
|
||||
excepted = parse_date(excepted)
|
||||
|
||||
loop do
|
||||
date = between(from: from, to: to)
|
||||
return date if date != excepted
|
||||
end
|
||||
end
|
||||
|
||||
def self.birthday(min_age : Int32 = 18, max_age : Int32 = 65) : Time
|
||||
today = Time.utc
|
||||
|
||||
from = birthday_date(today, max_age)
|
||||
to = birthday_date(today, min_age)
|
||||
|
||||
between(from, to)
|
||||
end
|
||||
|
||||
def self.forward(days : Int32 = 365) : Time
|
||||
from = Time.utc + 1.day
|
||||
to = Time.utc + days.days
|
||||
|
||||
between(from: from, to: to)
|
||||
end
|
||||
|
||||
def self.backward(days : Int32 = 365) : Time
|
||||
from = Time.utc - days.days
|
||||
to = Time.utc - 1.day
|
||||
|
||||
between(from: from, to: to)
|
||||
end
|
||||
|
||||
def self.in_date_period(month : Int32? = nil, year : Int32 = Time.utc.year) : Time
|
||||
from = Time.utc(year, month || 1, 1)
|
||||
|
||||
to_month = month || 12
|
||||
end_day = Time.utc(year, to_month, 1).at_end_of_month.day
|
||||
to = Time.utc(year, to_month, end_day)
|
||||
|
||||
between(from: from, to: to)
|
||||
end
|
||||
|
||||
private def self.parse_date(date : String) : Time
|
||||
Time.parse(date, "%Y-%m-%d", Time::Location::UTC)
|
||||
end
|
||||
|
||||
private def self.parse_date(date : Time) : Time
|
||||
date
|
||||
end
|
||||
|
||||
private def self.birthday_date(date : Time, age : Int32) : Time
|
||||
year = date.year - age
|
||||
day =
|
||||
if date.day == 29 && date.month == 2 && Time.leap_year?(year)
|
||||
28
|
||||
else
|
||||
date.day
|
||||
end
|
||||
|
||||
Time.utc(year, date.month, day)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,8 +1,8 @@
|
|||
module Faker
|
||||
class Finance
|
||||
CREDIT_CARD_TYPES = (Data["credit_card"] as Hash).keys
|
||||
class Finance < Base
|
||||
CREDIT_CARD_TYPES = (Data["credit_card"].as(Hash)).keys
|
||||
|
||||
def self.credit_card(types = [] of Array(String) : Array)
|
||||
def self.credit_card(types : Array = [] of Array(String))
|
||||
types = CREDIT_CARD_TYPES if types.empty?
|
||||
type = types.sample
|
||||
|
||||
|
@ -21,5 +21,6 @@ module Faker
|
|||
template = template.gsub "L", luhn_digit.to_s
|
||||
template
|
||||
end
|
||||
# TODO: uniquify_builder(credit_card, types : Array = [] of Array(String))
|
||||
end
|
||||
end
|
||||
|
|
29
src/faker/hacker.cr
Normal file
29
src/faker/hacker.cr
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Port of http://shinytoylabs.com/jargon/
|
||||
module Faker
|
||||
class Hacker < Base
|
||||
def self.say_something_smart
|
||||
phrases.sample(Faker.rng)
|
||||
end
|
||||
|
||||
uniquify_builder(say_something_smart)
|
||||
|
||||
{% for data_type in %w(abbreviation adjective noun verb ingverb) %}
|
||||
def self.{{data_type.id}}
|
||||
Faker.fetch(Data["hacker"]["{{data_type.id}}"])
|
||||
end
|
||||
uniquify_builder({{data_type.id}})
|
||||
{% end %}
|
||||
|
||||
def self.phrases
|
||||
["If we #{verb} the #{noun}, we can get to the #{abbreviation} #{noun} through the #{adjective} #{abbreviation} #{noun}!",
|
||||
"We need to #{verb} the #{adjective} #{abbreviation} #{noun}!",
|
||||
"Try to #{verb} the #{abbreviation} #{noun}, maybe it will #{verb} the #{adjective} #{noun}!",
|
||||
"You can't #{verb} the #{noun} without #{ingverb} the #{adjective} #{abbreviation} #{noun}!",
|
||||
"Use the #{adjective} #{abbreviation} #{noun}, then you can #{verb} the #{adjective} #{noun}!",
|
||||
"The #{abbreviation} #{noun} is down, #{verb} the #{adjective} #{noun} so we can #{verb} the #{abbreviation} #{noun}!",
|
||||
"#{ingverb} the #{noun} won't do anything, we need to #{verb} the #{adjective} #{abbreviation} #{noun}!",
|
||||
"I'll #{verb} the #{adjective} #{abbreviation} #{noun}, that should #{noun} the #{abbreviation} #{noun}!",
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,20 +1,26 @@
|
|||
module Faker
|
||||
class Internet
|
||||
class Internet < Base
|
||||
def self.email(name = nil)
|
||||
[user_name(name), domain_name].join("@")
|
||||
end
|
||||
|
||||
uniquify_builder(email, name = nil)
|
||||
|
||||
def self.free_email(name = nil)
|
||||
[user_name(name), Faker.fetch(Data["internet"]["free_email"])].join("@")
|
||||
end
|
||||
|
||||
uniquify_builder(free_email, name = nil)
|
||||
|
||||
def self.safe_email(name = nil)
|
||||
[user_name(name), "example." + %w(org com net).shuffle.first].join("@")
|
||||
[user_name(name), "example." + %w(org com net).shuffle(Faker.rng).first].join("@")
|
||||
end
|
||||
|
||||
uniquify_builder(safe_email, name = nil)
|
||||
|
||||
def self.user_name(specifier = nil, separators = %w(. _))
|
||||
if specifier.is_a? String
|
||||
return specifier.scan(/\w+/).map { |s| s[0] }.shuffle.join(separators.sample).downcase
|
||||
return specifier.scan(/\w+/).map { |s| s[0] }.shuffle(Faker.rng).join(separators.sample(Faker.rng)).downcase
|
||||
elsif specifier.is_a? Int
|
||||
tries = 0 # Don't try forever in case we get something like 1_000_000.
|
||||
result = ""
|
||||
|
@ -40,65 +46,100 @@ module Faker
|
|||
return result[0...specifier.max]
|
||||
end
|
||||
|
||||
return name.scan(/\w+/).shuffle.map(&.[0]).join(separators.sample).downcase if name
|
||||
[
|
||||
->{ Name.first_name.gsub(/\W/, "").downcase },
|
||||
->{
|
||||
[Name.first_name, Name.last_name].map { |n|
|
||||
n.gsub(/\W/, "")
|
||||
}.join(separators.sample).downcase
|
||||
}.join(separators.sample(Faker.rng)).downcase
|
||||
},
|
||||
].sample.call
|
||||
].sample(Faker.rng).call
|
||||
end
|
||||
|
||||
uniquify_builder(user_name, specifier = nil, separators = %w(. _))
|
||||
|
||||
def self.domain_name
|
||||
[domain_word, domain_suffix].join(".")
|
||||
end
|
||||
|
||||
uniquify_builder(domain_name)
|
||||
|
||||
def self.domain_word
|
||||
Company.name.split(" ").first.gsub(/\W/, "").downcase
|
||||
end
|
||||
|
||||
uniquify_builder(domain_word)
|
||||
|
||||
def self.domain_suffix
|
||||
Faker.fetch(Data["internet"]["domain_suffix"])
|
||||
end
|
||||
|
||||
uniquify_builder(domain_suffix)
|
||||
|
||||
def self.ip_v4_address
|
||||
[
|
||||
(2..254).to_a.sample,
|
||||
(2..254).to_a.sample,
|
||||
(2..254).to_a.sample,
|
||||
(2..254).to_a.sample,
|
||||
(2..254).to_a.sample(Faker.rng),
|
||||
(2..254).to_a.sample(Faker.rng),
|
||||
(2..254).to_a.sample(Faker.rng),
|
||||
(2..254).to_a.sample(Faker.rng),
|
||||
].join('.')
|
||||
end
|
||||
|
||||
uniquify_builder(ip_v4_address)
|
||||
|
||||
def self.ip_v6_address
|
||||
ip_v6_space = (0..65535).to_a
|
||||
container = (1..8).map { |_| ip_v6_space.sample }
|
||||
container = (1..8).map { |_| ip_v6_space.sample(Faker.rng) }
|
||||
container.map { |n| n.to_s(16) }.join(':')
|
||||
end
|
||||
|
||||
uniquify_builder(ip_v6_address)
|
||||
|
||||
def self.mac_address(prefix = "")
|
||||
prefix_digits = prefix.split(":").map { |d| d.to_i?(16) ? d.to_i?(16) : 0 }
|
||||
address_digits = (1..(6 - prefix_digits.size)).map { rand(256) }
|
||||
address_digits = (1..(6 - prefix_digits.size)).map { Faker.rng.rand(256) }
|
||||
(prefix_digits + address_digits).map { |d| "%02x" % d }.join(":")
|
||||
end
|
||||
|
||||
uniquify_builder(mac_address, prefix = "")
|
||||
|
||||
def self.url(host = domain_name, path = "/#{user_name}")
|
||||
"http://#{host}#{path}"
|
||||
end
|
||||
|
||||
uniquify_builder(url, host = domain_name, path = "/#{user_name}")
|
||||
|
||||
def self.slug(words = nil, glue = nil)
|
||||
glue ||= %w(- _ .).sample
|
||||
glue ||= %w(- _ .).sample(Faker.rng)
|
||||
(words || Lorem.words(2).join(' ')).gsub(' ', glue).downcase
|
||||
end
|
||||
|
||||
def self.password(min_length = 0)
|
||||
temp = Lorem.words.join
|
||||
while temp.size < min_length
|
||||
temp += Lorem.word
|
||||
uniquify_builder(slug, words = nil, glue = nil)
|
||||
|
||||
def self.password(min_length = 8, max_length = 16, mix_case = true, special_chars = false)
|
||||
temp = Lorem.characters(min_length)
|
||||
diff_length = max_length - min_length
|
||||
if diff_length > 0
|
||||
diff_rand = Faker.rng.rand(diff_length + 1)
|
||||
temp += Lorem.characters(diff_rand)
|
||||
end
|
||||
temp = temp[0..min_length] if min_length > 0
|
||||
|
||||
if mix_case
|
||||
temp = temp.gsub(/.{1,2}/) { |s| s.capitalize }
|
||||
end
|
||||
|
||||
if special_chars
|
||||
chars = %w(! @ # $ % ^ & *)
|
||||
number_of_substitutions = Faker.rng.rand(min_length - 1) + 1 # substitute at least one character
|
||||
number_of_substitutions.times do |i|
|
||||
temp = temp.sub({temp[i] => chars[Faker.rng.rand(chars.size)]})
|
||||
end
|
||||
end
|
||||
|
||||
return temp
|
||||
end
|
||||
|
||||
uniquify_builder(password, min_length = 8, max_length = 16, mix_case = true, special_chars = false)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,31 +1,41 @@
|
|||
module Faker
|
||||
# Based on Perl"s Text::Lorem
|
||||
class Lorem
|
||||
class Lorem < Base
|
||||
def self.character
|
||||
characters(1)
|
||||
end
|
||||
|
||||
uniquify_builder(character)
|
||||
|
||||
def self.characters(char_count = 255)
|
||||
chars = ("a".."z").to_a + (0..9).to_a
|
||||
Array(String).new(char_count < 0 ? 0 : char_count, "").map { chars.sample }.join("")
|
||||
Array(String).new(char_count < 0 ? 0 : char_count, "").map { chars.sample(Faker.rng) }.join("")
|
||||
end
|
||||
|
||||
uniquify_builder(characters)
|
||||
|
||||
def self.word
|
||||
words = Data["lorem"]["words"] as Array
|
||||
words = Data["lorem"]["words"].as Array
|
||||
Faker.fetch(words)
|
||||
end
|
||||
|
||||
def self.words(num = 3, supplemental = false)
|
||||
words = Data["lorem"]["words"] as Array(String)
|
||||
words += (Data["lorem"]["supplemental"] as Array(String)) if supplemental
|
||||
uniquify_builder(word)
|
||||
|
||||
words.shuffle[0, num]
|
||||
def self.words(num = 3, supplemental = false)
|
||||
words = Data["lorem"]["words"].as Array(String)
|
||||
words += (Data["lorem"]["supplemental"].as Array(String)) if supplemental
|
||||
|
||||
words.shuffle(Faker.rng)[0, num]
|
||||
end
|
||||
|
||||
uniquify_builder(words)
|
||||
|
||||
def self.sentence(word_count = 4, supplemental = false, random_words_to_add = 6)
|
||||
words(word_count + rand(random_words_to_add.to_i).to_i, supplemental).join(" ").capitalize + "."
|
||||
words(word_count + Faker.rng.rand(random_words_to_add.to_i).to_i, supplemental).join(" ").capitalize + "."
|
||||
end
|
||||
|
||||
uniquify_builder(sentence)
|
||||
|
||||
def self.sentences(sentence_count = 3, supplemental = false)
|
||||
([] of String).tap do |sentences|
|
||||
1.upto(sentence_count) do
|
||||
|
@ -34,10 +44,14 @@ module Faker
|
|||
end
|
||||
end
|
||||
|
||||
uniquify_builder(sentences)
|
||||
|
||||
def self.paragraph(sentence_count = 3, supplemental = false, random_sentences_to_add = 3)
|
||||
sentences(sentence_count + rand(random_sentences_to_add.to_i).to_i, supplemental).join(" ")
|
||||
sentences(sentence_count + Faker.rng.rand(random_sentences_to_add.to_i).to_i, supplemental).join(" ")
|
||||
end
|
||||
|
||||
uniquify_builder(paragraph)
|
||||
|
||||
def self.paragraphs(paragraph_count = 3, supplemental = false)
|
||||
([] of String).tap do |paragraphs|
|
||||
1.upto(paragraph_count) do
|
||||
|
@ -45,5 +59,7 @@ module Faker
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
uniquify_builder(paragraphs)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
module Faker
|
||||
class Name
|
||||
class Name < Base
|
||||
{% for data_type in %w(first_name last_name name prefix suffix) %}
|
||||
def self.{{data_type.id}}
|
||||
Faker.fetch(Data["name"]["{{data_type.id}}"])
|
||||
end
|
||||
uniquify_builder({{data_type.id}})
|
||||
{% end %}
|
||||
|
||||
def self.title
|
||||
title = Data["name"]["title"] as Hash
|
||||
title = Data["name"]["title"].as Hash
|
||||
Faker.fetch(title["descriptor"]) + " " + Faker.fetch(title["level"]) + " " + Faker.fetch(title["job"])
|
||||
end
|
||||
|
||||
uniquify_builder(title)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,17 +1,67 @@
|
|||
module Faker
|
||||
class Number
|
||||
class Number < Base
|
||||
def self.number(digits)
|
||||
(1..digits).map { digit }.join ""
|
||||
end
|
||||
|
||||
uniquify_builder(number, digits)
|
||||
|
||||
def self.digit
|
||||
rand(10).to_s
|
||||
Faker.rng.rand(10).to_s
|
||||
end
|
||||
|
||||
uniquify_builder(digit)
|
||||
|
||||
def self.decimal(l_digits, r_digits = 2)
|
||||
l_d = number(l_digits)
|
||||
r_d = number(r_digits)
|
||||
"#{l_d}.#{r_d}"
|
||||
end
|
||||
|
||||
uniquify_builder(decimal, l_digits, r_digits = 2)
|
||||
|
||||
def self.between(from = 1.00, to = 5000.00)
|
||||
Faker.rand_in_range(from, to)
|
||||
end
|
||||
|
||||
uniquify_builder(between)
|
||||
|
||||
def self.positive(from = 1.00, to = 5000.00)
|
||||
random_number = between(from, to)
|
||||
greater_than_zero(random_number)
|
||||
end
|
||||
|
||||
uniquify_builder(positive)
|
||||
|
||||
def self.negative(from = -5000.00, to = -1.00)
|
||||
random_number = between(from, to)
|
||||
less_than_zero(random_number)
|
||||
end
|
||||
|
||||
uniquify_builder(negative)
|
||||
|
||||
def self.hexadecimal(digits)
|
||||
hex = ""
|
||||
digits.times { hex += Faker.rng.rand(15).to_s(16) }
|
||||
hex
|
||||
end
|
||||
|
||||
uniquify_builder(hexadecimal)
|
||||
|
||||
private def self.greater_than_zero(number)
|
||||
if number > 0
|
||||
number
|
||||
else
|
||||
number * -1
|
||||
end
|
||||
end
|
||||
|
||||
private def self.less_than_zero(number)
|
||||
if number < 0
|
||||
number
|
||||
else
|
||||
number * -1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
module Faker
|
||||
class PhoneNumber
|
||||
class PhoneNumber < Base
|
||||
def self.phone_number
|
||||
Faker.numerify(Faker.fetch(Data["phone_number"]["formats"]))
|
||||
end
|
||||
|
||||
uniquify_builder(phone_number)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,15 +1,21 @@
|
|||
module Faker
|
||||
class Team
|
||||
class Team < Base
|
||||
def self.name
|
||||
Faker.fetch(Data["team"]["name"])
|
||||
end
|
||||
|
||||
uniquify_builder(name)
|
||||
|
||||
def self.creature
|
||||
Faker.fetch(Data["team"]["creature"])
|
||||
end
|
||||
|
||||
uniquify_builder(creature)
|
||||
|
||||
def self.state
|
||||
Faker.fetch(Data["address"]["state"])
|
||||
end
|
||||
|
||||
uniquify_builder(state)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
module Faker
|
||||
VERSION = "0.1.0"
|
||||
VERSION = "0.8.0"
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue
Block a user