when_exe 0.4.5 → 0.4.6
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.
- checksums.yaml +4 -4
- data/bin/.pryrc +9 -0
- data/lib/when_exe.rb +10 -5
- data/lib/when_exe/basictypes.rb +5 -3
- data/lib/when_exe/calendartypes.rb +6 -38
- data/lib/when_exe/ephemeris.rb +42 -2
- data/lib/when_exe/ephemeris/eclipse.rb +8 -8
- data/lib/when_exe/ephemeris/notes.rb +29 -3
- data/lib/when_exe/ephemeris/phase_table.rb +825 -0
- data/lib/when_exe/ephemeris/term_table.rb +603 -0
- data/lib/when_exe/events.rb +73 -36
- data/lib/when_exe/icalendar.rb +7 -7
- data/lib/when_exe/inspect.rb +3 -3
- data/lib/when_exe/linkeddata.rb +1 -1
- data/lib/when_exe/parts/resource.rb +16 -4
- data/lib/when_exe/parts/timezone.rb +9 -6
- data/lib/when_exe/region/chinese.rb +5 -3
- data/lib/when_exe/region/indian.rb +2 -2
- data/lib/when_exe/region/japanese/notes.rb +4 -1
- data/lib/when_exe/timestandard.rb +1 -1
- data/lib/when_exe/tmposition.rb +24 -16
- data/lib/when_exe/tmptypes.rb +17 -3
- data/lib/when_exe/tmreference.rb +2 -2
- data/lib/when_exe/version.rb +1 -1
- data/test/events/japanese-holiday.ttl +67 -67
- data/test/test/region/mayan.rb +2 -1
- metadata +6 -2
data/lib/when_exe/events.rb
CHANGED
@@ -37,6 +37,13 @@ module When
|
|
37
37
|
#
|
38
38
|
attr_reader :until
|
39
39
|
|
40
|
+
# オリジナル文字列
|
41
|
+
#
|
42
|
+
# @return [String]
|
43
|
+
#
|
44
|
+
attr_accessor :original
|
45
|
+
private :original=
|
46
|
+
|
40
47
|
# オブジェクトを When::Events::Range 型に変換する
|
41
48
|
#
|
42
49
|
# @param [Object] source 変換元のオブジェクト
|
@@ -605,10 +612,9 @@ module When
|
|
605
612
|
# 日時範囲化
|
606
613
|
to_range = proc {|event, date|
|
607
614
|
target = When.when?(date, :parse=>When::Locale::EasternParser)
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
end
|
615
|
+
target = Range.convert_from(target) if target.kind_of?(Array) || target.kind_of?(Enumerator)
|
616
|
+
target.send(:original=, date) if target.kind_of?(Range)
|
617
|
+
target
|
612
618
|
}
|
613
619
|
|
614
620
|
# 日付化
|
@@ -1187,14 +1193,14 @@ module When
|
|
1187
1193
|
event_range.overlaped(range).each do |focused_date|
|
1188
1194
|
sort_required = true
|
1189
1195
|
focused_event = event.deep_copy
|
1190
|
-
focused_event.
|
1196
|
+
focused_event.send(:date=, focused_date)
|
1191
1197
|
narrowed_events << focused_event
|
1192
1198
|
end
|
1193
1199
|
else
|
1194
1200
|
narrowed_events << event
|
1195
1201
|
end
|
1196
1202
|
end
|
1197
|
-
narrowed_events.sort_by! {|event| event.
|
1203
|
+
narrowed_events.sort_by! {|event| event.date} if sort_required
|
1198
1204
|
narrowed_events
|
1199
1205
|
end
|
1200
1206
|
|
@@ -1325,37 +1331,42 @@ module When
|
|
1325
1331
|
source = yield(source) if block_given? && operation !~ /SPARQL|CalendarEra/i
|
1326
1332
|
raise IOError, target + ': not ready' unless source
|
1327
1333
|
for_each_record(source, operation) do |row|
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
event.role[HAS_PART].
|
1337
|
-
|
1334
|
+
begin
|
1335
|
+
event = Event.new(self, @events.size+1, row)
|
1336
|
+
@events << event
|
1337
|
+
|
1338
|
+
@role.keys.each do |item|
|
1339
|
+
case item
|
1340
|
+
when LABEL, REFERENCE
|
1341
|
+
when HAS_PART
|
1342
|
+
if event.role[HAS_PART].kind_of?(Array)
|
1343
|
+
event.role[HAS_PART].each do |word|
|
1344
|
+
@index[HAS_PART][word] << @events.size
|
1345
|
+
end
|
1346
|
+
else
|
1347
|
+
event.each_word do |word|
|
1348
|
+
@index[HAS_PART][word] << @events.size
|
1349
|
+
end
|
1338
1350
|
end
|
1351
|
+
when WHAT_DAY
|
1352
|
+
date = event.role[WHAT_DAY]
|
1353
|
+
key = [date.class.to_s !~ /\AWhen/ ||
|
1354
|
+
date.frame.kind_of?(When::CalendarTypes::Christian),
|
1355
|
+
date.month * 1, date.day]
|
1356
|
+
@index[WHAT_DAY][key] << @events.size
|
1339
1357
|
else
|
1340
|
-
|
1341
|
-
@index[HAS_PART][word] << @events.size
|
1342
|
-
end
|
1358
|
+
add_index(:role, item)
|
1343
1359
|
end
|
1344
|
-
when WHAT_DAY
|
1345
|
-
date = event.role[WHAT_DAY]
|
1346
|
-
key = [date.class.to_s !~ /\AWhen/ ||
|
1347
|
-
date.frame.kind_of?(When::CalendarTypes::Christian),
|
1348
|
-
date.month * 1, date.day]
|
1349
|
-
@index[WHAT_DAY][key] << @events.size
|
1350
|
-
else
|
1351
|
-
add_index(:role, item)
|
1352
1360
|
end
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1361
|
+
|
1362
|
+
[:rdf, :csv].each do |method|
|
1363
|
+
send(method).keys.each do |item|
|
1364
|
+
add_index(method, item)
|
1365
|
+
end
|
1358
1366
|
end
|
1367
|
+
rescue => exception
|
1368
|
+
puts "#{source}##{@events.size+1}: #{exception}"
|
1369
|
+
# puts exception.backtrace
|
1359
1370
|
end
|
1360
1371
|
end
|
1361
1372
|
|
@@ -1660,6 +1671,22 @@ module When
|
|
1660
1671
|
#
|
1661
1672
|
attr_reader :order
|
1662
1673
|
|
1674
|
+
#
|
1675
|
+
# deep copy 時の元イベント
|
1676
|
+
#
|
1677
|
+
# @return [When::Events::Event]
|
1678
|
+
#
|
1679
|
+
attr_accessor :original
|
1680
|
+
protected :original=
|
1681
|
+
|
1682
|
+
#
|
1683
|
+
# 日付または日付範囲
|
1684
|
+
#
|
1685
|
+
# @return [When::TM::TemporalPosition or When::Events::Range]
|
1686
|
+
#
|
1687
|
+
attr_accessor :date
|
1688
|
+
private :date=
|
1689
|
+
|
1663
1690
|
#
|
1664
1691
|
# HAS_PART対象の文字列中の{}で囲まれた語に対して yield で指定された処理を行う
|
1665
1692
|
#
|
@@ -1742,6 +1769,13 @@ module When
|
|
1742
1769
|
words.each do |word|
|
1743
1770
|
@statements << ::RDF::Statement(subject, @dataset.resource[predicate], word)
|
1744
1771
|
end
|
1772
|
+
when VALID
|
1773
|
+
if object.kind_of?(Range)
|
1774
|
+
object = object.original
|
1775
|
+
elsif object.respond_to?(:to_uri)
|
1776
|
+
object = object.to_uri
|
1777
|
+
end
|
1778
|
+
@statements << ::RDF::Statement(subject, @dataset.resource[predicate], object)
|
1745
1779
|
# when ABSTRACT
|
1746
1780
|
# @statements << ::RDF::Statement(subject, @dataset.resource[predicate], abstract)
|
1747
1781
|
else
|
@@ -1765,10 +1799,11 @@ module When
|
|
1765
1799
|
# @return [When::Events::Event] コピー結果
|
1766
1800
|
#
|
1767
1801
|
def deep_copy
|
1768
|
-
result
|
1769
|
-
result.csv
|
1770
|
-
result.rdf
|
1771
|
-
result.role
|
1802
|
+
result = self.dup
|
1803
|
+
result.csv = @csv.dup
|
1804
|
+
result.rdf = @rdf.dup
|
1805
|
+
result.role = @role.dup
|
1806
|
+
result.original = self
|
1772
1807
|
result
|
1773
1808
|
end
|
1774
1809
|
|
@@ -1831,6 +1866,8 @@ module When
|
|
1831
1866
|
definition[:operation].call(self, format == '%s' ? fields.first : format % fields)
|
1832
1867
|
end
|
1833
1868
|
end
|
1869
|
+
|
1870
|
+
@date = @role[VALID]
|
1834
1871
|
end
|
1835
1872
|
|
1836
1873
|
private
|
data/lib/when_exe/icalendar.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2016 Takashi SUGA
|
4
4
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
@@ -595,9 +595,10 @@ module When::V
|
|
595
595
|
end
|
596
596
|
}
|
597
597
|
residue_options = delayed_options[:residue]
|
598
|
+
frame_len = base.frame.indices.length
|
598
599
|
if residue_options
|
599
|
-
event_options['rrule'].update(_byyear(residue_options)) if residue_options[
|
600
|
-
event_options['rrule'].update(_byday(residue_options )) if residue_options[
|
600
|
+
event_options['rrule'].update(_byyear(residue_options.delete(frame_len-2))) if residue_options[frame_len-2]
|
601
|
+
event_options['rrule'].update(_byday(residue_options.delete(frame_len) )) if residue_options[frame_len]
|
601
602
|
delayed_options.delete(:residue)
|
602
603
|
end
|
603
604
|
if base.precision == When::MONTH && event_options['rrule']['FREQ'] == 'YEARLY'
|
@@ -620,14 +621,13 @@ module When::V
|
|
620
621
|
|
621
622
|
# オブジェクト変換オプションの遅延適用のBYYEAR要素
|
622
623
|
#
|
623
|
-
def _byyear(
|
624
|
-
{'BYYEAR'=>_to_ical_hash(When.Residue(
|
624
|
+
def _byyear(operation)
|
625
|
+
{'BYYEAR'=>_to_ical_hash(When.Residue(operation), 'year', 4)}
|
625
626
|
end
|
626
627
|
|
627
628
|
# オブジェクト変換オプションの遅延適用のBYDAY要素
|
628
629
|
#
|
629
|
-
def _byday(
|
630
|
-
operation = options.delete(2)
|
630
|
+
def _byday(operation)
|
631
631
|
return {'BYDAY'=>_to_ical_hash(operation, 'day', 11)} if operation.kind_of?(When::Coordinates::Residue)
|
632
632
|
|
633
633
|
residues = []
|
data/lib/when_exe/inspect.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2016 Takashi SUGA
|
4
4
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
@@ -773,7 +773,7 @@ module When
|
|
773
773
|
# @return [String]
|
774
774
|
#
|
775
775
|
def _to_uri(date)
|
776
|
-
(date.gsub(
|
776
|
+
(date.gsub(/%/, '@').sub(/(\d{2}:\d{2}:\d{2})\.(\d+)/, '\1%2E\2').gsub(/\./, '-') + caret_frame).
|
777
777
|
gsub(When::Parts::Resource::IRIEncode) {|c| When::Parts::Resource::IRIEncodeTable[c]}
|
778
778
|
end
|
779
779
|
|
@@ -1460,7 +1460,7 @@ module When
|
|
1460
1460
|
# 出力に使用する clk_time の作成
|
1461
1461
|
def _clk_time_for_inspect(precision)
|
1462
1462
|
return @clk_time unless precision && precision > When::DAY
|
1463
|
-
base = self + When::TM::
|
1463
|
+
base = self + When::TM::PeriodDuration.new(0.5, precision)
|
1464
1464
|
base.clk_time.clk_time[When::HOUR] = @clk_time.clk_time[When::HOUR] + 1 unless self.to_i == base.to_i
|
1465
1465
|
return base.clk_time
|
1466
1466
|
end
|
data/lib/when_exe/linkeddata.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2016 Takashi SUGA
|
4
4
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
@@ -373,9 +373,21 @@ module When::Parts
|
|
373
373
|
end
|
374
374
|
end
|
375
375
|
case @_pool[iri]
|
376
|
-
when my_mutex
|
377
|
-
|
378
|
-
|
376
|
+
when my_mutex
|
377
|
+
my_mutex.synchronize do
|
378
|
+
begin
|
379
|
+
@_pool[iri] = _create_object(iri, path, query, &block)
|
380
|
+
rescue => exception
|
381
|
+
@_pool[iri] = nil
|
382
|
+
raise exception
|
383
|
+
end
|
384
|
+
end
|
385
|
+
when Mutex
|
386
|
+
@_pool[iri].synchronize do
|
387
|
+
@_pool[iri]
|
388
|
+
end
|
389
|
+
else
|
390
|
+
@_pool[iri]
|
379
391
|
end
|
380
392
|
else
|
381
393
|
@_pool ||= {}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2016 Takashi SUGA
|
4
4
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
@@ -16,7 +16,7 @@ module When::Parts
|
|
16
16
|
class Timezone
|
17
17
|
|
18
18
|
#
|
19
|
-
# When::V::Timezone と Qhwn::Parts::Timezone の抽象基底
|
19
|
+
# When::TM::Clock, When::V::Timezone と Qhwn::Parts::Timezone の抽象基底
|
20
20
|
#
|
21
21
|
module Base
|
22
22
|
# 標準時間帯の時計
|
@@ -39,10 +39,13 @@ module When::Parts
|
|
39
39
|
# @return [When::TM::DateAndTime, When::TM::JulianDate]
|
40
40
|
#
|
41
41
|
def ^(date, options={})
|
42
|
-
date
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
date = When::TM::Position.any_other(date, options)
|
43
|
+
my_opt = date._attr
|
44
|
+
my_opt[:clock] = self
|
45
|
+
my_opt[:time_standard] = time_standard if respond_to?(:time_standard)
|
46
|
+
my_opt.merge(options)
|
47
|
+
return When::TM::JulianDate.dynamical_time(date.dynamical_time, my_opt) unless date.frame.kind_of?(When::TM::Calendar)
|
48
|
+
date.frame.jul_trans(When::TM::JulianDate.dynamical_time(date.dynamical_time, {:time_standard=>my_opt[:time_standard]}), my_opt)
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2016 Takashi SUGA
|
4
4
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
@@ -820,7 +820,8 @@ module When
|
|
820
820
|
#
|
821
821
|
def _normalize(args=[], options={})
|
822
822
|
@label ||= 'Chinese::ChineseSolar'
|
823
|
-
@formula ||= ['Formula']
|
823
|
+
@formula ||= (When::CalendarNote::LuniSolarPositions.table_off ? ['Formula'] :
|
824
|
+
[When.Resource('_ep:SolarFormulaWithTable'), When.Resource('_ep:LunarFormulaWithTable')])
|
824
825
|
@formula = Array(@formula)
|
825
826
|
@formula *= 2 if @formula.length == 1
|
826
827
|
@formula[0] += (@formula[0] =~ /\?/ ? '&' : '?') + 'formula=12S' if @formula[0].kind_of?(String)
|
@@ -873,7 +874,8 @@ module When
|
|
873
874
|
#
|
874
875
|
def _normalize(args=[], options={})
|
875
876
|
@label ||= 'Chinese::ChineseLuniSolar'
|
876
|
-
@formula ||= ['Formula']
|
877
|
+
@formula ||= (When::CalendarNote::LuniSolarPositions.table_off ? ['Formula'] :
|
878
|
+
[When.Resource('_ep:SolarFormulaWithTable'), When.Resource('_ep:LunarFormulaWithTable')])
|
877
879
|
@formula = Array(@formula)
|
878
880
|
@formula *= 2 if @formula.length == 1
|
879
881
|
@formula[0] += (@formula[0] =~ /\?/ ? '&' : '?') + 'formula=12S' if @formula[0].kind_of?(String)
|
@@ -635,8 +635,8 @@ module When
|
|
635
635
|
def _new_month_(m)
|
636
636
|
new_month_time = @formula[0].cn_to_time(m + @cycle_offset)
|
637
637
|
new_month_date = (new_month_time + 0.5 + @formula[0].long/360.0).floor
|
638
|
-
|
639
|
-
|
638
|
+
# sunrise_time = @formula[0].sunrise(new_month_date)
|
639
|
+
# (sunrise_time <= new_month_time) ? new_month_date : new_month_date-1
|
640
640
|
end
|
641
641
|
|
642
642
|
private
|
@@ -1271,7 +1271,10 @@ class When::CalendarNote
|
|
1271
1271
|
2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0] 没
|
1272
1272
|
|
1273
1273
|
2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0] 没
|
1274
|
-
2397584 => [ 16.0, 0]
|
1274
|
+
2397584 => [ 16.0, 0], # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
|
1275
|
+
|
1276
|
+
2451110 => [210.0, 1], # 平成10(1998).10.23 [209.0, 0] 没
|
1277
|
+
2451111 => [211.0, 0] # 平成10(1998).10.24 [210.0, 1] 霜降 (計算誤差の補正)
|
1275
1278
|
}
|
1276
1279
|
|
1277
1280
|
class << self
|
data/lib/when_exe/tmposition.rb
CHANGED
@@ -372,9 +372,14 @@ module When::TM
|
|
372
372
|
d
|
373
373
|
}
|
374
374
|
|
375
|
+
# 繰り返しの起点と間隔
|
376
|
+
base = element[0].kind_of?(Duration) ? element[1] : element[0]
|
377
|
+
frame_len = (base.respond_to?(:frame) ? base.frame : When::Gregorian).indices.length
|
378
|
+
duration = _duration_for_repeat(element)
|
379
|
+
|
375
380
|
# 意味のある繰り返しのない場合
|
376
|
-
has_residue_options = delayed_options[:residue] && (delayed_options[:residue][
|
377
|
-
delayed_options[:residue][
|
381
|
+
has_residue_options = delayed_options[:residue] && (delayed_options[:residue][frame_len-2].kind_of?(String) ||
|
382
|
+
delayed_options[:residue][frame_len].kind_of?(String))
|
378
383
|
case repeat
|
379
384
|
when nil ; return _instance_without_repeat(element).apply_delayed_options(delayed_options) unless has_residue_options
|
380
385
|
when 0 ; return []
|
@@ -383,10 +388,6 @@ module When::TM
|
|
383
388
|
raise ArgumentError, "Duration or TemporalPosition missing" unless element[1] || has_residue_options
|
384
389
|
end
|
385
390
|
|
386
|
-
# 繰り返しの起点と間隔
|
387
|
-
base = element[0].kind_of?(Duration) ? element[1] : element[0]
|
388
|
-
duration = _duration_for_repeat(element)
|
389
|
-
|
390
391
|
# 繰り返しのある場合
|
391
392
|
if repeat.kind_of?(Integer) && !has_residue_options
|
392
393
|
|
@@ -408,7 +409,8 @@ module When::TM
|
|
408
409
|
return duration.set_repeat(true) unless base
|
409
410
|
|
410
411
|
# iCalendar の機能を使用する
|
411
|
-
should_limit = base.precision == When::MONTH &&
|
412
|
+
should_limit = base.precision == When::MONTH &&
|
413
|
+
!(delayed_options[:residue] && delayed_options[:residue][frame_len-2])
|
412
414
|
iterator = When::V::Event.iterator_for_ISO8601(base, duration, delayed_options)
|
413
415
|
case repeat
|
414
416
|
when nil ; (result=iterator.succ).precision > base.precision && should_limit && base != result ? nil : result
|
@@ -430,6 +432,7 @@ module When::TM
|
|
430
432
|
options = TemporalPosition._options(options)
|
431
433
|
options[:frame] ||= 'Gregorian'
|
432
434
|
options[:frame] = When.Resource(options[:frame], '_c:') if options[:frame].kind_of?(String)
|
435
|
+
frame_len = options[:frame].indices.length
|
433
436
|
case args[0]
|
434
437
|
when String
|
435
438
|
options[:era_name] = When::EncodingConversion.to_internal_encoding(args.shift)
|
@@ -441,7 +444,7 @@ module When::TM
|
|
441
444
|
# 時間位置の生成
|
442
445
|
res = []
|
443
446
|
abbrs = Array(options[:abbr])
|
444
|
-
date = Array.new(
|
447
|
+
date = Array.new(frame_len-1) {
|
445
448
|
element = args.shift
|
446
449
|
abbr = abbrs.shift
|
447
450
|
res << element.to('year') if element.kind_of?(When::Coordinates::Residue)
|
@@ -458,8 +461,8 @@ module When::TM
|
|
458
461
|
end
|
459
462
|
}
|
460
463
|
parse = options.delete(:parse)
|
461
|
-
if parse && parse[:residue] && parse[:residue][
|
462
|
-
res << parse[:residue][
|
464
|
+
if parse && parse[:residue] && parse[:residue][frame_len]
|
465
|
+
res << parse[:residue][frame_len]
|
463
466
|
end
|
464
467
|
if args.length > 0
|
465
468
|
options[:clock] ||= Clock.local_time
|
@@ -838,8 +841,10 @@ module When::TM
|
|
838
841
|
else ; raise TypeError, "The right operand should be Numeric or Duration"
|
839
842
|
end
|
840
843
|
return _plus(other) if other.kind_of?(PeriodDuration)
|
841
|
-
|
842
|
-
|
844
|
+
options = self._attr
|
845
|
+
time = dynamical_time + other.duration
|
846
|
+
@frame.kind_of?(Calendar) ? @frame.jul_trans(JulianDate.dynamical_time(time, {:time_standard=>options[:time_standard]}), options) :
|
847
|
+
JulianDate.dynamical_time(time, options)
|
843
848
|
rescue RangeError
|
844
849
|
(@frame ^ self) + other
|
845
850
|
end
|
@@ -863,8 +868,10 @@ module When::TM
|
|
863
868
|
else ; raise TypeError, "The right operand should be Numeric, Duration or TemporalPosition"
|
864
869
|
end
|
865
870
|
return _plus(-other) if other.kind_of?(PeriodDuration)
|
866
|
-
|
867
|
-
|
871
|
+
options = self._attr
|
872
|
+
time = dynamical_time - other.duration
|
873
|
+
@frame.kind_of?(Calendar) ? @frame.jul_trans(JulianDate.dynamical_time(time, {:time_standard=>options[:time_standard]}), options) :
|
874
|
+
JulianDate.dynamical_time(time, options)
|
868
875
|
rescue RangeError
|
869
876
|
(@frame ^ self) - other
|
870
877
|
end
|
@@ -1065,12 +1072,13 @@ module When::TM
|
|
1065
1072
|
# @return [When::TM::TemporalPosition]
|
1066
1073
|
#
|
1067
1074
|
def apply_delayed_options(options)
|
1068
|
-
position
|
1075
|
+
position = self
|
1076
|
+
frame_len = frame.indices.length
|
1069
1077
|
if options[:residue]
|
1070
1078
|
options[:residue].keys.sort.each do |count|
|
1071
1079
|
options[:residue][count] = When.Residue(options[:residue][count]) unless options[:residue][count].kind_of?(When::Coordinates::Residue)
|
1072
1080
|
residue = options[:residue][count]
|
1073
|
-
if count ==
|
1081
|
+
if count == frame_len - 2
|
1074
1082
|
residue = residue.to('year')
|
1075
1083
|
position &= residue
|
1076
1084
|
else
|