Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support more formats #20

Merged
merged 9 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ GEM
parser (3.3.0.3)
ast (~> 2.4.1)
racc
pry (0.14.1)
pry (0.14.2)
coderay (~> 1.1)
method_source (~> 1.0)
racc (1.7.3)
Expand Down
11 changes: 9 additions & 2 deletions lib/emendate/date_part_tagger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,19 @@ def full_match_tagger
proc { tag_numeric_month }
when /^year number1or2$/
proc { tag_year_plus_numeric_month_season_or_year }
when /^number1or2$/
proc do
year = Emendate::ShortYearHandler.call(result[0])
result.replace_x_with_new(x: result[0], new: year)
end
end
end

def full_match_date_part_tagger
# case result.date_part_types.sort.join(" ")
# end
case result.date_part_types.join(" ")
when "number1or2 year"
proc { tag_numeric_month }
end
end

def partial_match_tagger
Expand Down
25 changes: 8 additions & 17 deletions lib/emendate/date_segmenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ def call
else
transform_separators(separators)
end

rescue Emendate::ForbiddenSegmentAdditionError => e
Failure(e.to_s)
else
Success(result)
end

Expand Down Expand Up @@ -113,34 +115,23 @@ def apply_modifier(type, direction)
modifier = working[1]
end

addable = datetype.addable?(type)

case direction
when :forward
if addable
datetype.prepend_source_token(modifier)
else
add_as_unprocessable(modifier)
end
datetype.prepend_source_token(modifier)
result << datetype
working.shift(2)
when :backward
if addable
datetype.append_source_token(modifier)
result << datetype
working.shift(2)
else
result << datetype
working.shift
end
datetype.append_source_token(modifier)
result << datetype
working.shift(2)
end

apply_modifiers(type)
end

def add_as_unprocessable(modifier)
result << Emendate::Segment.new(
type: "unprocessable_#{modifier_type}", sources: [modifier]
type: "forbidden_#{modifier.type}", sources: [modifier]
)
end

Expand Down
38 changes: 17 additions & 21 deletions lib/emendate/date_types/century.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,6 @@ def initialize(sources:)
@granularity_level = :year
end

# @return [Date]
def earliest = Date.new(earliest_year, 1, 1)

# @return [Date]
def latest = Date.new(latest_year, 12, 31)

# @return [true]
def range? = true

Expand Down Expand Up @@ -67,37 +61,39 @@ def get_set_type
end
end

def earliest_year
year = start_year
case partial_indicator
def earliest_detail
year = case partial_indicator
when nil
year
start_year
when :early
year
start_year
when :mid
year + 33
start_year + 33
when :late
year + 66
start_year + 66
end
Date.new(year, 1, 1)
end

def latest_year
year = start_year
case partial_indicator
def latest_detail
year = case partial_indicator
when nil
year + 99
start_year + 99
when :early
year + 33
start_year + 33
when :mid
year + 66
start_year + 66
when :late
year + 99
start_year + 99
end
Date.new(year, -1, -1)
end

def start_year
base = (literal.to_s + "00").to_i
(century_type == :name) ? base + 1 : base
return base unless century_type == :name

base + 1
end
end
end
Expand Down
54 changes: 49 additions & 5 deletions lib/emendate/date_types/datetypeable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,19 @@ module DateTypes
# Classes including this module should define the following instance
# methods:
#
# * earliest (Date)
# * latest (Date)
# * range? (Boolean)
# * range? (Boolean, public)
# * addable_token_types(override, Array<Symbol>, private)
#
# For date types that return partial or before/after (range switch) date
# values, the following must be defined in order for the default, shared
# :earliest and :latest methods to work:
#
# * granularity_level (Symbol, public, options: :year, :year_month,
# :year_season, :year_month_day)
# * earliest_detail (Date, private)
# * latest_detail (Date, private)
#
# See {Year} for an fully implemented example.
#
# Validatable date types run specified checks on initialization and
# raise a {Emendate::DateTypeCreationError} if any checks fail. Validatable
Expand Down Expand Up @@ -42,7 +52,7 @@ module Datetypeable
# @todo Rename to :prepend_source_segment
def prepend_source_token(segment)
unless addable?(segment.type)
raise Emendate::DisallowedTokenAdditionError.new(
fail Emendate::ForbiddenSegmentAdditionError.new(
segment, __method__, self.class
)
end
Expand All @@ -57,7 +67,7 @@ def prepend_source_token(segment)
# @param token [{Segment}] or subclasses of {Segment}
def append_source_token(token)
unless addable_token_types.include?(token.type)
raise Emendate::DisallowedTokenAdditionError.new(
fail Emendate::ForbiddenSegmentAdditionError.new(
token, __method__, self.class
)
end
Expand Down Expand Up @@ -114,6 +124,30 @@ def lexeme
sources.empty? ? "" : sources.lexeme
end

# @return [Date]
def earliest
return earliest_detail unless range_switch

case range_switch
when :before
earliest_for_before
when :after
latest_detail.next
end
end

# @return [Date]
def latest
return latest_detail unless range_switch

case range_switch
when :before
earliest_detail.prev_day
when :after
Date.today
end
end

# @return [String] representation of earliest year
def earliest_at_granularity = at_granularity(:earliest)

Expand Down Expand Up @@ -229,6 +263,15 @@ def has_one_part_of_type(type)
end
end

# @return [Date]
def earliest_for_before
if Emendate.options.before_date_treatment == :point
latest
else
Emendate.options.open_unknown_start_date
end
end

def at_granularity(point)
gl = get_granularity_level(point)
return unless gl
Expand All @@ -240,6 +283,7 @@ def at_granularity(point)
when :year_month
"#{full.year}-#{full.month.to_s.rjust(2, "0")}"
when :year_season
"#{full.year}-#{full.month.to_s.rjust(2, "0")}"
when :year_month_day
"#{full.year}-#{full.month.to_s.rjust(2, "0")}-"\
"#{full.day.to_s.rjust(2, "0")}"
Expand Down
43 changes: 17 additions & 26 deletions lib/emendate/date_types/decade.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,8 @@ def initialize(sources:)
@granularity_level = :year
end

def earliest
Date.new(earliest_year, 1, 1)
end

def latest
Date.new(latest_year, 12, 31)
end

def range?
true
end
# @return [true]
def range? = true

private

Expand All @@ -60,36 +51,36 @@ def set_literal
end
end

def decade_earliest_year
def start_year
(literal.to_s + "0").to_i
end

def earliest_year
year = decade_earliest_year
case partial_indicator
def earliest_detail
year = case partial_indicator
when nil
year
start_year
when :early
year
start_year
when :mid
year + 4
start_year + 4
when :late
year + 7
start_year + 7
end
Date.new(year, 1, 1)
end

def latest_year
year = decade_earliest_year
case partial_indicator
def latest_detail
year = case partial_indicator
when nil
year + 9
start_year + 9
when :early
year + 3
start_year + 3
when :mid
year + 6
start_year + 6
when :late
year + 9
start_year + 9
end
Date.new(year, -1, -1)
end
end
end
Expand Down
40 changes: 30 additions & 10 deletions lib/emendate/date_types/millennium.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,6 @@ def initialize(sources:)
@granularity_level = :year
end

def earliest
yr = "#{literal}000".to_i
Date.new(yr, 1, 1)
end

def latest
yr = "#{literal}999".to_i
Date.new(yr, 12, 31)
end

def range?
true
end
Expand Down Expand Up @@ -60,6 +50,36 @@ def set_literal
datepart.literal
end
end

def earliest_detail
year = case partial_indicator
when nil
start_year
when :early
start_year
when :mid
start_year + 333
when :late
start_year + 666
end
Date.new(year, 1, 1)
end

def latest_detail
year = case partial_indicator
when nil
start_year + 999
when :early
start_year + 333
when :mid
start_year + 666
when :late
start_year + 999
end
Date.new(year, -1, -1)
end

def start_year = (literal.to_s + "000").to_i
end
end
end
6 changes: 0 additions & 6 deletions lib/emendate/date_types/range.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,6 @@ def earliest = startdate.earliest
# @return [Date]
def latest = enddate.latest

# @return [Date]
def earliest = startdate.earliest

# @return [Date]
def latest = enddate.latest

# @return [true]
def range? = true

Expand Down
Loading
Loading