rhodes-framework 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ === 0.0.0
2
+
3
+ * See rhodes/CHANGELOG
data/Manifest.txt CHANGED
@@ -1,5 +1,7 @@
1
1
  .gitignore
2
+ History.txt
2
3
  Manifest.txt
4
+ README.txt
3
5
  Rakefile
4
6
  lib/ServeME.rb
5
7
  lib/bsearch.rb
@@ -17,6 +19,7 @@ lib/rho/rho.rb
17
19
  lib/rho/rhoapplication.rb
18
20
  lib/rho/rhocontact.rb
19
21
  lib/rho/rhocontroller.rb
22
+ lib/rho/rhoerror.rb
20
23
  lib/rho/rhofsconnector.rb
21
24
  lib/rho/rhosupport.rb
22
25
  lib/rho/rhoutils.rb
@@ -28,7 +31,6 @@ lib/rhofsconnector.rb
28
31
  lib/rhom.rb
29
32
  lib/rhom/rhom.rb
30
33
  lib/rhom/rhom_db_adapter.rb
31
- lib/rhom/rhom_db_adapterME.rb
32
34
  lib/rhom/rhom_object.rb
33
35
  lib/rhom/rhom_object_factory.rb
34
36
  lib/rhom/rhom_source.rb
@@ -155,11 +157,15 @@ spec/app/mspec/utils/version.rb
155
157
  spec/app/mspec/version.rb
156
158
  spec/app/spec/fixtures/client_info.txt
157
159
  spec/app/spec/fixtures/object_values.txt
160
+ spec/app/spec/pagination/fixtures/object_values.txt
158
161
  spec/app/spec/rho_controller_spec.rb
159
162
  spec/app/spec/rho_spec.rb
160
- spec/app/spec/rhom_object_factory_spec.rb
163
+ spec/app/spec/rhom_db_adapter_spec.rb
164
+ spec/app/spec/rhom_object_spec.rb
161
165
  spec/app/spec/rhom_spec.rb
166
+ spec/app/spec/rhoruby_spec.rb
162
167
  spec/app/spec/spec_helper.rb
168
+ spec/app/spec/syncengine_spec.rb
163
169
  spec/app/spec/webview_spec.rb
164
170
  spec/app/spec_runner.rb
165
171
  spec/build.yml
data/README.txt ADDED
@@ -0,0 +1 @@
1
+ = Rhodes
data/Rakefile CHANGED
@@ -1,33 +1,9 @@
1
- %w[rubygems rake rake/clean fileutils newgem].each { |f| require f }
2
1
  $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
3
- require 'lib/version.rb'
2
+ require 'lib/rhodes.rb'
3
+ require 'rubygems'
4
+ require 'hoe'
4
5
 
5
- task :default => [:spec]
6
-
7
- # Generate all the Rake tasks
8
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
9
- $hoe = Hoe.new('rhodes-framework', RhodesFramework::VERSION) do |p|
10
- p.developer('Rhomobile Dev', 'dev@rhomobile.com')
11
- #p.changes = p.paragraphs_of("../History.txt", 0..1).join("\n\n") if File.exists? "../History.txt"
12
- #p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
13
- p.rubyforge_name = p.name # TODO this is default value
14
- p.extra_deps = [
15
- ['sqlite3-ruby','= 1.2.3'],
16
- ['rcov'],
17
- ['rspec'],
18
- ['diff-lcs'],
19
- ['extlib'],
20
- ['newgem'],
21
- ['activesupport']
22
- ]
23
-
24
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
25
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
26
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
27
- p.rsync_args = '-av --delete --ignore-errors'
28
- p.test_globs = ''
29
- p.summary = "rhodes-framework #{RhodesFramework::VERSION}"
30
-
6
+ Hoe.spec 'rhodes-framework' do |s|
7
+ s.developer 'Rhomobile Dev', 'dev@rhomobile.com'
8
+ s.version = Rhodes::VERSION
31
9
  end
32
-
33
- require 'newgem/tasks'
data/lib/builtinME.rb CHANGED
@@ -16,10 +16,6 @@ module Kernel
16
16
  false
17
17
  end
18
18
 
19
- def fork
20
- raise NotImplementedError, "the fork() function is unimplemented on this machine"
21
- end
22
-
23
19
  def =~ x
24
20
  false
25
21
  end
@@ -56,6 +52,12 @@ module Kernel
56
52
  private
57
53
  def method_added symbol
58
54
  end
55
+
56
+ public
57
+ def fork
58
+ raise NotImplementedError, "the fork() function is unimplemented on this machine"
59
+ end
60
+
59
61
  end
60
62
 
61
63
  class Object
@@ -90,6 +92,13 @@ module Enumerable
90
92
  return array_of_tuples.collect {|x| x[0]}
91
93
  end
92
94
 
95
+ def detect(ifnone = nil)
96
+ each { |obj| return obj if yield(obj) }
97
+ ifnone.call if ifnone
98
+ end
99
+
100
+ alias find :detect
101
+
93
102
  def each_with_index
94
103
  i = 0;
95
104
  each {|x| yield x, i; i = i + 1}
@@ -137,6 +146,18 @@ module Enumerable
137
146
  end
138
147
  end
139
148
 
149
+ def all?(&proc)
150
+ proc = lambda { |obj| obj } unless block_given?
151
+ each { |obj| return false unless proc.call(obj) }
152
+ true
153
+ end
154
+
155
+ def any?(&proc)
156
+ proc = lambda { |obj| obj } unless block_given?
157
+ each { |obj| return true if proc.call(obj) }
158
+ false
159
+ end
160
+
140
161
  def collect
141
162
  arr = []
142
163
  each{|obj| arr << yield(obj)}
@@ -217,7 +238,7 @@ class File
217
238
  s = ""
218
239
  first = true
219
240
  aString.each {|x|
220
- if !first
241
+ if !first and !s.end_with?(File::SEPARATOR)
221
242
  s += File::SEPARATOR
222
243
  end
223
244
  s+= x
@@ -575,6 +596,47 @@ class FalseClass
575
596
  end
576
597
  end
577
598
 
599
+ class Range
600
+ include Enumerable
601
+
602
+ def ==(value)
603
+ if value.first == first and value.last == last and value.exclude_end? == exclude_end?
604
+ true
605
+ else
606
+ false
607
+ end
608
+ end
609
+
610
+ def ===(value)
611
+ each do |item|
612
+ return true if value == item
613
+ end
614
+ false
615
+ end
616
+
617
+ def to_s
618
+ return self.begin.to_s + "..." + self.end.to_s if exclude_end?
619
+ return self.begin.to_s + ".." + self.end.to_s
620
+ end
621
+
622
+ alias inspect :to_s
623
+
624
+ alias first :begin
625
+ alias last :end
626
+
627
+ def step(n=1)
628
+ if n == 1 then
629
+ each{|i|yield(i)}
630
+ else
631
+ counter = 0
632
+ each do |i|
633
+ yield(i) if counter%n == 0
634
+ counter = counter + 1
635
+ end
636
+ end
637
+ end
638
+ end
639
+
578
640
  class String
579
641
  include Comparable
580
642
 
data/lib/date.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  #
2
2
  # date.rb - date and time library
3
3
  #
4
- # Author: Tadayoshi Funaba 1998-2007
4
+ # Author: Tadayoshi Funaba 1998-2008
5
5
  #
6
6
  # Documentation: William Webber <william@williamwebber.com>
7
7
  #
8
8
  #--
9
- # $Id: date.rb,v 2.33 2007-12-22 14:41:34+09 tadf Exp $
9
+ # $Id: date.rb,v 2.37 2008-01-17 20:16:31+09 tadf Exp $
10
10
  #++
11
11
  #
12
12
  # == Overview
@@ -193,11 +193,6 @@
193
193
  #
194
194
  # puts secs_to_new_year()
195
195
 
196
- if defined? RHO_ME
197
- require 'rationalME'
198
- end
199
-
200
- require 'rational'
201
196
  require 'date/format'
202
197
 
203
198
  # Class representing a date.
@@ -238,20 +233,20 @@ class Date
238
233
  # Full month names, in English. Months count from 1 to 12; a
239
234
  # month's numerical representation indexed into this array
240
235
  # gives the name of that month (hence the first element is nil).
241
- #MONTHNAMES = [nil] + %w(January February March April May June July
242
- # August September October November December)
236
+ MONTHNAMES = [nil] + %w(January February March April May June July
237
+ August September October November December)
243
238
 
244
239
  # Full names of days of the week, in English. Days of the week
245
240
  # count from 0 to 6 (except in the commercial week); a day's numerical
246
241
  # representation indexed into this array gives the name of that day.
247
- #DAYNAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
242
+ DAYNAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
248
243
 
249
244
  # Abbreviated month names, in English.
250
- #ABBR_MONTHNAMES = [nil] + %w(Jan Feb Mar Apr May Jun
251
- # Jul Aug Sep Oct Nov Dec)
245
+ ABBR_MONTHNAMES = [nil] + %w(Jan Feb Mar Apr May Jun
246
+ Jul Aug Sep Oct Nov Dec)
252
247
 
253
248
  # Abbreviated day names, in English.
254
- #ABBR_DAYNAMES = %w(Sun Mon Tue Wed Thu Fri Sat)
249
+ ABBR_DAYNAMES = %w(Sun Mon Tue Wed Thu Fri Sat)
255
250
 
256
251
  [MONTHNAMES, DAYNAMES, ABBR_MONTHNAMES, ABBR_DAYNAMES].each do |xs|
257
252
  xs.each{|x| x.freeze unless x.nil?}.freeze
@@ -279,8 +274,8 @@ class Date
279
274
 
280
275
  def <=> (other)
281
276
  case other
282
- when Infinity; d <=> other.d
283
- when Numeric; d
277
+ when Infinity; return d <=> other.d
278
+ when Numeric; return d
284
279
  else
285
280
  begin
286
281
  l, r = other.coerce(self)
@@ -317,7 +312,20 @@ class Date
317
312
  # Gregorian calendar.
318
313
  GREGORIAN = Infinity.new(-1)
319
314
 
320
- UNIXEPOCH = 2440588 # 1970-01-01 :nodoc:
315
+ HALF_DAYS_IN_DAY = Rational(1, 2) # :nodoc:
316
+ HOURS_IN_DAY = Rational(1, 24) # :nodoc:
317
+ MINUTES_IN_DAY = Rational(1, 1440) # :nodoc:
318
+ SECONDS_IN_DAY = Rational(1, 86400) # :nodoc:
319
+ MILLISECONDS_IN_DAY = Rational(1, 86400*10**3) # :nodoc:
320
+ NANOSECONDS_IN_DAY = Rational(1, 86400*10**9) # :nodoc:
321
+ MILLISECONDS_IN_SECOND = Rational(1, 10**3) # :nodoc:
322
+ NANOSECONDS_IN_SECOND = Rational(1, 10**9) # :nodoc:
323
+
324
+ MJD_EPOCH_IN_AJD = Rational(4800001, 2) # 1858-11-17 # :nodoc:
325
+ UNIX_EPOCH_IN_AJD = Rational(4881175, 2) # 1970-01-01 # :nodoc:
326
+ MJD_EPOCH_IN_CJD = 2400001 # :nodoc:
327
+ UNIX_EPOCH_IN_CJD = 2440588 # :nodoc:
328
+ LD_EPOCH_IN_CJD = 2299160 # :nodoc:
321
329
 
322
330
  t = Module.new do
323
331
 
@@ -491,7 +499,7 @@ class Date
491
499
  #
492
500
  # Returns the (civil) Julian Day Number as [day_number,
493
501
  # fraction] where +fraction+ is always 1/2.
494
- def ajd_to_jd(ajd, of=0) (ajd + of + 1.to_r/2).divmod(1) end # :nodoc:
502
+ def ajd_to_jd(ajd, of=0) (ajd + of + HALF_DAYS_IN_DAY).divmod(1) end # :nodoc:
495
503
 
496
504
  # Convert a (civil) Julian Day Number to an Astronomical Julian
497
505
  # Day Number.
@@ -502,46 +510,58 @@ class Date
502
510
  #
503
511
  # Returns the Astronomical Julian Day Number as a single
504
512
  # numeric value.
505
- def jd_to_ajd(jd, fr, of=0) jd + fr - of - 1.to_r/2 end # :nodoc:
506
-
513
+ def jd_to_ajd(jd, fr, of=0) jd + fr - of - HALF_DAYS_IN_DAY end # :nodoc:
514
+
507
515
  # Convert a fractional day +fr+ to [hours, minutes, seconds,
508
516
  # fraction_of_a_second]
509
517
  def day_fraction_to_time(fr) # :nodoc:
510
- h, fr = fr.divmod(1.to_r/24)
511
- min, fr = fr.divmod(1.to_r/1440)
512
- s, fr = fr.divmod(1.to_r/86400)
518
+ ss, fr = fr.divmod(SECONDS_IN_DAY) # 4p
519
+ h, ss = ss.divmod(3600)
520
+ min, s = ss.divmod(60)
513
521
  return h, min, s, fr * 86400
514
522
  end
515
523
 
516
524
  # Convert an +h+ hour, +min+ minutes, +s+ seconds period
517
525
  # to a fractional day.
518
- def time_to_day_fraction(h, min, s) # :nodoc:
519
- h.to_r/24 + min.to_r/1440 + s.to_r/86400
526
+ begin
527
+ Rational(Rational(1, 2), 2) # a challenge
528
+
529
+ def time_to_day_fraction(h, min, s)
530
+ Rational(h * 3600 + min * 60 + s, 86400) # 4p
531
+ end
532
+ rescue
533
+ def time_to_day_fraction(h, min, s)
534
+ if Integer === h && Integer === min && Integer === s
535
+ Rational(h * 3600 + min * 60 + s, 86400) # 4p
536
+ else
537
+ (h * 3600 + min * 60 + s).to_r/86400 # 4p
538
+ end
539
+ end
520
540
  end
521
541
 
522
542
  # Convert an Astronomical Modified Julian Day Number to an
523
543
  # Astronomical Julian Day Number.
524
- def amjd_to_ajd(amjd) amjd + 4800001.to_r/2 end # :nodoc:
544
+ def amjd_to_ajd(amjd) amjd + MJD_EPOCH_IN_AJD end # :nodoc:
525
545
 
526
546
  # Convert an Astronomical Julian Day Number to an
527
547
  # Astronomical Modified Julian Day Number.
528
- def ajd_to_amjd(ajd) ajd - 4800001.to_r/2 end # :nodoc:
548
+ def ajd_to_amjd(ajd) ajd - MJD_EPOCH_IN_AJD end # :nodoc:
529
549
 
530
550
  # Convert a Modified Julian Day Number to a Julian
531
551
  # Day Number.
532
- def mjd_to_jd(mjd) mjd + 2400001 end # :nodoc:
552
+ def mjd_to_jd(mjd) mjd + MJD_EPOCH_IN_CJD end # :nodoc:
533
553
 
534
554
  # Convert a Julian Day Number to a Modified Julian Day
535
555
  # Number.
536
- def jd_to_mjd(jd) jd - 2400001 end # :nodoc:
556
+ def jd_to_mjd(jd) jd - MJD_EPOCH_IN_CJD end # :nodoc:
537
557
 
538
558
  # Convert a count of the number of days since the adoption
539
559
  # of the Gregorian Calendar (in Italy) to a Julian Day Number.
540
- def ld_to_jd(ld) ld + 2299160 end # :nodoc:
560
+ def ld_to_jd(ld) ld + LD_EPOCH_IN_CJD end # :nodoc:
541
561
 
542
562
  # Convert a Julian Day Number to the number of days since
543
563
  # the adoption of the Gregorian Calendar (in Italy).
544
- def jd_to_ld(jd) jd - 2299160 end # :nodoc:
564
+ def jd_to_ld(jd) jd - LD_EPOCH_IN_CJD end # :nodoc:
545
565
 
546
566
  # Convert a Julian Day Number to the day of the week.
547
567
  #
@@ -680,9 +700,9 @@ class Date
680
700
  h += 24 if h < 0
681
701
  min += 60 if min < 0
682
702
  s += 60 if s < 0
683
- return unless ((0..23) === h &&
684
- (0..59) === min &&
685
- (0..59) === s) ||
703
+ return unless ((0...24) === h &&
704
+ (0...60) === min &&
705
+ (0...60) === s) ||
686
706
  (24 == h &&
687
707
  0 == min &&
688
708
  0 == s)
@@ -839,7 +859,7 @@ class Date
839
859
  h, fr = fr.divmod(3600)
840
860
  min, fr = fr.divmod(60)
841
861
  s, fr = fr.divmod(1)
842
- elem[:jd] = UNIXEPOCH + d
862
+ elem[:jd] = UNIX_EPOCH_IN_CJD + d
843
863
  elem[:hour] = h
844
864
  elem[:min] = min
845
865
  elem[:sec] = s
@@ -1041,8 +1061,8 @@ class Date
1041
1061
  # Day Number day 0.
1042
1062
  #
1043
1063
  # +sg+ specifies the Day of Calendar Reform.
1044
- def self.parse(str='-4712-01-01', hints={}, sg=ITALY)
1045
- elem = _parse(str, hints)
1064
+ def self.parse(str='-4712-01-01', comp=true, sg=ITALY)
1065
+ elem = _parse(str, comp)
1046
1066
  new_by_frags(elem, sg)
1047
1067
  end
1048
1068
 
@@ -1080,13 +1100,13 @@ class Date
1080
1100
 
1081
1101
  class << self
1082
1102
 
1083
- def once(*ids) # :nodoc:
1103
+ def once(*ids) # :nodoc: -- restricted
1084
1104
  for id in ids
1085
1105
  module_eval <<-"end;"
1086
- alias_method :__#{id.to_i}__, :#{id.to_s}
1087
- private :__#{id.to_i}__
1088
- def #{id.to_s}(*args, &block)
1089
- (@__#{id.to_i}__ ||= [__#{id.to_i}__(*args, &block)])[0]
1106
+ alias_method :__#{id.object_id}__, :#{id.to_s}
1107
+ private :__#{id.object_id}__
1108
+ def #{id.to_s}(*args)
1109
+ @__ca__[#{id.object_id}] ||= __#{id.object_id}__(*args)
1090
1110
  end
1091
1111
  end;
1092
1112
  end
@@ -1115,7 +1135,10 @@ class Date
1115
1135
  #
1116
1136
  # Using one of the factory methods such as Date::civil is
1117
1137
  # generally easier and safer.
1118
- def initialize(ajd=0, of=0, sg=ITALY) @ajd, @of, @sg = ajd, of, sg end
1138
+ def initialize(ajd=0, of=0, sg=ITALY)
1139
+ @ajd, @of, @sg = ajd, of, sg
1140
+ @__ca__ = {}
1141
+ end
1119
1142
 
1120
1143
  # Get the date as an Astronomical Julian Day Number.
1121
1144
  def ajd() @ajd end
@@ -1198,7 +1221,12 @@ class Date
1198
1221
  # Get the fraction-of-a-second of this date.
1199
1222
  def sec_fraction() time[3] end
1200
1223
 
1201
- private :hour, :min, :sec, :sec_fraction
1224
+ alias_method :minute, :min
1225
+ alias_method :second, :sec
1226
+ alias_method :second_fraction, :sec_fraction
1227
+
1228
+ private :hour, :min, :sec, :sec_fraction,
1229
+ :minute, :second, :second_fraction
1202
1230
 
1203
1231
  def zone() strftime('%:z') end
1204
1232
 
@@ -1289,7 +1317,7 @@ class Date
1289
1317
 
1290
1318
  def new_offset(of=0)
1291
1319
  if String === of
1292
- of = (zone_to_diff(of) || 0).to_r/86400
1320
+ of = Rational(zone_to_diff(of) || 0, 86400)
1293
1321
  end
1294
1322
  self.class.new!(@ajd, of, @sg)
1295
1323
  end
@@ -1442,18 +1470,23 @@ class Date
1442
1470
  def hash() @ajd.hash end
1443
1471
 
1444
1472
  # Return internal object state as a programmer-readable string.
1445
- def inspect() format('#<%s: %s,%s,%s>', self.class, @ajd, @of, @sg) end
1473
+ def inspect
1474
+ format('#<%s: %s (%s,%s,%s)>', self.class, to_s, @ajd, @of, @sg)
1475
+ end
1446
1476
 
1447
1477
  # Return the date as a human-readable string.
1448
1478
  #
1449
1479
  # The format used is YYYY-MM-DD.
1450
- def to_s() strftime end
1480
+ def to_s() format('%.4d-%02d-%02d', year, mon, mday) end # 4p
1451
1481
 
1452
1482
  # Dump to Marshal format.
1453
1483
  def marshal_dump() [@ajd, @of, @sg] end
1454
1484
 
1455
- # Load from Marshall format.
1456
- def marshal_load(a) @ajd, @of, @sg, = a end
1485
+ # Load from Marshal format.
1486
+ def marshal_load(a)
1487
+ @ajd, @of, @sg, = a
1488
+ @__ca__ = {}
1489
+ end
1457
1490
 
1458
1491
  end
1459
1492
 
@@ -1521,13 +1554,12 @@ class DateTime < Date
1521
1554
  #
1522
1555
  # All day/time values default to 0.
1523
1556
  def self.jd(jd=0, h=0, min=0, s=0, of=0, sg=ITALY)
1524
- fr = _valid_time?(h, min, s)
1525
1557
  unless (jd = _valid_jd?(jd, sg)) &&
1526
- (fr)
1558
+ (fr = _valid_time?(h, min, s))
1527
1559
  raise ArgumentError, 'invalid date'
1528
1560
  end
1529
1561
  if String === of
1530
- of = (zone_to_diff(of) || 0).to_r/86400
1562
+ of = Rational(zone_to_diff(of) || 0, 86400)
1531
1563
  end
1532
1564
  new!(jd_to_ajd(jd, fr, of), of, sg)
1533
1565
  end
@@ -1547,13 +1579,12 @@ class DateTime < Date
1547
1579
  # +y+ defaults to -4712, and +d+ to 1; this is Julian Day Number
1548
1580
  # day 0. The time values default to 0.
1549
1581
  def self.ordinal(y=-4712, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
1550
- fr = _valid_time?(h, min, s)
1551
1582
  unless (jd = _valid_ordinal?(y, d, sg)) &&
1552
- (fr)
1583
+ (fr = _valid_time?(h, min, s))
1553
1584
  raise ArgumentError, 'invalid date'
1554
1585
  end
1555
1586
  if String === of
1556
- of = (zone_to_diff(of) || 0).to_r/86400
1587
+ of = Rational(zone_to_diff(of) || 0, 86400)
1557
1588
  end
1558
1589
  new!(jd_to_ajd(jd, fr, of), of, sg)
1559
1590
  end
@@ -1573,13 +1604,12 @@ class DateTime < Date
1573
1604
  # +y+ defaults to -4712, +m+ to 1, and +d+ to 1; this is Julian Day
1574
1605
  # Number day 0. The time values default to 0.
1575
1606
  def self.civil(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
1576
- fr = _valid_time?(h, min, s)
1577
1607
  unless (jd = _valid_civil?(y, m, d, sg)) &&
1578
- (fr)
1608
+ (fr = _valid_time?(h, min, s))
1579
1609
  raise ArgumentError, 'invalid date'
1580
1610
  end
1581
1611
  if String === of
1582
- of = (zone_to_diff(of) || 0).to_r/86400
1612
+ of = Rational(zone_to_diff(of) || 0, 86400)
1583
1613
  end
1584
1614
  new!(jd_to_ajd(jd, fr, of), of, sg)
1585
1615
  end
@@ -1602,25 +1632,23 @@ class DateTime < Date
1602
1632
  # Julian Day Number day 0.
1603
1633
  # The time values default to 0.
1604
1634
  def self.commercial(y=-4712, w=1, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
1605
- fr = _valid_time?(h, min, s)
1606
1635
  unless (jd = _valid_commercial?(y, w, d, sg)) &&
1607
- (fr)
1636
+ (fr = _valid_time?(h, min, s))
1608
1637
  raise ArgumentError, 'invalid date'
1609
1638
  end
1610
1639
  if String === of
1611
- of = (zone_to_diff(of) || 0).to_r/86400
1640
+ of = Rational(zone_to_diff(of) || 0, 86400)
1612
1641
  end
1613
1642
  new!(jd_to_ajd(jd, fr, of), of, sg)
1614
1643
  end
1615
1644
 
1616
1645
  def self.weeknum(y=-4712, w=0, d=1, f=0, h=0, min=0, s=0, of=0, sg=ITALY) # :nodoc:
1617
- fr = _valid_time?(h, min, s)
1618
1646
  unless (jd = _valid_weeknum?(y, w, d, f, sg)) &&
1619
- (fr)
1647
+ (fr = _valid_time?(h, min, s))
1620
1648
  raise ArgumentError, 'invalid date'
1621
1649
  end
1622
1650
  if String === of
1623
- of = (zone_to_diff(of) || 0).to_r/86400
1651
+ of = Rational(zone_to_diff(of) || 0, 86400)
1624
1652
  end
1625
1653
  new!(jd_to_ajd(jd, fr, of), of, sg)
1626
1654
  end
@@ -1628,13 +1656,12 @@ class DateTime < Date
1628
1656
  private_class_method :weeknum
1629
1657
 
1630
1658
  def self.nth_kday(y=-4712, m=1, n=1, k=1, h=0, min=0, s=0, of=0, sg=ITALY) # :nodoc:
1631
- fr = _valid_time?(h, min, s)
1632
1659
  unless (jd = _valid_nth_kday?(y, m, n, k, sg)) &&
1633
- (fr)
1660
+ (fr = _valid_time?(h, min, s))
1634
1661
  raise ArgumentError, 'invalid date'
1635
1662
  end
1636
1663
  if String === of
1637
- of = (zone_to_diff(of) || 0).to_r/86400
1664
+ of = Rational(zone_to_diff(of) || 0, 86400)
1638
1665
  end
1639
1666
  new!(jd_to_ajd(jd, fr, of), of, sg)
1640
1667
  end
@@ -1644,15 +1671,12 @@ class DateTime < Date
1644
1671
  def self.new_by_frags(elem, sg) # :nodoc:
1645
1672
  elem = rewrite_frags(elem)
1646
1673
  elem = complete_frags(elem)
1647
- fr = valid_time_frags?(elem)
1648
1674
  unless (jd = valid_date_frags?(elem, sg)) &&
1649
- (fr)
1675
+ (fr = valid_time_frags?(elem))
1650
1676
  raise ArgumentError, 'invalid date'
1651
1677
  end
1652
- sf = (elem[:sec_fraction] || 0)
1653
- fr += sf/86400
1654
- of = (elem[:offset] || 0)
1655
- of = of.to_r/86400
1678
+ fr += (elem[:sec_fraction] || 0) / 86400
1679
+ of = Rational(elem[:offset] || 0, 86400)
1656
1680
  new!(jd_to_ajd(jd, fr, of), of, sg)
1657
1681
  end
1658
1682
 
@@ -1692,8 +1716,8 @@ class DateTime < Date
1692
1716
  # Day Number day 0.
1693
1717
  #
1694
1718
  # +sg+ specifies the Day of Calendar Reform.
1695
- def self.parse(str='-4712-01-01T00:00:00+00:00', hints={}, sg=ITALY)
1696
- elem = _parse(str, hints)
1719
+ def self.parse(str='-4712-01-01T00:00:00+00:00', comp=true, sg=ITALY)
1720
+ elem = _parse(str, comp)
1697
1721
  new_by_frags(elem, sg)
1698
1722
  end
1699
1723
 
@@ -1729,7 +1753,13 @@ class DateTime < Date
1729
1753
  new_by_frags(elem, sg)
1730
1754
  end
1731
1755
 
1732
- public :hour, :min, :sec, :sec_fraction, :zone, :offset, :new_offset
1756
+ public :hour, :min, :sec, :sec_fraction, :zone, :offset, :new_offset,
1757
+ :minute, :second, :second_fraction
1758
+
1759
+ def to_s # 4p
1760
+ format('%.4d-%02d-%02dT%02d:%02d:%02d%s',
1761
+ year, mon, mday, hour, min, sec, zone)
1762
+ end
1733
1763
 
1734
1764
  end
1735
1765
 
@@ -1744,9 +1774,9 @@ class Time
1744
1774
 
1745
1775
  def to_datetime
1746
1776
  jd = DateTime.__send__(:civil_to_jd, year(), mon(), mday(), DateTime::ITALY)
1747
- fr = DateTime.__send__(:time_to_day_fraction, hour(), min(), [sec, 59].min) +
1748
- nsec.to_r/86400_000_000_000
1749
- of = utc_offset.to_r/86400
1777
+ fr = DateTime.__send__(:time_to_day_fraction, hour(), min(), [sec(), 59].min) +
1778
+ Rational(nsec, 86400_000_000_000)
1779
+ of = Rational(utc_offset, 86400)
1750
1780
  DateTime.new!(DateTime.__send__(:jd_to_ajd, jd, fr, of),
1751
1781
  of, DateTime::ITALY)
1752
1782
  end
@@ -1762,12 +1792,23 @@ class Date
1762
1792
  # Create a new Date object representing today.
1763
1793
  #
1764
1794
  # +sg+ specifies the Day of Calendar Reform.
1765
- def self.today(sg=ITALY) Time.now.to_date .new_start(sg) end
1795
+ def self.today(sg=ITALY)
1796
+ t = Time.now
1797
+ jd = civil_to_jd(t.year(), t.mon(), t.mday(), sg)
1798
+ new!(jd_to_ajd(jd, 0, 0), 0, sg)
1799
+ end
1766
1800
 
1767
1801
  # Create a new DateTime object representing the current time.
1768
1802
  #
1769
1803
  # +sg+ specifies the Day of Calendar Reform.
1770
- def self.now (sg=ITALY) Time.now.to_datetime.new_start(sg) end
1804
+ def self.now(sg=ITALY)
1805
+ t = Time.now
1806
+ jd = civil_to_jd(t.year(), t.mon(), t.mday(), sg)
1807
+ fr = time_to_day_fraction(t.hour(), t.min(), [t.sec(), 59].min()) +
1808
+ Rational(t.nsec(), 86400_000_000_000)
1809
+ of = Rational(t.utc_offset(), 86400)
1810
+ new!(jd_to_ajd(jd, fr, of), of, sg)
1811
+ end
1771
1812
 
1772
1813
  private_class_method :now
1773
1814