@@ -23,23 +23,127 @@ def timetravel(date, i, method); i > 0 ? timetravel(date.send(method.to_sym), i
23
23
def convert_mock_values ( mock_data )
24
24
mock_data . map do |entry |
25
25
entry . each do |key , value |
26
- entry [ key ] = case value
27
- when /today/
28
- Date . today . to_s
29
- when /yesterday/
30
- Date . today . prev_day . to_s
31
- when /\s *\d +\s +month(s)?\s +ago\s */
32
- number_of_months = value . match ( /\d +/ ) [ 0 ] . to_i
33
- timetravel ( Date . today , number_of_months , :prev_month ) . to_s
34
- when /\s *\d +\s +day(s)?\s +ago\s */
35
- number_of_days = value . match ( /\d +/ ) [ 0 ] . to_i
36
- timetravel ( Date . today , number_of_days , :prev_day ) . to_s
37
- else
38
- value
39
- end
26
+ # Examples of valid values; all examples assume that today is 30th July 2017
27
+ #
28
+ # 1 month ago
29
+ # => '2017-06-30'
30
+ #
31
+ # 40 days ago (as month)
32
+ # => '6'
33
+ #
34
+ # 2 years ago (as year)
35
+ # => '2015'
36
+ #
37
+ # beginning of last month
38
+ # => '2017-06-01'
39
+ #
40
+ # end of last year
41
+ # => '2016-12-31'
42
+ #
43
+ # today (as custom '%Y-%m')
44
+ # => '2017-07'
45
+ #
46
+ entry [ key ] = convert_mock_value ( value )
40
47
end
41
48
end
42
49
end
50
+
51
+ def convert_mock_value ( value )
52
+ value_parser_regexp = /\s *((?<modifier>(beginning|end))\s +of\s +(?<modifier_base>day|month|year))?\s *(?<placeholder>[^\( \) ]+)\s *(\( as (?<format>day|month|year|(custom '[^']+'))\) )?\s */
53
+
54
+ parsed_value = value . match ( value_parser_regexp )
55
+ placeholder = parsed_value [ :placeholder ]
56
+ format = parsed_value [ :format ]
57
+ modifier = parsed_value [ :modifier ]
58
+ modifier_base = parsed_value [ :modifier_base ]
59
+
60
+ new_value = case placeholder
61
+ when /today/
62
+ Date . today
63
+ when /yesterday/
64
+ timetravel ( Date . today , 1 , :prev_day )
65
+ when /tomorrow/
66
+ timetravel ( Date . today , 1 , :next_day )
67
+ when /last month/
68
+ timetravel ( Date . today , 1 , :prev_month )
69
+ when /next month/
70
+ timetravel ( Date . today , 1 , :next_month )
71
+ when /last year/
72
+ timetravel ( Date . today , 1 , :prev_year )
73
+ when /next year/
74
+ timetravel ( Date . today , 1 , :next_year )
75
+ when /\s *\d +\s +month(s)?\s +ago\s *?/
76
+ number_of_months = value . match ( /\d +/ ) [ 0 ] . to_i
77
+ timetravel ( Date . today , number_of_months , :prev_month )
78
+ when /\s *\d +\s +day(s)?\s +ago\s */
79
+ number_of_days = value . match ( /\d +/ ) [ 0 ] . to_i
80
+ timetravel ( Date . today , number_of_days , :prev_day )
81
+ when /\s *\d +\s +year(s)?\s +ago\s */
82
+ number_of_years = value . match ( /\d +/ ) [ 0 ] . to_i
83
+ timetravel ( Date . today , number_of_years , :prev_year )
84
+ when /\s *\d +\s +month(s)?\s +from now\s *?/
85
+ number_of_months = value . match ( /\d +/ ) [ 0 ] . to_i
86
+ timetravel ( Date . today , number_of_months , :next_month )
87
+ when /\s *\d +\s +day(s)?\s +from now\s */
88
+ number_of_days = value . match ( /\d +/ ) [ 0 ] . to_i
89
+ timetravel ( Date . today , number_of_days , :next_day )
90
+ when /\s *\d +\s +year(s)?\s +from now\s */
91
+ number_of_years = value . match ( /\d +/ ) [ 0 ] . to_i
92
+ timetravel ( Date . today , number_of_years , :next_year )
93
+ else
94
+ placeholder
95
+ end
96
+
97
+ if new_value . is_a? ( Date )
98
+ modified_new_value = case modifier
99
+ when nil
100
+ new_value
101
+ when 'beginning'
102
+ case modifier_base
103
+ when 'day'
104
+ new_value
105
+ when 'month'
106
+ Date . new ( new_value . year , new_value . month , 1 )
107
+ when 'year'
108
+ Date . new ( new_value . year , 1 , 1 )
109
+ else
110
+ raise "Invalid date modifier provided: #{ modifier } #{ modifier_base } "
111
+ end
112
+ when 'end'
113
+ case modifier_base
114
+ when 'day'
115
+ new_value
116
+ when 'month'
117
+ Date . new ( new_value . next_month . year , new_value . next_month . month , 1 ) . prev_day
118
+ when 'year'
119
+ Date . new ( new_value . next_year . year , 1 , 1 ) . prev_day
120
+ else
121
+ raise "Invalid date modifier provided: #{ modifier } #{ modifier_base } "
122
+ end
123
+ else
124
+ raise "Invalid date modifier provided: #{ modifier } #{ modifier_base } "
125
+ end
126
+
127
+ formatted_new_value = case format
128
+ when nil
129
+ puts "NO FORMAT"
130
+ modified_new_value . to_s
131
+ when 'day' , 'month' , 'year'
132
+ modified_new_value . send ( format . to_sym )
133
+ when /custom '[^']+'/
134
+ parsed_format = format . match ( /custom '(?<format_string>[^']+)'/ )
135
+ modified_new_value . strftime ( parsed_format [ :format_string ] )
136
+ else
137
+ raise "Invalid date format provided: #{ format } "
138
+ end
139
+
140
+ formatted_new_value
141
+ else
142
+ new_value
143
+ end
144
+ end
43
145
end
44
146
45
- World ( MatcherHelpers )
147
+ if defined? ( World )
148
+ World ( MatcherHelpers )
149
+ end
0 commit comments