-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
science.rb
154 lines (140 loc) · 4.18 KB
/
science.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# frozen_string_literal: true
module Faker
class Science < Base
class << self
BRANCHES = {
empirical: %i[empirical_natural_basic empirical_natural_applied empirical_social_basic empirical_social_applied],
formal: %i[formal_basic formal_applied],
natural: %i[empirical_natural_basic empirical_natural_applied],
social: %i[empirical_social_basic empirical_social_applied],
basic: %i[empirical_natural_basic empirical_social_basic formal_basic],
applied: %i[empirical_natural_applied empirical_social_applied formal_applied]
}.freeze
##
# Produces a name of a science
# You can optionally filter by specifying one or more of the following:
# `:empirical, :formal, :natural, :social, :basic, :applied`
# @see https://en.wikipedia.org/wiki/Science#Branches_of_science
# @see Faker::Educator.subject
#
# @param branches [Array<Symbol>]
# @return [String]
#
# @example
# Faker::Science.science #=> "Space science"
# Faker::Science.science(:natural, :applied) #=> "Engineering"
# Faker::Science.science(:formal, :applied) #=> "Computer Science"
#
# @faker.version next
def science(*branches)
selected = BRANCHES.values.flatten.uniq
branches.each do |branch|
selected &= BRANCHES[branch] if BRANCHES.key? branch
end
raise ArgumentError, 'Filters do not match any sciences' if selected.empty?
sciences = []
selected.each do |branch|
sciences += translate("faker.science.branch.#{branch}")
end
sample(sciences)
end
##
# Produces the name of a element.
#
# @return [String]
#
# @example
# Faker::Science.element #=> "Carbon"
#
# @faker.version 1.8.5
def element
fetch('science.element')
end
##
# Produces the symbol of an element.
#
# @return [String]
#
# @example
# Faker::Science.element_symbol #=> "Pb"
#
# @faker.version 1.9.0
def element_symbol
fetch('science.element_symbol')
end
##
# Produces the state of an element.
#
# @return [String]
#
# @example
# Faker::Science.element_state #=> "Liquid"
#
# @faker.version next
def element_state
fetch('science.element_state')
end
##
# Produces the subcategory of an element.
#
# @return [String]
#
# @example
# Faker::Science.element_subcategory #=> "Reactive nonmetal"
#
# @faker.version next
def element_subcategory
fetch('science.element_subcategory')
end
##
# Produces the name of a scientist.
#
# @return [String]
#
# @example
# Faker::Science.scientist #=> "Isaac Newton"
#
# @faker.version 1.8.5
def scientist
fetch('science.scientist')
end
##
# Produces a scientifically sounding word
#
# @return [String]
#
# @example
# Faker::Science.modifier #=> "Quantum"
# Faker::Science.modifier #=> "Superconductive"
#
# @faker.version next
def modifier
fetch('science.modifier')
end
##
# Produces the name of a scientific tool.
# By default it uses a science word modifier to generate more diverse data, which can be disabled.
#
# @param simple [Boolean] Whether to generate simple realistic tool names, (no Q-word).
# @return [String]
#
# @example
# Faker::Science.tool #=> "Superconductive Microcentrifuge"
# Faker::Science.tool #=> "Portable Cryostat"
# Faker::Science.tool #=> "Quantum Spectrophotometer"
# Faker::Science.tool(simple: true) #=> "Microcentrifuge"
#
# @faker.version next
def tool(simple: false)
tool = fetch('science.tool')
return tool if simple
# Makes sure the modifier are different
loop do
modifier = self.modifier
break unless tool.start_with?(modifier)
end
"#{modifier} #{tool}"
end
end
end
end