From 10ebac99e86a743d2680c3e97861da663dbea7b8 Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Thu, 9 Mar 2023 14:25:43 -0800 Subject: [PATCH 1/4] Add annotations for shopify-money gem --- index.json | 5 +++ rbi/annotations/shopify-money.rbi | 51 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 rbi/annotations/shopify-money.rbi diff --git a/index.json b/index.json index 28833d74..4ca6d792 100644 --- a/index.json +++ b/index.json @@ -107,6 +107,11 @@ "rainbow/version" ] }, + "shopify-money": { + "requires": [ + "money" + ] + }, "sidekiq": { "dependencies": [ "rails" diff --git a/rbi/annotations/shopify-money.rbi b/rbi/annotations/shopify-money.rbi new file mode 100644 index 00000000..515c5787 --- /dev/null +++ b/rbi/annotations/shopify-money.rbi @@ -0,0 +1,51 @@ +# typed: strong + +class Money + sig { params(other: T.untyped).returns(Money) } + def +(other); end + + sig { params(other: T.untyped).returns(Money) } + def -(other); end + + sig { params(numeric: Numeric).returns(Money) } + def *(numeric); end + + sig { params(numeric: Numeric).returns(T.noreturn) } + def /(numeric); end + + sig { returns(String) } + def inspect; end + + sig { params(other: T.untyped).returns(T::Boolean) } + def ==(other); end + + sig { params(other: T.untyped).returns(T::Boolean) } + def eql?(other); end + + sig { returns(Money) } + def abs; end + + sig { returns(Money) } + def floor; end + + sig { params(ndigits: Integer).returns(Money) } + def round(ndigits); end + + sig { params(rate: Numeric).returns(Money) } + def fraction(rate); end + + sig { params(splits: T::Array[Numeric], strategy: Symbol).returns(T::Array[Money]) } + def allocate(splits, strategy); end + + sig { params(maximums: T::Array[Numeric]).returns(T::Array[Money]) } + def allocate_max_amounts(maximums); end + + sig { params(num: Numeric).returns(T::Array[Money]) } + def split(num); end + + sig { params(num: Numeric).returns(T::Hash[Money, Numeric]) } + def calculate_splits(num); end + + sig { params(min: Numeric, max: Numeric).returns(Money) } + def clamp(min, max); end +end From 007a5fff1c5de9c6e81403fb253ef55c5e45759a Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Thu, 9 Mar 2023 16:27:18 -0800 Subject: [PATCH 2/4] Add more signatures --- rbi/annotations/shopify-money.rbi | 124 +++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/rbi/annotations/shopify-money.rbi b/rbi/annotations/shopify-money.rbi index 515c5787..56f1b6de 100644 --- a/rbi/annotations/shopify-money.rbi +++ b/rbi/annotations/shopify-money.rbi @@ -1,6 +1,103 @@ # typed: strong class Money + sig { returns(BigDecimal) } + attr_reader :value + + sig { returns(T.any(Money::Currency, Money::NullCurrency)) } + attr_reader :currency + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(T::Boolean) } + def zero?(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(T::Boolean) } + def nonzero?(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(T::Boolean) } + def positive?(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(T::Boolean) } + def negative?(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(Integer) } + def to_i(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(Float) } + def to_f(*args, **_arg1, &block); end + + # @method_missing: delegated to BigDecimal + sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(Integer) } + def hash(*args, **_arg1, &block); end + + class << self + sig { params(block: T.nilable(T.proc.params(config: Money::Config).void)).void } + def configure(&block); end + + sig do + params( + value: T.nilable(T.any(Money, Numeric, String)), + currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + ) + .returns(Money) + end + def new(value = 0, currency = nil); end + + sig do + params( + subunits: T.nilable(T.any(Money, Numeric, String)), + currency_iso: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + format: Symbol, + ) + .returns(Money) + end + def from_subunits(subunits, currency_iso, format: :iso4217); end + + sig { params(money1: Money, money2: Money).returns(Rational) } + def rational(money1, money2); end + + sig { returns(T.nilable(T.any(Money::Currency, Money::NullCurrency, String))) } + def current_currency; end + + sig { params(currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String))).void } + def current_currency=(currency); end + + sig do + params( + new_currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + block: T.nilable(T.proc.void), + ) + .void + end + def with_currency(new_currency, &block); end + end + + sig do + params( + value: T.nilable(T.any(Money, Numeric, String)), + currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + ) + .void + end + def initialize(value, currency); end + + sig { params(format: Symbol).returns(Integer) } + def subunits(format: :iso4217); end + + sig { returns(T::Boolean) } + def no_currency?; end + + sig { returns(Money) } + def -@; end + + sig { params(other: T.untyped).returns(T.nilable(Integer)) } + def <=>(other); end + sig { params(other: T.untyped).returns(Money) } def +(other); end @@ -22,6 +119,21 @@ class Money sig { params(other: T.untyped).returns(T::Boolean) } def eql?(other); end + sig { params(currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String))).returns(Money) } + def to_money(currency = nil); end + + sig { returns(BigDecimal) } + def to_d; end + + sig { params(style: T.nilable(Symbol)).returns(String) } + def to_fs(style = nil); end + + sig { params(options: T.nilable(T::Hash[Symbol, T.untyped])).returns(String) } + def to_json(options = nil); end + + sig { params(options: T.nilable(T::Hash[Symbol, T.untyped])).returns(T::Hash[Symbol, String]) } + def as_json(options = nil); end + sig { returns(Money) } def abs; end @@ -29,7 +141,7 @@ class Money def floor; end sig { params(ndigits: Integer).returns(Money) } - def round(ndigits); end + def round(ndigits = 0); end sig { params(rate: Numeric).returns(Money) } def fraction(rate); end @@ -49,3 +161,13 @@ class Money sig { params(min: Numeric, max: Numeric).returns(Money) } def clamp(min, max); end end + +class Numeric + sig { params(currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String))).returns(Money) } + def to_money(currency = nil); end +end + +class String + sig { params(currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String))).returns(Money) } + def to_money(currency = nil); end +end From 225b82f10c445f5a74ef9ff579170534ac5a9adc Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Thu, 9 Mar 2023 16:35:42 -0800 Subject: [PATCH 3/4] Fix Rubocop error --- rbi/annotations/shopify-money.rbi | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rbi/annotations/shopify-money.rbi b/rbi/annotations/shopify-money.rbi index 56f1b6de..98c7d902 100644 --- a/rbi/annotations/shopify-money.rbi +++ b/rbi/annotations/shopify-money.rbi @@ -7,6 +7,15 @@ class Money sig { returns(T.any(Money::Currency, Money::NullCurrency)) } attr_reader :currency + sig do + params( + value: T.nilable(T.any(Money, Numeric, String)), + currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + ) + .void + end + def initialize(value, currency); end + # @method_missing: delegated to BigDecimal sig { params(args: T.untyped, _arg1: T.untyped, block: T.nilable(T.proc.void)).returns(T::Boolean) } def zero?(*args, **_arg1, &block); end @@ -77,15 +86,6 @@ class Money def with_currency(new_currency, &block); end end - sig do - params( - value: T.nilable(T.any(Money, Numeric, String)), - currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), - ) - .void - end - def initialize(value, currency); end - sig { params(format: Symbol).returns(Integer) } def subunits(format: :iso4217); end From 3ae83b58c7364d46e5daa391fbc6717e5398b828 Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Mon, 13 Mar 2023 16:07:47 -0700 Subject: [PATCH 4/4] Make `with_currency` signature generic --- rbi/annotations/shopify-money.rbi | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rbi/annotations/shopify-money.rbi b/rbi/annotations/shopify-money.rbi index 98c7d902..a5b26bf8 100644 --- a/rbi/annotations/shopify-money.rbi +++ b/rbi/annotations/shopify-money.rbi @@ -77,11 +77,12 @@ class Money def current_currency=(currency); end sig do - params( - new_currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), - block: T.nilable(T.proc.void), - ) - .void + type_parameters(:U) + .params( + new_currency: T.nilable(T.any(Money::Currency, Money::NullCurrency, String)), + block: T.nilable(T.proc.returns(T.type_parameter(:U))), + ) + .returns(T.type_parameter(:U)) end def with_currency(new_currency, &block); end end