phpf 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +25 -0
- data/Rakefile.rb +3 -36
- data/lib/phpf.rb +5 -30
- data/lib/phpf/constants.rb +12 -0
- data/lib/phpf/evaluation.rb +6 -22
- data/lib/phpf/tokenizing.rb +4 -4
- data/lib/phpf/translations.rb +26 -34
- data/phpf.gemspec +12 -0
- data/spec/phpf_spec.rb +76 -0
- metadata +33 -39
- data/COPYING.txt +0 -22
- data/README.html +0 -61
- data/lib/phpf/tests.rb +0 -93
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# phpf
|
2
|
+
|
3
|
+
A Ruby port of [PHP's date function](http://www.php.net/date)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```
|
8
|
+
$ gem install phpf
|
9
|
+
```
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Either use the `Time#phpf` method or the `Kernel#date` method, for example:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
require 'phpf'
|
17
|
+
|
18
|
+
time = Time.parse('1/1/2008 12:34:56')
|
19
|
+
|
20
|
+
time.phpf('jS F Y H:i') # => "1st January 2008 12:34"
|
21
|
+
|
22
|
+
time.to_i # => 1199190896
|
23
|
+
|
24
|
+
date('jS F Y H:i', 1199190896) # => "1st January 2008 12:34"
|
25
|
+
```
|
data/Rakefile.rb
CHANGED
@@ -1,40 +1,7 @@
|
|
1
|
-
require 'rake'
|
2
1
|
require 'rake/testtask'
|
3
|
-
require 'rake/gempackagetask'
|
4
2
|
|
3
|
+
task :default => :spec
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
s.version = '1.0.0'
|
9
|
-
s.platform = Gem::Platform::RUBY
|
10
|
-
s.has_rdoc = false
|
11
|
-
s.summary = "Port of PHP's date function."
|
12
|
-
s.description = s.summary
|
13
|
-
s.author = 'Tim Fletcher'
|
14
|
-
s.email = 'twoggle@gmail.com'
|
15
|
-
s.homepage = 'http://phpf.rubyforge.org/'
|
16
|
-
s.files = Dir.glob('lib/**/*') + %w( COPYING.txt Rakefile.rb README.html )
|
17
|
-
s.require_paths = ['lib']
|
5
|
+
Rake::TestTask.new(:spec) do |t|
|
6
|
+
t.test_files = FileList['spec/*_spec.rb']
|
18
7
|
end
|
19
|
-
|
20
|
-
Rake::GemPackageTask.new(GEMSPEC) { }
|
21
|
-
|
22
|
-
Rake::PackageTask.new(GEMSPEC.name, GEMSPEC.version) do |p|
|
23
|
-
p.need_tar_gz = true
|
24
|
-
p.package_files.include GEMSPEC.files
|
25
|
-
end
|
26
|
-
|
27
|
-
desc 'Run all the tests'
|
28
|
-
task :test do
|
29
|
-
if ARGV.length == 2 && ARGV.last =~ /SYM=(.)/
|
30
|
-
TEST_SYMBOL = $1.to_sym
|
31
|
-
end
|
32
|
-
require 'test/unit'
|
33
|
-
Test::Unit.run = false
|
34
|
-
$:.unshift 'lib'
|
35
|
-
require 'phpf/tests'
|
36
|
-
Test::Unit::AutoRunner.run
|
37
|
-
$SKIPPED_PHP_CHECKS.each do |format, version|
|
38
|
-
puts "- skipped check for %s (requires PHP %s)" % [format, version]
|
39
|
-
end
|
40
|
-
end
|
data/lib/phpf.rb
CHANGED
@@ -1,42 +1,17 @@
|
|
1
1
|
require 'phpf/tokenizing'
|
2
2
|
require 'phpf/evaluation'
|
3
3
|
require 'phpf/translations'
|
4
|
+
require 'phpf/constants'
|
4
5
|
require 'time'
|
5
6
|
|
6
|
-
module PHPF
|
7
|
-
def self.format(string)
|
8
|
-
Symbol === string ? StandardFormats.const_get(string.to_s.upcase) : string
|
9
|
-
end
|
10
|
-
|
11
|
-
# cf. http://uk3.php.net/manual/en/ref.datetime.php#datetime.constants
|
12
|
-
#
|
13
|
-
# DATE_RFC822/DATE_COOKIE/DATE_RFC1123/DATE_RSS, DATE_ISO8601,
|
14
|
-
# and DATE_RFC2822 all have equivalent Ruby methods.
|
15
|
-
#
|
16
|
-
module StandardFormats
|
17
|
-
RFC850, RFC1036 = "l, d-M-y H:i:s T".freeze
|
18
|
-
|
19
|
-
RFC3339, W3C, ATOM = "Y-m-d\TH:i:sP".freeze
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
7
|
class Time
|
24
|
-
def
|
25
|
-
|
26
|
-
end
|
27
|
-
def phpf(string)
|
28
|
-
PHPF.evaluate(PHPF.tokenize(PHPF.format(string)), self).join
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Integer
|
33
|
-
def to_time
|
34
|
-
Time.epoch + self
|
8
|
+
def phpf(format_string)
|
9
|
+
PHPF.evaluate(PHPF.tokenize(format_string), self).join
|
35
10
|
end
|
36
11
|
end
|
37
12
|
|
38
13
|
module Kernel
|
39
14
|
def date(format_string, time = Time.now)
|
40
|
-
time.to_i.
|
15
|
+
Time.at(time.to_i).phpf(format_string)
|
41
16
|
end
|
42
|
-
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module PHPF
|
2
|
+
# cf. http://php.net/manual/en/class.datetime.php#datetime.constants.types
|
3
|
+
#
|
4
|
+
# DATE_RFC822/DATE_COOKIE/DATE_RFC1123/DATE_RSS, DATE_ISO8601,
|
5
|
+
# and DATE_RFC2822 all have equivalent Ruby methods.
|
6
|
+
|
7
|
+
RFC850 = "l, d-M-y H:i:s T".freeze
|
8
|
+
|
9
|
+
RFC1036 = "D, d M y H:i:s O".freeze
|
10
|
+
|
11
|
+
RFC3339, W3C, ATOM = "Y-m-d\TH:i:sP".freeze
|
12
|
+
end
|
data/lib/phpf/evaluation.rb
CHANGED
@@ -6,15 +6,11 @@ module PHPF
|
|
6
6
|
end
|
7
7
|
|
8
8
|
private
|
9
|
-
|
9
|
+
|
10
10
|
def self.translate(symbol, &rule)
|
11
11
|
translations[@last_symbol = symbol] = rule
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.only(php_version)
|
15
|
-
php_version_requirements[@last_symbol] = php_version
|
16
|
-
end
|
17
|
-
|
18
14
|
def self.test(time_string, expected_output)
|
19
15
|
test_cases[@last_symbol] << [time_string, expected_output]
|
20
16
|
end
|
@@ -31,25 +27,13 @@ module PHPF
|
|
31
27
|
@test_cases ||= Hash.new { |h, k| h[k] = [] }
|
32
28
|
end
|
33
29
|
|
34
|
-
def self.php_version_requirements
|
35
|
-
@php_version_requirements ||= {}
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.epoch
|
39
|
-
'1st Jan 1970 00:00:00 UTC'
|
40
|
-
end
|
41
|
-
|
42
30
|
def self.ordinal(n)
|
43
31
|
return 'th' if (11..13).include?(n % 100)
|
44
32
|
case n % 10
|
45
|
-
when 1
|
46
|
-
when 2
|
47
|
-
when 3
|
48
|
-
else
|
33
|
+
when 1 then 'st'
|
34
|
+
when 2 then 'nd'
|
35
|
+
when 3 then 'rd'
|
36
|
+
else 'th'
|
49
37
|
end
|
50
38
|
end
|
51
|
-
|
52
|
-
def self.date(time)
|
53
|
-
Date.new(time.year, time.month, time.mday)
|
54
|
-
end
|
55
|
-
end
|
39
|
+
end
|
data/lib/phpf/tokenizing.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module PHPF
|
2
2
|
FormatCharacters = 'dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU'
|
3
|
-
|
3
|
+
|
4
4
|
def self.tokenize(format_string)
|
5
5
|
tokens = []
|
6
6
|
until format_string.empty?
|
@@ -20,13 +20,13 @@ module PHPF
|
|
20
20
|
end
|
21
21
|
return tokens
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def self.untokenize(tokens)
|
25
25
|
tokens.map { |token| untok(token, token.to_s) }.join
|
26
26
|
end
|
27
27
|
|
28
28
|
private
|
29
|
-
|
29
|
+
|
30
30
|
def self.untok(token, string)
|
31
31
|
if Symbol === token
|
32
32
|
return string
|
@@ -34,4 +34,4 @@ module PHPF
|
|
34
34
|
FormatCharacters.include?(string) ? '\\' + string : string
|
35
35
|
end
|
36
36
|
end
|
37
|
-
end
|
37
|
+
end
|
data/lib/phpf/translations.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
|
-
|
4
|
-
#
|
5
|
-
module PHPF
|
6
|
-
|
3
|
+
module PHPF
|
7
4
|
# d: Day of the month, 2 digits with leading zeros (e.g. 01 to 31)
|
8
5
|
#
|
9
6
|
translate(:d) { '%02d' % mday }
|
10
7
|
test '1st', '01'
|
11
8
|
test '23rd', '23'
|
12
|
-
|
9
|
+
|
13
10
|
# D: A textual representation of a day, three letters (e.g. Mon through Sun)
|
14
11
|
#
|
15
12
|
translate(:D) { Time::RFC2822_DAY_NAME[wday] }
|
@@ -20,7 +17,7 @@ module PHPF
|
|
20
17
|
translate(:j) { mday }
|
21
18
|
test '1st', '1'
|
22
19
|
test '23rd', '23'
|
23
|
-
|
20
|
+
|
24
21
|
# l: A full textual representation of the day of the week
|
25
22
|
# e.g. Sunday through Saturday
|
26
23
|
#
|
@@ -30,11 +27,10 @@ module PHPF
|
|
30
27
|
# N: ISO-8601 numeric representation of the day of the week
|
31
28
|
# e.g. 1 [for Monday] through 7 [for Sunday]
|
32
29
|
#
|
33
|
-
translate(:N) { |time|
|
34
|
-
only '5.1.0'
|
30
|
+
translate(:N) { |time| time.to_date.cwday }
|
35
31
|
test '9th Dec 2007', '7'
|
36
32
|
test '10th Dec 2007', '1'
|
37
|
-
|
33
|
+
|
38
34
|
# S: English ordinal suffix for the day of the month
|
39
35
|
# e.g. st, nd, rd or th
|
40
36
|
#
|
@@ -43,14 +39,14 @@ module PHPF
|
|
43
39
|
test '2nd', 'nd'
|
44
40
|
test '3rd', 'rd'
|
45
41
|
test '4th', 'th'
|
46
|
-
|
42
|
+
|
47
43
|
# w: Numeric representation of the day of the week
|
48
44
|
# e.g. 0 [for Sunday] through 6 [for Saturday]
|
49
45
|
#
|
50
46
|
translate(:w) { wday }
|
51
47
|
test '9th Dec 2007', '0'
|
52
48
|
test '10th Dec 2007', '1'
|
53
|
-
|
49
|
+
|
54
50
|
# z: The day of the year (starting from 0)
|
55
51
|
# e.g. 0 through 365
|
56
52
|
#
|
@@ -58,11 +54,11 @@ module PHPF
|
|
58
54
|
test '1st Jan 2007', '0'
|
59
55
|
test '31st Dec 2007', '364'
|
60
56
|
test '31st Dec 2008', '365'
|
61
|
-
|
57
|
+
|
62
58
|
# W: ISO-8601 week number of year, weeks starting on Monday
|
63
59
|
# e.g. 42 [for the 42nd week in the year]
|
64
60
|
#
|
65
|
-
translate(:W) { |time| '%02d' %
|
61
|
+
translate(:W) { |time| '%02d' % time.to_date.cweek }
|
66
62
|
test '24th Dec 2007 12:00', '52'
|
67
63
|
test '31st Dec 2007 12:00', '01'
|
68
64
|
test ' 1st Jan 2008 12:00', '01'
|
@@ -73,47 +69,46 @@ module PHPF
|
|
73
69
|
translate(:F) { strftime('%B') }
|
74
70
|
test 'Jan', 'January'
|
75
71
|
test 'Dec', 'December'
|
76
|
-
|
72
|
+
|
77
73
|
# m: Numeric representation of a month, with leading zeros
|
78
74
|
# e.g. 01 through 12
|
79
75
|
#
|
80
76
|
translate(:m) { '%02d' % month }
|
81
77
|
test 'Jan', '01'
|
82
78
|
test 'Dec', '12'
|
83
|
-
|
79
|
+
|
84
80
|
# M: A short textual representation of a month
|
85
81
|
# e.g. Jan through Dec
|
86
82
|
#
|
87
83
|
translate(:M) { Time::RFC2822_MONTH_NAME[month - 1] }
|
88
84
|
test 'Jan', 'Jan'
|
89
85
|
test 'Dec', 'Dec'
|
90
|
-
|
86
|
+
|
91
87
|
# n: Numeric representation of a month, without leading zeros
|
92
88
|
# e.g. 1 through 12
|
93
89
|
#
|
94
90
|
translate(:n) { month }
|
95
91
|
test 'Jan', '1'
|
96
92
|
test 'Dec', '12'
|
97
|
-
|
93
|
+
|
98
94
|
# t: Number of days in the given month (28 through 31)
|
99
95
|
#
|
100
|
-
translate(:t) { |time| ((
|
96
|
+
translate(:t) { |time| ((time.to_date >> 1) - time.mday).day }
|
101
97
|
test 'Jan 2007', '31'
|
102
98
|
test 'Feb 2007', '28'
|
103
99
|
test 'Feb 2008', '29'
|
104
|
-
|
100
|
+
|
105
101
|
# L: 1 if it is a leap year, 0 otherwise
|
106
102
|
#
|
107
103
|
translate(:L) { Date.leap?(year) ? 1 : 0 }
|
108
104
|
test 'Jan 2007', '0'
|
109
105
|
test 'Jan 2008', '1'
|
110
|
-
|
106
|
+
|
111
107
|
# o: ISO-8601 year number. This has the same value as Y,
|
112
108
|
# except that if the ISO week number (W) belongs to the previous
|
113
109
|
# or next year, that year is used instead.
|
114
110
|
#
|
115
|
-
translate(:o) { |time|
|
116
|
-
only '5.1.0'
|
111
|
+
translate(:o) { |time| time.to_date.cwyear }
|
117
112
|
test '24th Dec 2007 12:00', '2007'
|
118
113
|
test '31st Dec 2007 12:00', '2008'
|
119
114
|
test ' 1st Jan 2008 12:00', '2008'
|
@@ -124,7 +119,7 @@ module PHPF
|
|
124
119
|
#
|
125
120
|
translate(:Y) { year }
|
126
121
|
test 'Jan 1999', '1999'
|
127
|
-
|
122
|
+
|
128
123
|
# y: A two digit representation of a year
|
129
124
|
# e.g. 99 or 03
|
130
125
|
#
|
@@ -136,7 +131,7 @@ module PHPF
|
|
136
131
|
translate(:a) { strftime('%p').downcase }
|
137
132
|
test '00:42', 'am'
|
138
133
|
test '12:42', 'pm'
|
139
|
-
|
134
|
+
|
140
135
|
# A: Uppercase Ante meridiem and Post meridiem (AM or PM)
|
141
136
|
#
|
142
137
|
translate(:A) { strftime('%p') }
|
@@ -148,7 +143,7 @@ module PHPF
|
|
148
143
|
#
|
149
144
|
translate(:B) { '%03d' % (((utc.to_i + 3600) % 86400) / 86.4) }
|
150
145
|
test '1st Jan 2008 00:00:00 UTC', '041'
|
151
|
-
|
146
|
+
|
152
147
|
# g: 12-hour format of an hour without leading zeros (1 through 12)
|
153
148
|
#
|
154
149
|
translate(:g) { strftime('%I').to_i }
|
@@ -164,7 +159,7 @@ module PHPF
|
|
164
159
|
test '06:42', '6'
|
165
160
|
test '12:42', '12'
|
166
161
|
test '18:42', '18'
|
167
|
-
|
162
|
+
|
168
163
|
# h: 12-hour format of an hour with leading zeros (01 through 12)
|
169
164
|
#
|
170
165
|
translate(:h) { strftime('%I') }
|
@@ -203,11 +198,10 @@ module PHPF
|
|
203
198
|
#
|
204
199
|
# translate(:O) { '+%03d00' % (gmt_offset / 3600) }
|
205
200
|
# TODO
|
206
|
-
|
201
|
+
|
207
202
|
# P: Difference to Greenwich time (GMT) with colon between hours and minutes
|
208
203
|
# e.g. +02:00
|
209
204
|
#
|
210
|
-
# only '5.1.3'
|
211
205
|
# TODO
|
212
206
|
|
213
207
|
# T: Timezone abbreviation
|
@@ -220,12 +214,11 @@ module PHPF
|
|
220
214
|
# e.g. -43200 through 50400
|
221
215
|
#
|
222
216
|
# TODO
|
223
|
-
|
217
|
+
|
224
218
|
# c: ISO 8601 date
|
225
219
|
# e.g. 2004-02-12T15:19:21+00:00
|
226
220
|
#
|
227
221
|
translate(:c) { iso8601.sub(/Z$/, '+00:00') }
|
228
|
-
only '5'
|
229
222
|
test '1st Jan 2008 00:00:00 UTC', '2008-01-01T00:00:00+00:00'
|
230
223
|
test '1st Jan 2008 12:34:56 PST', '2008-01-01T20:34:56+00:00'
|
231
224
|
|
@@ -233,12 +226,11 @@ module PHPF
|
|
233
226
|
# e.g. Thu, 21 Dec 2000 16:01:07 +0200
|
234
227
|
#
|
235
228
|
translate(:r) { rfc2822 }
|
236
|
-
test '1st Jan 2008 00:00:00 GMT', 'Tue, 01 Jan 2008 00:00:00 +0000'
|
229
|
+
test '1st Jan 2008 00:00:00 GMT', 'Tue, 01 Jan 2008 00:00:00 +0000'
|
237
230
|
|
238
231
|
# U: Seconds since the Unix Epoch
|
239
232
|
#
|
240
233
|
translate(:U) { to_i }
|
241
|
-
test
|
234
|
+
test '1st Jan 1970 00:00:00 UTC', '0'
|
242
235
|
test '1st Jan 2008 00:00:00 UTC', '1199145600'
|
243
|
-
|
244
|
-
end
|
236
|
+
end
|
data/phpf.gemspec
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'phpf'
|
3
|
+
s.version = '1.1.0'
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.authors = ['Tim Fletcher']
|
6
|
+
s.email = ['mail@tfletcher.com']
|
7
|
+
s.homepage = 'http://github.com/tim/ruby-phpf'
|
8
|
+
s.description = 'A Ruby port of the PHP date function'
|
9
|
+
s.summary = s.description
|
10
|
+
s.files = Dir.glob('{lib,spec}/**/*') + %w(README.md Rakefile.rb phpf.gemspec)
|
11
|
+
s.require_path = 'lib'
|
12
|
+
end
|
data/spec/phpf_spec.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
|
5
|
+
require 'phpf'
|
6
|
+
|
7
|
+
class PhpShell
|
8
|
+
def initialize
|
9
|
+
@pipe = IO.popen('php -a', 'w+').tap do |pipe|
|
10
|
+
pipe.gets
|
11
|
+
pipe.gets
|
12
|
+
pipe.puts('date_default_timezone_set("Europe/London");')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def echo(expression)
|
17
|
+
@pipe.puts("echo #{expression};")
|
18
|
+
@pipe.gets.chomp
|
19
|
+
end
|
20
|
+
|
21
|
+
def close
|
22
|
+
@pipe.close
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module PHPF
|
27
|
+
def self.each_test_case
|
28
|
+
test_cases.each do |format_character, test_cases|
|
29
|
+
test_cases.each { |array| yield format_character, *array }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'Time' do
|
35
|
+
describe 'phpf method' do
|
36
|
+
it 'formats the time like the examples in the php documentation' do
|
37
|
+
# cf. http://php.net/date (Example #4)
|
38
|
+
|
39
|
+
time = Time.parse('March 10th, 2001, 5:16:18 pm')
|
40
|
+
|
41
|
+
time.phpf('F j, Y, g:i a').must_equal('March 10, 2001, 5:16 pm')
|
42
|
+
time.phpf('m.d.y').must_equal('03.10.01')
|
43
|
+
time.phpf('j, n, Y').must_equal('10, 3, 2001')
|
44
|
+
time.phpf('Ymd').must_equal('20010310')
|
45
|
+
time.phpf('h-i-s, j-m-y, it is w Day').must_equal('05-16-18, 10-03-01, 1631 1618 6 Satpm01')
|
46
|
+
time.phpf('\i\t \i\s \t\h\e jS \d\a\y.').must_equal('it is the 10th day.')
|
47
|
+
time.phpf('H:m:s \m \i\s \m\o\n\t\h').must_equal('17:03:18 m is month')
|
48
|
+
time.phpf('H:i:s').must_equal('17:16:18')
|
49
|
+
end
|
50
|
+
|
51
|
+
puts 'Comparing against ' + `php -version`[/(PHP \d+\.\d+\.\d+)/, 1]
|
52
|
+
|
53
|
+
$php_shell = PhpShell.new
|
54
|
+
|
55
|
+
PHPF.each_test_case do |format_character, time_string, expected_output|
|
56
|
+
describe "the #{format_character} format character" do
|
57
|
+
it 'formats the time like php' do
|
58
|
+
time = time_string =~ /\A\d+\z/ ? Time.at(time_string.to_i) : Time.parse(time_string)
|
59
|
+
|
60
|
+
time.phpf(format_character.to_s).must_equal(expected_output)
|
61
|
+
|
62
|
+
output = $php_shell.echo('date(%s, %d)' % [format_character.to_s.inspect, time.to_i])
|
63
|
+
output.must_equal(expected_output)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'Kernel' do
|
71
|
+
describe 'date method' do
|
72
|
+
it 'formats the given integer timestamp according to the given format string' do
|
73
|
+
date('jS F Y', 1350927682).must_equal('22nd October 2012')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,61 +1,55 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: phpf
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Tim Fletcher
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2008-02-14 00:00:00 +00:00
|
13
|
-
default_executable:
|
12
|
+
date: 2012-10-22 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
description: A Ruby port of the PHP date function
|
15
|
+
email:
|
16
|
+
- mail@tfletcher.com
|
18
17
|
executables: []
|
19
|
-
|
20
18
|
extensions: []
|
21
|
-
|
22
19
|
extra_rdoc_files: []
|
23
|
-
|
24
|
-
|
25
|
-
- lib/phpf
|
20
|
+
files:
|
21
|
+
- lib/phpf/constants.rb
|
26
22
|
- lib/phpf/evaluation.rb
|
27
|
-
- lib/phpf/tests.rb
|
28
23
|
- lib/phpf/tokenizing.rb
|
29
24
|
- lib/phpf/translations.rb
|
30
25
|
- lib/phpf.rb
|
31
|
-
-
|
26
|
+
- spec/phpf_spec.rb
|
27
|
+
- README.md
|
32
28
|
- Rakefile.rb
|
33
|
-
-
|
34
|
-
|
35
|
-
|
29
|
+
- phpf.gemspec
|
30
|
+
homepage: http://github.com/tim/ruby-phpf
|
31
|
+
licenses: []
|
36
32
|
post_install_message:
|
37
33
|
rdoc_options: []
|
38
|
-
|
39
|
-
require_paths:
|
34
|
+
require_paths:
|
40
35
|
- lib
|
41
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
53
48
|
requirements: []
|
54
|
-
|
55
49
|
rubyforge_project:
|
56
|
-
rubygems_version: 1.
|
50
|
+
rubygems_version: 1.8.24
|
57
51
|
signing_key:
|
58
|
-
specification_version:
|
59
|
-
summary:
|
52
|
+
specification_version: 3
|
53
|
+
summary: A Ruby port of the PHP date function
|
60
54
|
test_files: []
|
61
|
-
|
55
|
+
has_rdoc:
|
data/COPYING.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2008 Tim Fletcher <tfletcher.com>
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person
|
4
|
-
obtaining a copy of this software and associated documentation
|
5
|
-
files (the "Software"), to deal in the Software without
|
6
|
-
restriction, including without limitation the rights to use,
|
7
|
-
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
-
copies of the Software, and to permit persons to whom the
|
9
|
-
Software is furnished to do so, subject to the following
|
10
|
-
conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be
|
13
|
-
included in all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
-
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
-
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
-
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
-
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.html
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<head>
|
3
|
-
<title>phpf</title>
|
4
|
-
<style type="text/css" media="screen">
|
5
|
-
html {
|
6
|
-
height: 100%;
|
7
|
-
margin-bottom: 1px;
|
8
|
-
}
|
9
|
-
body {
|
10
|
-
margin: 0;
|
11
|
-
padding: 30px;
|
12
|
-
}
|
13
|
-
h1, h2 {
|
14
|
-
font-family: Garamond, Rockwell, serif;
|
15
|
-
}
|
16
|
-
h2 {
|
17
|
-
margin-top: 1.5em;
|
18
|
-
}
|
19
|
-
code {
|
20
|
-
font-family: "Panic Sans", "Bitstream Vera Sans Mono", Consolas, Monaco, monospace;
|
21
|
-
font-size: 11px;
|
22
|
-
}
|
23
|
-
</style>
|
24
|
-
</head>
|
25
|
-
<body>
|
26
|
-
|
27
|
-
|
28
|
-
<h1>phpf <small>1.0.0</small></h1>
|
29
|
-
|
30
|
-
<p>A <a href="http://www.ruby-lang.org/">Ruby</a> port of <a href="http://www.php.net/date">PHP’s date function</a>.</p>
|
31
|
-
|
32
|
-
|
33
|
-
<h2>HOWTO get it</h2>
|
34
|
-
|
35
|
-
<p>Use <a href="http://rubygems.org/">RubyGems</a> (<tt>gem install phpf</tt>),
|
36
|
-
or <a href="http://rubyforge.org/frs/?group_id=5524">download from RubyForge</a>.</p>
|
37
|
-
|
38
|
-
|
39
|
-
<h2>HOWTO use it</h2>
|
40
|
-
|
41
|
-
<p>Either use Time#phpf, or Kernel#date, e.g.</p>
|
42
|
-
|
43
|
-
<pre><code>require 'phpf'
|
44
|
-
|
45
|
-
time = Time.parse('1/1/2008 12:34:56')
|
46
|
-
|
47
|
-
time.phpf('jS F Y H:i') # => "1st January 2008 12:34"
|
48
|
-
|
49
|
-
time.to_i # => 1199190896
|
50
|
-
|
51
|
-
date('jS F Y H:i', 1199190896) # => "1st January 2008 12:34"
|
52
|
-
</code></pre>
|
53
|
-
|
54
|
-
|
55
|
-
<h2>See Also</h2>
|
56
|
-
|
57
|
-
<p><a href="http://simonwillison.net/2003/Oct/7/dateInPython/">PHP’s date() function in Python</a></p>
|
58
|
-
|
59
|
-
|
60
|
-
</body>
|
61
|
-
</html>
|
data/lib/phpf/tests.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'phpf'
|
3
|
-
|
4
|
-
$SKIPPED_PHP_CHECKS = {}
|
5
|
-
|
6
|
-
module PHPF
|
7
|
-
class Tests < Test::Unit::TestCase
|
8
|
-
class VersionString
|
9
|
-
def initialize(string)
|
10
|
-
@string = string.to_s
|
11
|
-
end
|
12
|
-
def to_s
|
13
|
-
@string
|
14
|
-
end
|
15
|
-
def <=>(v)
|
16
|
-
@string.split('.') <=> v.to_s.split('.')
|
17
|
-
end
|
18
|
-
include Comparable
|
19
|
-
end
|
20
|
-
|
21
|
-
unless defined?(PHP)
|
22
|
-
PHP = 'php'
|
23
|
-
end
|
24
|
-
|
25
|
-
PHP_VERSION = begin
|
26
|
-
(output = `#{PHP} -version`).empty? ? nil : VersionString.new(output[/(\d\.\d\.\d)/, 1])
|
27
|
-
end
|
28
|
-
|
29
|
-
def assert_expected_php_output(string, tokens, time)
|
30
|
-
php_code = 'echo date(%p, %d);' % [ PHPF.untokenize(tokens), time.to_i ]
|
31
|
-
php_output = `#{PHP} -r #{php_code.inspect}`
|
32
|
-
|
33
|
-
assert_equal string, php_output, "unexpected PHP output: from %p" % php_code
|
34
|
-
end
|
35
|
-
|
36
|
-
def required_version(tokens)
|
37
|
-
tokens.inject(nil) do |v, token|
|
38
|
-
next v unless token.is_a?(Symbol)
|
39
|
-
next v unless PHPF.php_version_requirements.has_key?(token)
|
40
|
-
version = VersionString.new(PHPF.php_version_requirements[token])
|
41
|
-
v.nil?? version : (v > version ? v : version)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def assert_evaluates_to(string, format, time_string)
|
46
|
-
tokens = case format
|
47
|
-
when String then
|
48
|
-
tokens = PHPF.tokenize(format)
|
49
|
-
assert_equal format, PHPF.untokenize(tokens)
|
50
|
-
tokens
|
51
|
-
when Symbol then [format]
|
52
|
-
when Array then format
|
53
|
-
end
|
54
|
-
|
55
|
-
time = Time.parse(time_string)
|
56
|
-
|
57
|
-
unless PHP_VERSION.nil?
|
58
|
-
if (required_version = required_version(tokens)).nil?
|
59
|
-
assert_expected_php_output string, tokens, time
|
60
|
-
elsif PHP_VERSION >= required_version
|
61
|
-
assert_expected_php_output string, tokens, time
|
62
|
-
else
|
63
|
-
$SKIPPED_PHP_CHECKS[format] = required_version
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
assert_equal string, PHPF.evaluate(tokens, time).to_s
|
68
|
-
end
|
69
|
-
|
70
|
-
PHPF.test_cases.each do |symbol, test_cases|
|
71
|
-
if !defined?(TEST_SYMBOL) || TEST_SYMBOL == symbol
|
72
|
-
define_method("test_evaluate_#{symbol}") do
|
73
|
-
test_cases.each do |(time_string, expected_output)|
|
74
|
-
assert_evaluates_to expected_output, symbol.to_s, time_string
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_php_examples # cf. http://php.net/date (Example #4)
|
81
|
-
time = Time.parse('March 10th, 2001, 5:16:18 pm')
|
82
|
-
|
83
|
-
assert_equal 'March 10, 2001, 5:16 pm', time.phpf('F j, Y, g:i a')
|
84
|
-
assert_equal '03.10.01', time.phpf('m.d.y')
|
85
|
-
assert_equal '10, 3, 2001', time.phpf('j, n, Y')
|
86
|
-
assert_equal '20010310', time.phpf('Ymd')
|
87
|
-
assert_equal '05-16-18, 10-03-01, 1631 1618 6 Satpm01', time.phpf('h-i-s, j-m-y, it is w Day')
|
88
|
-
assert_equal 'it is the 10th day.', time.phpf('\i\t \i\s \t\h\e jS \d\a\y.')
|
89
|
-
assert_equal '17:03:18 m is month', time.phpf('H:m:s \m \i\s \m\o\n\t\h')
|
90
|
-
assert_equal '17:16:18', time.phpf('H:i:s')
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|