data_maker 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,40 @@
1
+ 130
2
+ 131
3
+ 132
4
+ 133
5
+ 1340
6
+ 1348
7
+ 1349
8
+ 135
9
+ 135
10
+ 136
11
+ 137
12
+ 138
13
+ 139
14
+ 145
15
+ 147
16
+ 150
17
+ 151
18
+ 152
19
+ 158
20
+ 159
21
+ 153
22
+ 155
23
+ 156
24
+ 157
25
+ 1700
26
+ 1705
27
+ 1709
28
+ 176
29
+ 177
30
+ 178
31
+ 180
32
+ 181
33
+ 182
34
+ 183
35
+ 184
36
+ 187
37
+ 185
38
+ 186
39
+ 188
40
+ 189
@@ -0,0 +1,36 @@
1
+ module DataMaker
2
+ module ArrayUtilities
3
+ def self.const_array(argument)
4
+ array = argument.is_a?(Array) ? argument : argument.to_a
5
+ array.extend ArrayUtilities
6
+ freeze_all(array)
7
+ end
8
+
9
+ def self.random_pick(array, n)
10
+ indexes = (0...array.length).sort_by{Kernel.rand}[0...n]
11
+ indexes.map { |n| array[n].dup }
12
+ end
13
+
14
+ def self.freeze_all(array)
15
+ array.each(&:freeze)
16
+ array.freeze
17
+ array
18
+ end
19
+
20
+ def self.shuffle(array)
21
+ array.sort_by{Kernel.rand}
22
+ end
23
+
24
+ def random_pick(n)
25
+ ArrayUtilities.random_pick(self, n)
26
+ end
27
+
28
+ def freeze_all
29
+ ArrayUtilities.freeze_all(self)
30
+ end
31
+
32
+ def shuffle
33
+ ArrayUtilities.shuffle(self)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ require 'data_maker/utilities/array_utilities'
2
+
3
+ module DataMaker
4
+ module ModuleUtilities
5
+ def k(arg)
6
+ DataMaker::ArrayUtilities.const_array(arg)
7
+ end
8
+
9
+ def const_missing(const_name)
10
+ if const_name =~ /[a-z]/ # Not a constant, probably a class/module name.
11
+ super const_name
12
+ else
13
+ locale = ancestors.first.to_s.split("::")[-2]
14
+ mod_name = ancestors.first.to_s.split("::").last
15
+ data_path = "#{DataMaker::BASE_LIB_PATH}/data_maker/data/#{underscore(locale)}/#{underscore(mod_name)}/#{underscore(const_name.to_s)}"
16
+ data = k File.read(data_path).split("\n")
17
+ const_set const_name, data
18
+ data
19
+ end
20
+ end
21
+
22
+ def underscore(string)
23
+ string.gsub(/::/, '/').
24
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
25
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
26
+ tr("-", "_").
27
+ downcase
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ module DataMaker
2
+ module Validators
3
+ class ChinesePhoneNumber
4
+ def initialize(number)
5
+ @number = number
6
+ end
7
+
8
+ def mobile?
9
+ mobile_regex = /^1[34578]\d(\D?)\d{4}(\D?)\d{4}$/
10
+ !(mobile_regex.match(@number.to_s).nil?)
11
+ end
12
+
13
+ def landline?
14
+ twodigit = /^0?((10)|(2[0-57-9])|(3[157])|(4[17])|(5[1,3,5])|(7[1579])|(8[357])|(9[379]))\d{8,9}$/
15
+ threedigit = /^0?(((335|349|39[1-6]|398))|((42[179]|43[1-9]|44[08]|45[1-9]|46[4789]|48[23]))|((52[37]|54[36]|56[1-6]|580|59[1-9]))|((63[1-5]|66[0238]|69[12]))|((701|72[248]|73[014-9]|74[3-6]|76[023689]))|((81[23678]|82[5-7]|88[136-8]|89[1-8]))|((90[123689]|91[1-9]|94[13]|95[1-5])))\d{7,}$/
16
+ fourdigit = /^0?((8029|806[03578]|807[01])\d{6,})$/
17
+
18
+ !(twodigit.match(@number.to_s).nil?) ||
19
+ !(threedigit.match(@number.to_s).nil?) ||
20
+ !(fourdigit.match(@number.to_s).nil?)
21
+ end
22
+
23
+ def valid?
24
+ mobile? || landline?
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/data_maker.rb ADDED
@@ -0,0 +1,63 @@
1
+ module DataMaker
2
+ VERSION = "2.0.0"
3
+
4
+ require 'data_maker/utilities/array_utilities'
5
+ require 'data_maker/utilities/module_utilities'
6
+
7
+ extend ModuleUtilities
8
+
9
+ BASE_LIB_PATH = File.expand_path("..", __FILE__)
10
+
11
+ LETTERS = [*'a'..'z']
12
+
13
+ HEX = %w(0 1 2 3 4 5 6 7 8 9 A B C D E F)
14
+
15
+ def self.hexify(*masks)
16
+ begin
17
+ if valid_mask?(*masks, /#/)
18
+ masks.flatten.sample.gsub(/#/) { HEX.sample }
19
+ end
20
+ rescue
21
+ return false
22
+ end
23
+ end
24
+
25
+ def self.numerify(*masks)
26
+ begin
27
+ if valid_mask?(*masks, /#/)
28
+ masks.flatten.sample.gsub(/#/) { rand(10).to_s }
29
+ end
30
+ rescue
31
+ return false
32
+ end
33
+ end
34
+
35
+ def self.letterify(*masks)
36
+ begin
37
+ if valid_mask?(*masks, /\?/)
38
+ masks.flatten.sample.gsub(/\?/) { LETTERS.sample }
39
+ end
40
+ rescue
41
+ return false
42
+ end
43
+ end
44
+
45
+ def self.alphanumerify(masks)
46
+ letterify(numerify(masks))
47
+ end
48
+
49
+ # Load all constants.
50
+ Dir["#{BASE_LIB_PATH}/data_maker/**/*.rb"].sort.each do |f|
51
+ require f
52
+ end
53
+
54
+ def self.valid_mask?(*masks, match_with)
55
+ masks.each do |mask|
56
+ unless mask.match(match_with)
57
+ raise ArgumentError, "You must pass a #{match_with} sign sir!"
58
+ end
59
+ end
60
+ end
61
+
62
+ private_class_method :valid_mask?
63
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe DataMaker::China::PhoneNumber do
4
+ let(:phone_number) { described_class }
5
+
6
+ describe "#self.mobile" do
7
+ it "generates a valid mobile number" do
8
+ number = phone_number.mobile
9
+ validate = DataMaker::Validators::ChinesePhoneNumber.new(number)
10
+ expect(validate.valid?).to be_truthy
11
+ end
12
+ end
13
+
14
+ describe "#self.landline" do
15
+ end
16
+
17
+ describe "::GeneratePhoneNumber" do
18
+ let(:generate_phone_number) { described_class::PhoneNumberGenerator.new(format) }
19
+ let(:format) { ["mobile", "landline"].sample }
20
+
21
+ describe "#mobile_prefix" do
22
+ let(:mobile_prefix) { generate_phone_number.mobile_prefix }
23
+
24
+ # context "when MobilePhonePrefix.empty? is true" do
25
+ # before :each do
26
+ # end
27
+
28
+ # it "raises an error" do
29
+ # expect { mobile_prefix }.to raise_error
30
+ # end
31
+ # end
32
+
33
+ context "when MobilePhonePrefix.empty? is false" do
34
+ it "returns a sample" do
35
+ expect(mobile_prefix).to_not be_empty
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "#generate_number" do
41
+ let(:generate) { generate_phone_number.generate }
42
+
43
+ it "generates a valid phone number" do
44
+ number = generate
45
+ validate = DataMaker::Validators::ChinesePhoneNumber.new(number)
46
+ expect(validate.valid?).to be_truthy
47
+ end
48
+
49
+ context "when format is mobile" do
50
+ let(:format) { "mobile" }
51
+
52
+ it "generates an 11 digit number" do
53
+ expect(generate.length).to eq(11)
54
+ end
55
+ end
56
+
57
+ context "when format is landline" do
58
+ let(:format) { "landline" }
59
+
60
+ context "when eleven_digit_rule? is true" do
61
+ before :each do
62
+ allow(generate_phone_number).to receive(:eleven_digit_rule?).and_return(true)
63
+ end
64
+
65
+ it "generates an 11 digit number" do
66
+ expect(generate.length).to eq(11)
67
+ end
68
+ end
69
+
70
+ context "when eleven_digit_rule? is false" do
71
+ before :each do
72
+ allow(generate_phone_number).to receive(:eleven_digit_rule?).and_return(false)
73
+ end
74
+
75
+ it "generates an 10 digit number" do
76
+ expect(generate.length).to eq(10)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe DataMaker do
4
+ let(:masks) { value }
5
+
6
+ describe "#VERSION" do
7
+ # For each iteration of a version this would always get changed.
8
+ let(:current_version) { "2.0.0" }
9
+
10
+ it { expect(described_class).to be_const_defined(:VERSION) }
11
+ it { expect(described_class::VERSION).to eq(current_version) }
12
+ end
13
+
14
+ describe "#self.hexify" do
15
+ let(:regex) { /\b[a-zA-Z0-9]{3}\b/ }
16
+
17
+ context "when valid_masks? is true" do
18
+ let(:value) { "### hello ###" }
19
+
20
+ it "returns a hexed value" do
21
+ expect(described_class.hexify(*masks)).to match(regex)
22
+ end
23
+
24
+ context "when passed an array value" do
25
+ let(:value) { ["hello ###", "my ### is ###"] }
26
+
27
+ it "returns a hexed value" do
28
+ expect(described_class.hexify(*masks)).to match(regex)
29
+ end
30
+ end
31
+ end
32
+
33
+ context "when valid_masks? raises an error" do
34
+ let(:value) { "hello my name is banana" }
35
+
36
+ it "returns false" do
37
+ expect(described_class.hexify(*masks)).to be_falsey
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#self.numerify" do
43
+ let(:regex) { /\b[0-9]{3}\b/ }
44
+
45
+ context "when valid_masks? is true" do
46
+ let(:value) { "my phone number is ###" }
47
+
48
+ it "returns a numeric value" do
49
+ expect(described_class.numerify(*masks)).to match(regex)
50
+ end
51
+
52
+ context "when passed an array value" do
53
+ let(:value) { ["my phone number is ###", "unit no. ###"] }
54
+
55
+ it "returns a numeric value" do
56
+ expect(described_class.numerify(*masks)).to match(regex)
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when valid_masks? raises an error" do
62
+ let(:value) { ["my phone number is 3333", "unit no. seven"] }
63
+
64
+ it "returns false" do
65
+ expect(described_class.numerify(*masks)).to be_falsey
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#self.letterify" do
71
+ let(:regex) { /\b[a-z]{3}\b/ }
72
+
73
+ context "when valid_masks? is true" do
74
+ let(:value) { "convert me to letters ???" }
75
+
76
+ it "returns alphabetic characters" do
77
+ expect(described_class.letterify(*masks)).to match(regex)
78
+ end
79
+
80
+ context "when passed an array value" do
81
+ let(:value) { ["convert me ???", "me too ???"] }
82
+
83
+ it "returns alphabetic characters" do
84
+ expect(described_class.letterify(*masks)).to match(regex)
85
+ end
86
+ end
87
+ end
88
+
89
+ context "when valid_masks? raises an error" do
90
+ let(:value) { "convert me to letters ###" }
91
+
92
+ it "returns false" do
93
+ expect(described_class.letterify(*masks)).to be_falsey
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "#self.alphanumerify" do
99
+ let(:regex) { /\b[a-zA-Z0-9]{3}\b/ }
100
+
101
+ context "when valid_masks? is true" do
102
+ let(:value) { "alphanumerify me ##?" }
103
+
104
+ it "returns alphanumeric characters" do
105
+ expect(described_class.alphanumerify(*masks)).to match(regex)
106
+ end
107
+ end
108
+
109
+ context "when valid_masks? raises an error" do
110
+ let(:value) { "I am not correct" }
111
+
112
+ it "returns false" do
113
+ expect(described_class.alphanumerify(*masks)).to be_falsey
114
+ end
115
+ end
116
+ end
117
+
118
+ # PRIVATE
119
+ describe "#valid_mask?" do
120
+ context "if mask.match(match_with) is not nil" do
121
+ let(:masks) { ["Apt. #" "##", "Banana Street No. ###"] }
122
+ let(:match_with) { /#/ }
123
+
124
+ it "returns true" do
125
+ expect(described_class.send(:valid_mask?, *masks, match_with)).to be_truthy
126
+ end
127
+ end
128
+
129
+ context "if mask is not equal to '#'" do
130
+ let(:masks) { ["###", "#" "abc @", "!"] }
131
+ let(:match_with) { /\?/ }
132
+
133
+ it "raises an error" do
134
+ expect { described_class.send(:valid_mask?, *masks, match_with) }.to raise_error
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,42 @@
1
+ module RSpec
2
+ module Matchers
3
+ def have_valid_chinese_mobile
4
+
5
+ end
6
+
7
+ def have_valid_chinese_landline
8
+
9
+ end
10
+
11
+ class PhoneNumberMatcher
12
+ def initialize(phone_number)
13
+ self.phone_number = phone_number
14
+ end
15
+
16
+ def matches?(actual)
17
+
18
+ end
19
+
20
+ def description
21
+
22
+ end
23
+
24
+ def failure_message
25
+
26
+ end
27
+
28
+ def failure_message_when_negated
29
+
30
+ end
31
+
32
+ protected
33
+
34
+ def actual=(actual)
35
+ self.actual = actual
36
+ end
37
+
38
+ attr_reader :actual
39
+ attr_accessor :phone_number, :validator
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe DataMaker::ArrayUtilities do
4
+ let(:array_utilities) { described_class }
5
+
6
+ describe "#self.const_array" do
7
+ let(:self_const_array) { array_utilities.const_array(argument) }
8
+ let(:argument) { ["a".."z"] }
9
+
10
+ context "when the object is not an array" do
11
+ let(:argument) { "a".."z" }
12
+
13
+ it "converts it to an array" do
14
+ expect(self_const_array).to be_a(Array)
15
+ end
16
+ end
17
+
18
+ it "freezes the array" do
19
+ array = self_const_array
20
+ expect(array.frozen?).to be_truthy
21
+ end
22
+
23
+ it "freezes the array elements" do
24
+ array = self_const_array
25
+ array.each do |a|
26
+ expect(a.frozen?).to be_truthy
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#self.random_pick" do
32
+ let(:random_pick) { array_utilities.random_pick(array, n) }
33
+ let(:array) { [*"a".."z"] }
34
+ let(:elements) { Set.new("a".."z") }
35
+ let(:n) { rand(1..5) }
36
+
37
+ it "randomly picks n number of elements" do
38
+ rand(1000..9999).times do
39
+ randomly_picked_elements = random_pick
40
+ expect(randomly_picked_elements.length).to eq(n)
41
+ end
42
+ end
43
+
44
+ it "randomly picks elements in the specified array" do
45
+ randomly_picked_elements = random_pick
46
+ rand(1000..9999).times do
47
+ randomly_picked_elements.each do |element|
48
+ expect(elements).to include(element)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#self.freeze_all" do
55
+ let(:freeze_all) { array_utilities.freeze_all(array) }
56
+ let(:array) { [*"a".."z"] }
57
+
58
+ it "freezes the array" do
59
+ array = freeze_all
60
+ expect(array.frozen?).to be_truthy
61
+ end
62
+
63
+ it "freezes the array elements" do
64
+ array = freeze_all
65
+ array.each do |a|
66
+ expect(a.frozen?).to be_truthy
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "#self.shuffle" do
72
+ let(:shuffle) { array_utilities.shuffle(array) }
73
+ let(:array) { [*"a".."z"] }
74
+ let(:elements) { Set.new("a".."z") }
75
+
76
+ it "shuffles the array" do
77
+ different_sort = 0
78
+ rand(1000..9999).times do
79
+ shuffled_array = shuffle
80
+ different_sort += 1 if shuffled_array != array
81
+ end
82
+ expect(different_sort).to satisfy { |value| value > 0 }
83
+ end
84
+
85
+ it "shuffles the array without adding/removing elements" do
86
+ rand(1000..9999).times do
87
+ shuffled_array = shuffle
88
+ expect(shuffled_array.to_set).to eq(elements)
89
+ end
90
+ end
91
+ end
92
+
93
+ describe "#random_pick" do
94
+ end
95
+
96
+ describe "#freeze_all" do
97
+ end
98
+
99
+ describe "#shuffle" do
100
+ end
101
+ end
@@ -0,0 +1,41 @@
1
+ require 'rspec'
2
+ require 'simplecov'
3
+ require 'coveralls'
4
+
5
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
+ SimpleCov::Formatter::HTMLFormatter,
7
+ Coveralls::SimpleCov::Formatter
8
+ ]
9
+
10
+ SimpleCov.start
11
+
12
+ Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
13
+
14
+ RSpec.configure do |config|
15
+ config.expect_with :rspec do |expectations|
16
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
17
+ end
18
+
19
+ config.mock_with :rspec do |mocks|
20
+ mocks.verify_partial_doubles = true
21
+ end
22
+
23
+ begin
24
+ config.filter_run :focus
25
+ config.run_all_when_everything_filtered = true
26
+
27
+ config.disable_monkey_patching!
28
+
29
+ config.warnings = false
30
+
31
+ if config.files_to_run.one?
32
+ config.default_formatter = 'doc'
33
+ end
34
+
35
+ config.profile_examples = 10
36
+
37
+ config.order = :random
38
+
39
+ Kernel.srand config.seed
40
+ end
41
+ end