@@ -23,23 +23,127 @@ def timetravel(date, i, method); i > 0 ? timetravel(date.send(method.to_sym), i
2323 def convert_mock_values ( mock_data )
2424 mock_data . map do |entry |
2525 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 )
4047 end
4148 end
4249 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
43145end
44146
45- World ( MatcherHelpers )
147+ if defined? ( World )
148+ World ( MatcherHelpers )
149+ end
0 commit comments