Class: FindSubscriptions::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/find_subscriptions/cli.rb

Overview

Command-line interface: parses options, loads CSVs, runs detectors, and reports subscriptions.

Constant Summary collapse

SORT_PROCS =
{
  'count_asc' => ->(subs) { subs.sort_by { |sub| sub[:count] } },
  'count_desc' => ->(subs) { subs.sort_by { |sub| -sub[:count] } },
  'first_asc' => ->(subs) { subs.sort_by { |sub| sub[:since] } },
  'first_desc' => ->(subs) { subs.sort_by { |sub| sub[:since] }.reverse },
  'last_asc' => ->(subs) { subs.sort_by { |sub| sub[:until] } },
  'last_desc' => ->(subs) { subs.sort_by { |sub| sub[:until] }.reverse }
}.freeze
VALID_SORT_ORDERS =
SORT_PROCS.keys.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.run(argv) ⇒ Object



39
40
41
# File 'lib/find_subscriptions/cli.rb', line 39

def self.run(argv)
  new.run(argv)
end

Instance Method Details

#run(argv) ⇒ Object

Raises:

  • (ArgumentError)


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/find_subscriptions/cli.rb', line 43

def run(argv)
  options, user_schemas = parse_options(argv)

  files = options.fetch(:files)
  raise ArgumentError, 'No files provided' if files.empty?

  registry = build_registry(user_schemas)
  transactions = load_transactions(files, registry, options[:schema])
  transactions = filter_by_date_range(transactions, options[:from_date], options[:to_date])
  payee_normalizer = PayeeNormalizer.from_yaml(options[:known_payees_path])

  subscriptions = detect_subscriptions(transactions, payee_normalizer, options)

  reporter_for(options[:format]).print(subscriptions)
end