File: science.rb

package info (click to toggle)
ruby-faker 3.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,360 kB
  • sloc: ruby: 20,654; makefile: 6; sh: 6
file content (154 lines) | stat: -rw-r--r-- 4,278 bytes parent folder | download | duplicates (2)
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