lunchmoney 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/check_pipeline.yml +24 -0
  3. data/.github/workflows/ci.yml +1 -4
  4. data/.github/workflows/dependabot-rbi-updater.yml +3 -6
  5. data/.github/workflows/publish_gem.yml +14 -16
  6. data/.github/workflows/release_pipeline.yml +36 -0
  7. data/.rubocop.yml +5 -2
  8. data/Gemfile +1 -1
  9. data/Gemfile.lock +19 -18
  10. data/LICENSE +1 -1
  11. data/README.md +1 -1
  12. data/Rakefile +27 -0
  13. data/lib/lunchmoney/api.rb +160 -35
  14. data/lib/lunchmoney/calls/assets.rb +98 -0
  15. data/lib/lunchmoney/calls/base.rb +118 -0
  16. data/lib/lunchmoney/calls/budgets.rb +84 -0
  17. data/lib/lunchmoney/calls/categories.rb +196 -0
  18. data/lib/lunchmoney/calls/crypto.rb +50 -0
  19. data/lib/lunchmoney/calls/plaid_accounts.rb +40 -0
  20. data/lib/lunchmoney/calls/recurring_expenses.rb +29 -0
  21. data/lib/lunchmoney/calls/tags.rb +21 -0
  22. data/lib/lunchmoney/calls/transactions.rb +220 -0
  23. data/lib/lunchmoney/calls/users.rb +21 -0
  24. data/lib/lunchmoney/errors.rb +17 -1
  25. data/lib/lunchmoney/objects/asset.rb +92 -0
  26. data/lib/lunchmoney/objects/budget.rb +76 -0
  27. data/lib/lunchmoney/objects/category.rb +55 -0
  28. data/lib/lunchmoney/objects/child_category.rb +44 -0
  29. data/lib/lunchmoney/objects/child_transaction.rb +35 -0
  30. data/lib/lunchmoney/objects/config.rb +40 -0
  31. data/lib/lunchmoney/objects/crypto.rb +46 -0
  32. data/lib/lunchmoney/objects/crypto_base.rb +67 -0
  33. data/lib/lunchmoney/objects/data.rb +44 -0
  34. data/lib/lunchmoney/objects/object.rb +28 -0
  35. data/lib/lunchmoney/objects/plaid_account.rb +75 -0
  36. data/lib/lunchmoney/objects/recurring_expense.rb +68 -0
  37. data/lib/lunchmoney/objects/recurring_expense_base.rb +31 -0
  38. data/lib/lunchmoney/objects/split.rb +28 -0
  39. data/lib/lunchmoney/objects/tag.rb +24 -0
  40. data/lib/lunchmoney/objects/tag_base.rb +23 -0
  41. data/lib/lunchmoney/objects/transaction.rb +160 -0
  42. data/lib/lunchmoney/objects/transaction_base.rb +54 -0
  43. data/lib/lunchmoney/objects/transaction_modification_base.rb +32 -0
  44. data/lib/lunchmoney/objects/update_transaction.rb +47 -0
  45. data/lib/lunchmoney/objects/user.rb +38 -0
  46. data/lib/lunchmoney/version.rb +1 -1
  47. data/lunchmoney.gemspec +3 -4
  48. data/sorbet/rbi/gems/{minitest@5.21.2.rbi → minitest@5.22.2.rbi} +147 -144
  49. data/sorbet/rbi/gems/{rubocop-sorbet@0.7.6.rbi → rubocop-sorbet@0.7.7.rbi} +53 -6
  50. data/sorbet/rbi/gems/{rubocop@1.60.1.rbi → rubocop@1.60.2.rbi} +51 -30
  51. data/sorbet/rbi/gems/{toys@0.15.4.rbi → toys@0.15.5.rbi} +3 -3
  52. data/sorbet/rbi/gems/{webmock@3.19.1.rbi → webmock@3.20.0.rbi} +10 -10
  53. metadata +50 -47
  54. data/lib/lunchmoney/api_call.rb +0 -109
  55. data/lib/lunchmoney/assets/asset.rb +0 -89
  56. data/lib/lunchmoney/assets/asset_calls.rb +0 -96
  57. data/lib/lunchmoney/budget/budget.rb +0 -74
  58. data/lib/lunchmoney/budget/budget_calls.rb +0 -82
  59. data/lib/lunchmoney/budget/config.rb +0 -38
  60. data/lib/lunchmoney/budget/data.rb +0 -42
  61. data/lib/lunchmoney/categories/category/category.rb +0 -52
  62. data/lib/lunchmoney/categories/category/child_category.rb +0 -42
  63. data/lib/lunchmoney/categories/category_calls.rb +0 -195
  64. data/lib/lunchmoney/crypto/crypto/crypto.rb +0 -43
  65. data/lib/lunchmoney/crypto/crypto/crypto_base.rb +0 -65
  66. data/lib/lunchmoney/crypto/crypto_calls.rb +0 -49
  67. data/lib/lunchmoney/data_object.rb +0 -25
  68. data/lib/lunchmoney/plaid_accounts/plaid_account.rb +0 -73
  69. data/lib/lunchmoney/plaid_accounts/plaid_account_calls.rb +0 -38
  70. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense.rb +0 -65
  71. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense_base.rb +0 -29
  72. data/lib/lunchmoney/recurring_expenses/recurring_expense_calls.rb +0 -28
  73. data/lib/lunchmoney/tags/tag/tag.rb +0 -20
  74. data/lib/lunchmoney/tags/tag/tag_base.rb +0 -21
  75. data/lib/lunchmoney/tags/tag_calls.rb +0 -20
  76. data/lib/lunchmoney/transactions/transaction/child_transaction.rb +0 -31
  77. data/lib/lunchmoney/transactions/transaction/split.rb +0 -24
  78. data/lib/lunchmoney/transactions/transaction/transaction.rb +0 -156
  79. data/lib/lunchmoney/transactions/transaction/transaction_base.rb +0 -52
  80. data/lib/lunchmoney/transactions/transaction/transaction_modification_base.rb +0 -30
  81. data/lib/lunchmoney/transactions/transaction/update_transaction.rb +0 -43
  82. data/lib/lunchmoney/transactions/transaction_calls.rb +0 -218
  83. data/lib/lunchmoney/user/user.rb +0 -36
  84. data/lib/lunchmoney/user/user_calls.rb +0 -19
  85. /data/sorbet/rbi/gems/{crack@0.4.5.rbi → crack@1.0.0.rbi} +0 -0
  86. /data/sorbet/rbi/gems/{toys-core@0.15.4.rbi → toys-core@0.15.5.rbi} +0 -0
@@ -1,195 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "category/child_category"
5
- require_relative "category/category"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#categories
9
- class CategoryCalls < ApiCall
10
- # Valid query parameter formets for categories
11
- VALID_FORMATS = T.let(
12
- [
13
- "flattened",
14
- "nested",
15
- ],
16
- T::Array[String],
17
- )
18
-
19
- sig do
20
- params(
21
- format: T.nilable(T.any(String, Symbol)),
22
- ).returns(T.any(T::Array[LunchMoney::Category], LunchMoney::Errors))
23
- end
24
- def categories(format: nil)
25
- response = get("categories", query_params: categories_params(format:))
26
-
27
- api_errors = errors(response)
28
- return api_errors if api_errors.present?
29
-
30
- response.body[:categories].map do |category|
31
- category[:children]&.map! { |child_category| LunchMoney::Category.new(**child_category) }
32
-
33
- LunchMoney::Category.new(**category)
34
- end
35
- end
36
-
37
- sig { params(category_id: Integer).returns(T.any(LunchMoney::Category, LunchMoney::Errors)) }
38
- def category(category_id)
39
- response = get("categories/#{category_id}")
40
-
41
- api_errors = errors(response)
42
- return api_errors if api_errors.present?
43
-
44
- response.body[:children]&.map! { |child_category| LunchMoney::ChildCategory.new(**child_category) }
45
-
46
- LunchMoney::Category.new(**response.body)
47
- end
48
-
49
- sig do
50
- params(
51
- name: String,
52
- description: T.nilable(String),
53
- is_income: T::Boolean,
54
- exclude_from_budget: T::Boolean,
55
- exclude_from_totals: T::Boolean,
56
- archived: T::Boolean,
57
- group_id: T.nilable(Integer),
58
- ).returns(T.any(T::Hash[Symbol, Integer], LunchMoney::Errors))
59
- end
60
- def create_category(name:, description: nil, is_income: false, exclude_from_budget: false,
61
- exclude_from_totals: false, archived: false, group_id: nil)
62
- params = clean_params({
63
- name:,
64
- description:,
65
- is_income:,
66
- exclude_from_budget:,
67
- exclude_from_totals:,
68
- archived:,
69
- group_id:,
70
- })
71
- response = post("categories", params)
72
-
73
- api_errors = errors(response)
74
- return api_errors if api_errors.present?
75
-
76
- response.body
77
- end
78
-
79
- sig do
80
- params(
81
- name: String,
82
- description: T.nilable(String),
83
- is_income: T::Boolean,
84
- exclude_from_budget: T::Boolean,
85
- exclude_from_totals: T::Boolean,
86
- category_ids: T::Array[Integer],
87
- new_categories: T::Array[String],
88
- ).returns(T.any(T::Hash[Symbol, Integer], LunchMoney::Errors))
89
- end
90
- def create_category_group(name:, description: nil, is_income: false, exclude_from_budget: false,
91
- exclude_from_totals: false, category_ids: [], new_categories: [])
92
-
93
- params = {
94
- name:,
95
- description:,
96
- is_income:,
97
- exclude_from_budget:,
98
- exclude_from_totals:,
99
- category_ids:,
100
- new_categories:,
101
- }
102
-
103
- response = post("categories/group", params)
104
-
105
- api_errors = errors(response)
106
- return api_errors if api_errors.present?
107
-
108
- response.body
109
- end
110
-
111
- sig do
112
- params(
113
- category_id: Integer,
114
- name: T.nilable(String),
115
- description: T.nilable(String),
116
- is_income: T.nilable(T::Boolean),
117
- exclude_from_budget: T.nilable(T::Boolean),
118
- exclude_from_totals: T.nilable(T::Boolean),
119
- archived: T.nilable(T::Boolean),
120
- group_id: T.nilable(Integer),
121
- ).returns(T.any(T::Boolean, LunchMoney::Errors))
122
- end
123
- def update_category(category_id, name: nil, description: nil, is_income: nil, exclude_from_budget: nil,
124
- exclude_from_totals: nil, archived: nil, group_id: nil)
125
-
126
- params = clean_params({
127
- name:,
128
- description:,
129
- is_income:,
130
- exclude_from_budget:,
131
- exclude_from_totals:,
132
- archived:,
133
- group_id:,
134
- })
135
- response = put("categories/#{category_id}", params)
136
-
137
- api_errors = errors(response)
138
- return api_errors if api_errors.present?
139
-
140
- response.body
141
- end
142
-
143
- sig do
144
- params(
145
- group_id: Integer,
146
- category_ids: T::Array[Integer],
147
- new_categories: T::Array[String],
148
- ).returns(T.any(LunchMoney::Category, LunchMoney::Errors))
149
- end
150
- def add_to_category_group(group_id, category_ids: [], new_categories: [])
151
- params = {
152
- category_ids:,
153
- new_categories:,
154
- }
155
-
156
- response = post("categories/group/#{group_id}/add", params)
157
-
158
- api_errors = errors(response)
159
- return api_errors if api_errors.present?
160
-
161
- LunchMoney::Category.new(**response.body)
162
- end
163
-
164
- sig { params(category_id: Integer).returns(T.any(T::Boolean, LunchMoney::Errors)) }
165
- def delete_category(category_id)
166
- response = delete("categories/#{category_id}")
167
-
168
- api_errors = errors(response)
169
- return api_errors if api_errors.present?
170
-
171
- response.body
172
- end
173
-
174
- sig { params(category_id: Integer).returns(T.any(T::Boolean, LunchMoney::Errors)) }
175
- def force_delete_category(category_id)
176
- response = delete("categories/#{category_id}/force")
177
-
178
- api_errors = errors(response)
179
- return api_errors if api_errors.present?
180
-
181
- response.body
182
- end
183
-
184
- private
185
-
186
- sig { params(format: T.nilable(T.any(String, Symbol))).returns(T.nilable(T::Hash[Symbol, String])) }
187
- def categories_params(format:)
188
- return unless format
189
-
190
- raise(InvalidQueryParameter, "format must be either flattened or nested") if VALID_FORMATS.exclude?(format.to_s)
191
-
192
- { format: format.to_s }
193
- end
194
- end
195
- end
@@ -1,43 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#crypto-object
6
- class Crypto < CryptoBase
7
- include LunchMoney::Validators
8
-
9
- sig { returns(String) }
10
- attr_reader :balance_as_of
11
-
12
- sig { returns(String) }
13
- attr_accessor :currency, :status
14
-
15
- sig do
16
- params(
17
- created_at: String,
18
- source: String,
19
- name: String,
20
- balance: String,
21
- balance_as_of: String,
22
- currency: String,
23
- status: String,
24
- institution_name: T.nilable(String),
25
- id: T.nilable(Integer),
26
- zabo_account_id: T.nilable(Integer),
27
- display_name: T.nilable(String),
28
- ).void
29
- end
30
- def initialize(created_at:, source:, name:, balance:, balance_as_of:, currency:,
31
- status:, institution_name: nil, id: nil, zabo_account_id: nil, display_name: nil)
32
- super(created_at:, source:, name:, balance:, institution_name:, id:, zabo_account_id:, display_name:)
33
- @balance_as_of = T.let(validate_iso8601!(balance_as_of), String)
34
- @currency = currency
35
- @status = status
36
- end
37
-
38
- sig { params(time: String).void }
39
- def balance_as_of=(time)
40
- @balance_as_of = validate_iso8601!(time)
41
- end
42
- end
43
- end
@@ -1,65 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#crypto-object
6
- class CryptoBase < LunchMoney::DataObject
7
- include LunchMoney::Validators
8
-
9
- sig { returns(T.nilable(Integer)) }
10
- attr_accessor :id, :zabo_account_id
11
-
12
- sig { returns(String) }
13
- attr_reader :source, :created_at
14
-
15
- sig { returns(String) }
16
- attr_accessor :name, :balance
17
-
18
- sig { returns(T.nilable(String)) }
19
- attr_accessor :display_name, :institution_name
20
-
21
- # Valid crypto source types
22
- VALID_SOURCES = T.let(
23
- [
24
- "synced",
25
- "manual",
26
- ],
27
- T::Array[String],
28
- )
29
-
30
- sig do
31
- params(
32
- created_at: String,
33
- source: String,
34
- name: String,
35
- balance: String,
36
- institution_name: T.nilable(String),
37
- id: T.nilable(Integer),
38
- zabo_account_id: T.nilable(Integer),
39
- display_name: T.nilable(String),
40
- ).void
41
- end
42
- def initialize(created_at:, source:, name:, balance:, institution_name: nil, id: nil, zabo_account_id: nil,
43
- display_name: nil)
44
- super()
45
- @created_at = T.let(validate_iso8601!(created_at), String)
46
- @source = T.let(validate_one_of!(source, VALID_SOURCES), String)
47
- @name = name
48
- @balance = balance
49
- @institution_name = institution_name
50
- @id = id
51
- @zabo_account_id = zabo_account_id
52
- @display_name = display_name
53
- end
54
-
55
- sig { params(name: String).void }
56
- def source=(name)
57
- @source = validate_one_of!(name, VALID_SOURCES)
58
- end
59
-
60
- sig { params(time: String).void }
61
- def created_at=(time)
62
- @created_at = validate_iso8601!(time)
63
- end
64
- end
65
- end
@@ -1,49 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "crypto/crypto_base"
5
- require_relative "crypto/crypto"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#crypto
9
- class CryptoCalls < ApiCall
10
- sig { returns(T.any(T::Array[LunchMoney::Crypto], LunchMoney::Errors)) }
11
- def crypto
12
- response = get("crypto")
13
-
14
- api_errors = errors(response)
15
- return api_errors if api_errors.present?
16
-
17
- response.body[:crypto].map do |crypto|
18
- LunchMoney::Crypto.new(**crypto)
19
- end
20
- end
21
-
22
- sig do
23
- params(
24
- crypto_id: Integer,
25
- name: T.nilable(String),
26
- display_name: T.nilable(String),
27
- institution_name: T.nilable(String),
28
- balance: T.nilable(String),
29
- currency: T.nilable(String),
30
- ).returns(T.any(LunchMoney::CryptoBase, LunchMoney::Errors))
31
- end
32
- def update_crypto(crypto_id, name: nil, display_name: nil, institution_name: nil, balance: nil, currency: nil)
33
- params = clean_params({
34
- name:,
35
- display_name:,
36
- institution_name:,
37
- balance:,
38
- currency:,
39
- })
40
-
41
- response = put("crypto/manual/#{crypto_id}", params)
42
-
43
- api_errors = errors(response)
44
- return api_errors if api_errors.present?
45
-
46
- LunchMoney::CryptoBase.new(**response.body)
47
- end
48
- end
49
- end
@@ -1,25 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Base data object for the objects returned and used when calling the LunchMoney API
6
- class DataObject
7
- sig { params(symbolize_keys: T::Boolean).returns(T::Hash[String, T.untyped]) }
8
- def serialize(symbolize_keys: false)
9
- ivars = instance_variables
10
-
11
- output = {}
12
-
13
- ivars.each do |ivar|
14
- key = ivar.to_s.gsub("@", "")
15
- key = key.to_sym if symbolize_keys
16
-
17
- value = instance_variable_get(ivar)
18
-
19
- output[key] = value
20
- end
21
-
22
- output
23
- end
24
- end
25
- end
@@ -1,73 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#plaid-accounts-object
6
- class PlaidAccount < LunchMoney::DataObject
7
- sig { returns(Integer) }
8
- attr_accessor :id
9
-
10
- sig { returns(String) }
11
- attr_accessor :date_linked,
12
- :name,
13
- :type,
14
- :mask,
15
- :institution_name,
16
- :status,
17
- :balance,
18
- :currency,
19
- :balance_last_update,
20
- :display_name,
21
- :plaid_last_successful_update
22
-
23
- sig { returns(T.nilable(String)) }
24
- attr_accessor :subtype, :import_start_date, :last_fetch, :last_import
25
-
26
- sig { returns(T.nilable(Integer)) }
27
- attr_accessor :limit
28
-
29
- sig do
30
- params(
31
- date_linked: String,
32
- name: String,
33
- type: String,
34
- mask: String,
35
- institution_name: String,
36
- status: String,
37
- balance: String,
38
- currency: String,
39
- balance_last_update: String,
40
- display_name: String,
41
- id: Integer,
42
- plaid_last_successful_update: String,
43
- last_import: T.nilable(String),
44
- limit: T.nilable(Integer),
45
- subtype: T.nilable(String),
46
- import_start_date: T.nilable(String),
47
- last_fetch: T.nilable(String),
48
- ).void
49
- end
50
- def initialize(date_linked:, name:, type:, mask:, institution_name:, status:, balance:, currency:,
51
- balance_last_update:, display_name:, id:, plaid_last_successful_update:, last_import: nil, limit: nil,
52
- subtype: nil, import_start_date: nil, last_fetch: nil)
53
- super()
54
- @id = id
55
- @date_linked = date_linked
56
- @name = name
57
- @display_name = display_name
58
- @type = type
59
- @subtype = subtype
60
- @mask = mask
61
- @institution_name = institution_name
62
- @status = status
63
- @limit = limit
64
- @balance = balance
65
- @currency = currency
66
- @balance_last_update = balance_last_update
67
- @import_start_date = import_start_date
68
- @last_import = last_import
69
- @last_fetch = last_fetch
70
- @plaid_last_successful_update = plaid_last_successful_update
71
- end
72
- end
73
- end
@@ -1,38 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "plaid_account"
5
-
6
- module LunchMoney
7
- # https://lunchmoney.dev/#plaid-accounts
8
- class PlaidAccountCalls < ApiCall
9
- sig { returns(T.any(T::Array[LunchMoney::PlaidAccount], LunchMoney::Errors)) }
10
- def plaid_accounts
11
- response = get("plaid_accounts")
12
-
13
- api_errors = errors(response)
14
- return api_errors if api_errors.present?
15
-
16
- response.body[:plaid_accounts].map do |plaid_account|
17
- LunchMoney::PlaidAccount.new(**plaid_account)
18
- end
19
- end
20
-
21
- sig do
22
- params(
23
- start_date: T.nilable(String),
24
- end_date: T.nilable(String),
25
- plaid_account_id: T.nilable(Integer),
26
- ).returns(T.any(T::Boolean, LunchMoney::Errors))
27
- end
28
- def plaid_accounts_fetch(start_date: nil, end_date: nil, plaid_account_id: nil)
29
- params = clean_params({ start_date:, end_date:, plaid_account_id: })
30
- response = post("plaid_accounts/fetch", params)
31
-
32
- api_errors = errors(response)
33
- return api_errors if api_errors.present?
34
-
35
- response.body
36
- end
37
- end
38
- end
@@ -1,65 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#recurring-expenses-object
6
- class RecurringExpense < RecurringExpenseBase
7
- sig { returns(Integer) }
8
- attr_accessor :id
9
-
10
- sig { returns(T.nilable(String)) }
11
- attr_accessor :start_date, :end_date, :description, :original_name
12
-
13
- sig { returns(String) }
14
- attr_accessor :cadence, :billing_date, :type, :source, :created_at
15
-
16
- sig { returns(T.nilable(Integer)) }
17
- attr_accessor :plaid_account_id, :asset_id, :transaction_id, :category_id
18
-
19
- sig do
20
- params(
21
- cadence: String,
22
- payee: String,
23
- amount: String,
24
- currency: String,
25
- billing_date: String,
26
- type: String,
27
- source: String,
28
- id: Integer,
29
- created_at: String,
30
- category_id: T.nilable(Integer),
31
- start_date: T.nilable(String),
32
- end_date: T.nilable(String),
33
- description: T.nilable(String),
34
- original_name: T.nilable(String),
35
- plaid_account_id: T.nilable(Integer),
36
- asset_id: T.nilable(Integer),
37
- transaction_id: T.nilable(Integer),
38
- to_base: T.nilable(Number),
39
- ).void
40
- end
41
- def initialize(cadence:, payee:, amount:, currency:, billing_date:, type:, source:, id:, created_at:,
42
- category_id: nil, start_date: nil, end_date: nil, description: nil, original_name: nil, plaid_account_id: nil,
43
- asset_id: nil, transaction_id: nil, to_base: nil)
44
- super(payee:, amount:, currency:, to_base:)
45
- @cadence = cadence
46
- @payee = payee
47
- @amount = amount
48
- @currency = currency
49
- @billing_date = billing_date
50
- @type = type
51
- @source = source
52
- @id = id
53
- @category_id = category_id
54
- @created_at = created_at
55
- @start_date = start_date
56
- @end_date = end_date
57
- @description = description
58
- @original_name = original_name
59
- @plaid_account_id = plaid_account_id
60
- @asset_id = asset_id
61
- @transaction_id = transaction_id
62
- @to_base = to_base
63
- end
64
- end
65
- end
@@ -1,29 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#recurring-expenses-object
6
- class RecurringExpenseBase < LunchMoney::DataObject
7
- sig { returns(String) }
8
- attr_accessor :payee, :currency, :amount
9
-
10
- sig { returns(T.nilable(Number)) }
11
- attr_accessor :to_base
12
-
13
- sig do
14
- params(
15
- payee: String,
16
- amount: String,
17
- currency: String,
18
- to_base: T.nilable(Number),
19
- ).void
20
- end
21
- def initialize(payee:, amount:, currency:, to_base:)
22
- super()
23
- @payee = payee
24
- @amount = amount
25
- @currency = currency
26
- @to_base = to_base
27
- end
28
- end
29
- end
@@ -1,28 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "recurring_expense/recurring_expense_base"
5
- require_relative "recurring_expense/recurring_expense"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#recurring-expenses
9
- class RecurringExpenseCalls < ApiCall
10
- sig do
11
- params(
12
- start_date: T.nilable(String),
13
- end_date: T.nilable(String),
14
- ).returns(T.any(T::Array[LunchMoney::RecurringExpense], LunchMoney::Errors))
15
- end
16
- def recurring_expenses(start_date: nil, end_date: nil)
17
- params = clean_params({ start_date:, end_date: })
18
- response = get("recurring_expenses", query_params: params)
19
-
20
- api_errors = errors(response)
21
- return api_errors if api_errors.present?
22
-
23
- response.body[:recurring_expenses].map do |recurring_expense|
24
- LunchMoney::RecurringExpense.new(**recurring_expense)
25
- end
26
- end
27
- end
28
- end
@@ -1,20 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#tags-object
6
- class Tag < TagBase
7
- sig { returns(T.nilable(String)) }
8
- attr_accessor :description
9
-
10
- sig { returns(T::Boolean) }
11
- attr_accessor :archived
12
-
13
- sig { params(id: Integer, name: String, archived: T::Boolean, description: T.nilable(String)).void }
14
- def initialize(id:, name:, archived:, description: nil)
15
- super(id:, name:)
16
- @archived = archived
17
- @description = description
18
- end
19
- end
20
- end
@@ -1,21 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#tags-object without some fields. This is used within field returns of other objects like
6
- # field returns of other objects like transactions
7
- class TagBase < LunchMoney::DataObject
8
- sig { returns(Integer) }
9
- attr_accessor :id
10
-
11
- sig { returns(String) }
12
- attr_accessor :name
13
-
14
- sig { params(id: Integer, name: String).void }
15
- def initialize(id:, name:)
16
- super()
17
- @id = id
18
- @name = name
19
- end
20
- end
21
- end
@@ -1,20 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "tag/tag_base"
5
- require_relative "tag/tag"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#tags
9
- class TagCalls < ApiCall
10
- sig { returns(T.any(T::Array[LunchMoney::Tag], LunchMoney::Errors)) }
11
- def tags
12
- response = get("tags")
13
-
14
- api_errors = errors(response)
15
- return api_errors if api_errors.present?
16
-
17
- response.body.map { |tag| LunchMoney::Tag.new(**tag) }
18
- end
19
- end
20
- end