ynaby 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b21b856bead07531e58c55c7727c679d46ed48801f8f127ba6ccf042d6ab337b
4
+ data.tar.gz: b7d932ba0ff729086a73ee8dd89408e5313e1104e5f2e80645df523938e3066e
5
+ SHA512:
6
+ metadata.gz: 978f68ad287963620e267543d765eecc2a06bf7971cdf83efdd26cad1feb451cbd92435d9872fa8f962b518e9a3e852b759522d37f33d972e24f404150a455ff
7
+ data.tar.gz: '05819dd495b22761d5ec63aac8ddd785f5b5dee3f5038800e8f7fecf689ea8f4d3dc00d61396e8282a77991d271e58127286225f92709834feca847a845cdd67'
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.0
5
+ before_install: gem install bundler -v 1.16.1
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in ynaby.gemspec
6
+ gemspec
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ynaby (0.3.0)
5
+ ynab (~> 0.7.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.5.2)
11
+ public_suffix (>= 2.0.2, < 4.0)
12
+ coderay (1.1.2)
13
+ crack (0.4.3)
14
+ safe_yaml (~> 1.0.0)
15
+ diff-lcs (1.3)
16
+ ethon (0.11.0)
17
+ ffi (>= 1.3.0)
18
+ ffi (1.9.25)
19
+ hashdiff (0.3.7)
20
+ json (2.1.0)
21
+ method_source (0.9.0)
22
+ pry (0.11.3)
23
+ coderay (~> 1.1.0)
24
+ method_source (~> 0.9.0)
25
+ public_suffix (3.0.3)
26
+ rake (10.4.2)
27
+ rspec (3.7.0)
28
+ rspec-core (~> 3.7.0)
29
+ rspec-expectations (~> 3.7.0)
30
+ rspec-mocks (~> 3.7.0)
31
+ rspec-core (3.7.1)
32
+ rspec-support (~> 3.7.0)
33
+ rspec-expectations (3.7.0)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.7.0)
36
+ rspec-mocks (3.7.0)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.7.0)
39
+ rspec-support (3.7.1)
40
+ safe_yaml (1.0.4)
41
+ typhoeus (1.3.0)
42
+ ethon (>= 0.9.0)
43
+ vcr (4.0.0)
44
+ webmock (3.4.2)
45
+ addressable (>= 2.3.6)
46
+ crack (>= 0.3.2)
47
+ hashdiff
48
+ ynab (0.7.0)
49
+ json (~> 2.1, >= 2.1.0)
50
+ typhoeus (~> 1.0, >= 1.0.1)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ bundler (~> 1.16)
57
+ pry (~> 0.11.3)
58
+ rake (~> 10.0)
59
+ rspec (~> 3.0)
60
+ vcr (~> 4.0.0)
61
+ webmock (~> 3.4.2)
62
+ ynaby!
63
+
64
+ BUNDLED WITH
65
+ 1.16.1
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Rafael Millan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,62 @@
1
+ # Ynaby
2
+
3
+ Unofficial wrapper gem of the [YNAB Ruby SDK](https://github.com/ynab/ynab-sdk-ruby) for modifying and creating transactions.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ynaby'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ynaby
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ user = Ynaby::User.new("my_api_token")
25
+
26
+ user.budgets # All budgets
27
+ budget = user.budget("budget_id") # Find budget
28
+
29
+ budget.accounts # All accounts
30
+ account = budget.account("account_id") # Find account
31
+
32
+ account.transactions # All transactions
33
+ account.transaction(since: Date.new(2018, 9, 28)) # Transactions since date
34
+ transaction = account.transaction("transaction_id") # Find transaction
35
+
36
+ transaction.memo = "New memo"
37
+ transaction.update # Updates the transaction
38
+
39
+ new_transaction = Ynaby::Transaction.new(
40
+ date: Date.new(2018, 9, 15),
41
+ amount: -10000,
42
+ payee_name: "Jerry Seinfeld",
43
+ account: account
44
+ )
45
+ new_transaction.upload # Creates a new transaction
46
+
47
+ account.bulk_upload_transactions([new_transaction]) # Bulk upload
48
+ ```
49
+
50
+ ## Development
51
+
52
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
53
+
54
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
55
+
56
+ ## Contributing
57
+
58
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rafaelmillan/ynaby.
59
+
60
+ ## License
61
+
62
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ynaby"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,7 @@
1
+ require "ynaby/version"
2
+
3
+ require "ynaby/base"
4
+ require "ynaby/account"
5
+ require "ynaby/budget"
6
+ require "ynaby/transaction"
7
+ require "ynaby/user"
@@ -0,0 +1,127 @@
1
+ module Ynaby
2
+ class Account < Base
3
+ attr_reader :id, :name, :type, :on_budget, :closed, :note, :balance, :cleared_balance, :uncleared_balance, :budget
4
+
5
+ def initialize(id:,
6
+ name:,
7
+ type:,
8
+ on_budget:,
9
+ closed:,
10
+ note:,
11
+ balance:,
12
+ cleared_balance:,
13
+ uncleared_balance:,
14
+ budget:)
15
+
16
+ @id = id
17
+ @name = name
18
+ @type = type
19
+ @on_budget = on_budget
20
+ @closed = closed
21
+ @note = note
22
+ @balance = balance
23
+ @cleared_balance = cleared_balance
24
+ @uncleared_balance = uncleared_balance
25
+ @budget = budget
26
+ end
27
+
28
+ def transactions(since: nil)
29
+ response = ynab_client
30
+ .transactions
31
+ .get_transactions_by_account(
32
+ budget.id,
33
+ @id,
34
+ since_date: since&.to_date&.iso8601
35
+ )
36
+
37
+ response.data.transactions.map do |transaction|
38
+ Transaction.parse(object: transaction, account: self)
39
+ end
40
+ end
41
+
42
+ def bulk_upload_transactions(transactions)
43
+ if transactions.to_a.empty?
44
+ return {
45
+ new: 0,
46
+ updated: 0
47
+ }
48
+ end
49
+
50
+ body = {
51
+ transactions: transactions.map(&:upload_hash)
52
+ }
53
+
54
+ response = ynab_client.transactions.bulk_create_transactions(budget.id, body)
55
+ duplicate_transactions = response.data.bulk.duplicate_import_ids
56
+
57
+ if duplicate_transactions.any?
58
+ update_duplicate_transactions(
59
+ new_transactions: transactions,
60
+ duplicate_transactions_ids: response.data.bulk.duplicate_import_ids
61
+ )
62
+ end
63
+
64
+ {
65
+ new: response.data.bulk.transaction_ids.count,
66
+ updated: duplicate_transactions.count
67
+ }
68
+ end
69
+
70
+ def transaction(transaction_id)
71
+ response = ynab_client.transactions.get_transactions_by_id(budget.id, transaction_id)
72
+
73
+ Transaction.parse(object: response.data.transaction, account: self)
74
+ end
75
+
76
+ def self.parse(object:, budget:)
77
+ new(
78
+ id: object.id,
79
+ name: object.name,
80
+ type: object.type,
81
+ on_budget: object.on_budget,
82
+ closed: object.closed,
83
+ note: object.note,
84
+ balance: object.balance,
85
+ cleared_balance: object.cleared_balance,
86
+ uncleared_balance: object.uncleared_balance,
87
+ budget: budget
88
+ )
89
+ end
90
+
91
+ def api_token
92
+ budget.api_token
93
+ end
94
+
95
+ private
96
+
97
+ def update_duplicate_transactions(new_transactions:, duplicate_transactions_ids:)
98
+ old_transactions = find_from_import_ids(duplicate_transactions_ids)
99
+
100
+ old_transactions.each do |old_transaction|
101
+ new_transaction = new_transactions.find do |transaction|
102
+ transaction.import_id == old_transaction.import_id
103
+ end
104
+
105
+ new_transaction.id = old_transaction.id
106
+ new_transaction.update
107
+ end
108
+ end
109
+
110
+ def find_from_import_ids(import_ids)
111
+ earliest_import_date = import_ids.sort.first.split(":")[2]
112
+
113
+ ynab_transactions = ynab_client.transactions.get_transactions(
114
+ budget.id,
115
+ since_date: earliest_import_date
116
+ ).data.transactions
117
+
118
+ parsed_transactions = ynab_transactions.map do |transaction_object|
119
+ Transaction.parse(object: transaction_object, account: self)
120
+ end
121
+
122
+ parsed_transactions.select do |transaction|
123
+ import_ids.include?(transaction.import_id)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,9 @@
1
+ require "ynab"
2
+
3
+ module Ynaby
4
+ class Base
5
+ def ynab_client
6
+ YnabApi::Client.new(api_token)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,45 @@
1
+ module Ynaby
2
+ class Budget < Base
3
+ attr_reader :id, :name, :last_modified_on, :date_format, :currency_format, :user
4
+
5
+ def initialize(id:, name:, last_modified_on:, date_format:, currency_format:, user:)
6
+ @id = id
7
+ @name = name
8
+ @last_modified_on = last_modified_on
9
+ @date_format = date_format
10
+ @currency_format = currency_format || {}
11
+ @user = user
12
+ end
13
+
14
+ def accounts
15
+ response = ynab_client.accounts.get_accounts(@id)
16
+ response.data.accounts.map do |account|
17
+ Account.parse(object: account, budget: self)
18
+ end
19
+ end
20
+
21
+ def account(account_id)
22
+ response = ynab_client.accounts.get_account_by_id(id, account_id)
23
+ Account.parse(object: response.data.account, budget: self)
24
+ end
25
+
26
+ def currency_code
27
+ currency_format[:iso_code]
28
+ end
29
+
30
+ def self.parse(object, user)
31
+ new(
32
+ id: object.id,
33
+ name: object.name,
34
+ last_modified_on: object.last_modified_on,
35
+ date_format: object.date_format.to_hash,
36
+ currency_format: object.currency_format.to_hash,
37
+ user: user
38
+ )
39
+ end
40
+
41
+ def api_token
42
+ user.api_token
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,104 @@
1
+ module Ynaby
2
+ class Transaction < Base
3
+ attr_reader :account, :date, :payee_name, :import_id, :cleared, :approved,
4
+ :flag_color, :payee_id, :category_id, :transfer_account_id,
5
+ :import_id, :account_name, :payee_name, :category_name, :account
6
+
7
+ attr_accessor :id, :memo, :amount
8
+
9
+ def initialize(id: nil,
10
+ date:,
11
+ amount:,
12
+ memo: nil,
13
+ cleared: nil,
14
+ approved: nil,
15
+ flag_color: nil,
16
+ payee_id: nil,
17
+ category_id: nil,
18
+ transfer_account_id: nil,
19
+ import_id: nil,
20
+ account_name: nil,
21
+ payee_name:,
22
+ category_name: nil,
23
+ account:)
24
+
25
+ @id = id
26
+ @date = date
27
+ @amount = amount
28
+ @memo = memo
29
+ @cleared = cleared
30
+ @approved = approved
31
+ @flag_color = flag_color
32
+ @payee_id = payee_id
33
+ @category_id = category_id
34
+ @transfer_account_id = transfer_account_id
35
+ @import_id = import_id
36
+ @account_name = account_name
37
+ @payee_name = payee_name
38
+ @category_name = category_name
39
+ @account = account
40
+ end
41
+
42
+ def upload
43
+ body = {
44
+ transaction: upload_hash
45
+ }
46
+
47
+ response = ynab_client.transactions.create_transaction(budget_id, body)
48
+
49
+ self.class.parse(object: response.data.transaction, account: account)
50
+ end
51
+
52
+ def upload_hash
53
+ {
54
+ account_id: @account.id,
55
+ date: @date.to_date.iso8601,
56
+ amount: @amount,
57
+ payee_name: @payee_name,
58
+ import_id: @import_id,
59
+ payee_id: nil,
60
+ memo: @memo&.slice(0...50)
61
+ }
62
+ end
63
+
64
+ def update
65
+ body = {
66
+ transaction: upload_hash
67
+ }
68
+
69
+ response = ynab_client.transactions.update_transaction(budget_id, id, body)
70
+
71
+ self.class.parse(object: response.data.transaction, account: account)
72
+ end
73
+
74
+ def self.parse(object:, account:)
75
+ new(
76
+ id: object.id,
77
+ date: object.date,
78
+ amount: object.amount.to_i,
79
+ memo: object.memo,
80
+ cleared: object.cleared,
81
+ approved: object.approved,
82
+ flag_color: object.flag_color,
83
+ payee_id: object.payee_id,
84
+ category_id: object.category_id,
85
+ transfer_account_id: object.transfer_account_id,
86
+ import_id: object.import_id,
87
+ account_name: object.account_name,
88
+ payee_name: object.payee_name,
89
+ category_name: object.category_name,
90
+ account: account
91
+ )
92
+ end
93
+
94
+ private
95
+
96
+ def budget_id
97
+ account.budget.id
98
+ end
99
+
100
+ def api_token
101
+ account.api_token
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,20 @@
1
+ module Ynaby
2
+ class User < Base
3
+ attr_reader :api_token
4
+
5
+ def initialize(api_token)
6
+ @api_token = api_token
7
+ end
8
+
9
+ def budgets
10
+ response = ynab_client.budgets.get_budgets
11
+ response.data.budgets.map do |budget|
12
+ Budget.parse(budget, self)
13
+ end
14
+ end
15
+
16
+ def budget(id)
17
+ budgets.find { |budget| budget.id == id }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module Ynaby
2
+ VERSION = "0.3.0"
3
+ end
Binary file
Binary file
@@ -0,0 +1,31 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "ynaby/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ynaby"
8
+ spec.version = Ynaby::VERSION
9
+ spec.authors = ["Rafael Millán"]
10
+ spec.email = ["rafmillan@gmail.com"]
11
+
12
+ spec.summary = %q{A Ruby library for editing YNAB transaction.}
13
+ spec.homepage = "https://github.com/rafaelmillan/ynaby"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_runtime_dependency "ynab", "~> 0.7.0"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.16"
26
+ spec.add_development_dependency "pry", "~> 0.11.3"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency "webmock", "~> 3.4.2"
30
+ spec.add_development_dependency "vcr", "~> 4.0.0"
31
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ynaby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Rafael Millán
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ynab
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.11.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.11.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.4.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.4.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 4.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 4.0.0
111
+ description:
112
+ email:
113
+ - rafmillan@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - Gemfile.lock
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - bin/console
127
+ - bin/setup
128
+ - lib/ynaby.rb
129
+ - lib/ynaby/account.rb
130
+ - lib/ynaby/base.rb
131
+ - lib/ynaby/budget.rb
132
+ - lib/ynaby/transaction.rb
133
+ - lib/ynaby/user.rb
134
+ - lib/ynaby/version.rb
135
+ - ynaby-0.1.0.gem
136
+ - ynaby-0.2.0.gem
137
+ - ynaby.gemspec
138
+ homepage: https://github.com/rafaelmillan/ynaby
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.7.3
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: A Ruby library for editing YNAB transaction.
162
+ test_files: []