timely-app 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 287d9e265de562279b0bfc72bc517687e5c0b21624bfe62ca8a7cd3de34dc249
4
- data.tar.gz: 49fe41a32e6cf4d010c5f7ce9659b9076007691865331e03f2edf27a6d5ada69
3
+ metadata.gz: cb007aeefb95161536612d0873a2af916979e63090722db4058ef085ea61b9d7
4
+ data.tar.gz: f635b0b3c8824b054230cc30e05511b6a52d79b1eaeb8d85312d7467717309e5
5
5
  SHA512:
6
- metadata.gz: 3acf47aa0c8f60aebd9ffb56e82c708b1ff1c4a8db68ed87fa2f88b0f90494513d4cab9cf8a07ec275b69cdca4a52fcaaabf34de3d7144ecd7d97d877847c2ae
7
- data.tar.gz: 1c651132733ec09c0535bf49f5fea5ec20504207523b69e8bb62f7b81d5939418075ad717388248bb3f2a5bf3a8c5f2fa5b23a91466f7ef9485b5a6f12636493
6
+ metadata.gz: 21e914d28e5f658f279191910064353341efe89c461a74ab9d3243db7569dde398f085fed5497639164ac956c4bbabd2a6bcaabe5ae2e5997fe9c9b891216f3f
7
+ data.tar.gz: 2ebf7294e89b0dfde01076bd02c5dec9eee2272f1ae1b83c617f50f13a119b8e2a45704f3e7ff7735769cd05a6b1d905310c578bb12c4a6b16bd14566a5b3cfe
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.0.3
2
+
3
+ * Fix gemspec
4
+
1
5
  # 1.0.2
2
6
 
3
7
  * Add basic CLI script `timely-app`
data/bin/timely-app ADDED
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "yaml"
4
+ require "optparse"
5
+ require "timely-app"
6
+
7
+ module TimelyApp
8
+ class CLI
9
+ attr_reader :options, :client
10
+
11
+ def initialize(options = {})
12
+ @options = options
13
+ @client = TimelyApp::Client.new(
14
+ access_token: options[:access_token] || fetch_access_token,
15
+ account_id: options[:account_id] || fetch_account_id,
16
+ verbose: options[:verbose]
17
+ )
18
+ end
19
+
20
+ def get_config(key)
21
+ read_config_file&.fetch(key, nil)
22
+ end
23
+
24
+ def set_config(key, value)
25
+ save_config_file(key => value)
26
+ end
27
+
28
+ def command_exists?(cmd)
29
+ client.respond_to?(cmd)
30
+ end
31
+
32
+ def call(cmd, *args)
33
+ client.send(cmd, *args)
34
+ end
35
+
36
+ def auth(client_id, client_secret)
37
+ if !client_id || !client_secret
38
+ puts "Usage: timely-app auth CLIENT_ID CLIENT_SECRET"
39
+ exit 1
40
+ end
41
+
42
+ auth_client = TimelyApp::Client.new(verbose: options[:verbose])
43
+ auth_url = auth_client.get_oauth_authorize_url(
44
+ client_id: client_id,
45
+ redirect_uri: "urn:ietf:wg:oauth:2.0:oob"
46
+ )
47
+ puts "Visit this URL in your browser:"
48
+ puts auth_url
49
+ puts "\nEnter authorization code here:"
50
+ code = gets.chomp
51
+ begin
52
+ token = auth_client.post_oauth_token(
53
+ client_id: client_id,
54
+ client_secret: client_secret,
55
+ code: code,
56
+ redirect_uri: "urn:ietf:wg:oauth:2.0:oob",
57
+ grant_type: "authorization_code"
58
+ )
59
+ if options[:save]
60
+ save_config_file(
61
+ access_token: token.access_token,
62
+ refresh_token: token.refresh_token,
63
+ created_at: token.created_at
64
+ )
65
+ else
66
+ puts "\nAccess token:\n#{token.access_token}\n"
67
+ end
68
+ if options[:verbose]
69
+ puts "Token details: #{token.to_h}"
70
+ end
71
+ rescue TimelyApp::Error => e
72
+ puts "Authentication failed"
73
+ if options[:verbose]
74
+ puts "Code: #{code}"
75
+ puts "Response code: #{e.response.code}"
76
+ puts "Response: #{e.response.body}"
77
+ end
78
+ exit 1
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def config_file_path
85
+ Dir.home + "/.timelyrc"
86
+ end
87
+
88
+ def read_config_file
89
+ if File.exist?(config_file_path)
90
+ YAML.load_file(config_file_path)
91
+ end
92
+ end
93
+
94
+ def fetch_account_id
95
+ read_config_file&.fetch("account_id", nil)
96
+ end
97
+
98
+ def fetch_access_token
99
+ read_config_file&.fetch("access_token", nil)
100
+ end
101
+
102
+ def check_access_token
103
+ if !fetch_access_token
104
+ puts "No access token found. Run `timely-app auth` to get one."
105
+ exit 1
106
+ end
107
+ end
108
+
109
+ def save_config_file(**options)
110
+ config = read_config_file || {}
111
+ config.merge!(options)
112
+ File.open(config_file_path, "w") do |f|
113
+ f.write(config.to_yaml)
114
+ end
115
+ puts "Saved to #{config_file_path}"
116
+ end
117
+ end
118
+ end
119
+
120
+ options = {}
121
+ OptionParser.new do |opts|
122
+ opts.banner = "Usage: timely-app [command] [options]"
123
+
124
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
125
+ options[:verbose] = v
126
+ end
127
+
128
+ opts.on("-a", "--account ACCOUNT", "Account name") do |a|
129
+ options[:account] = a
130
+ end
131
+
132
+ opts.on("-s", "--save", "Save changes to file") do |s|
133
+ options[:save] = s
134
+ end
135
+ end.parse!
136
+
137
+ cli = TimelyApp::CLI.new(options)
138
+
139
+ cmd = ARGV.shift
140
+ case cmd
141
+ when "auth"
142
+ if ARGV.length == 0
143
+ cli.auth(ENV.fetch('TIMELY_CLIENT_ID'), ENV.fetch('TIMELY_CLIENT_SECRET'))
144
+ elsif ARGV.length == 2
145
+ cli.auth(ARGV.shift, ARGV.shift)
146
+ else
147
+ puts "Usage: timely-app auth CLIENT_ID CLIENT_SECRET"
148
+ exit 1
149
+ end
150
+ when "config"
151
+ if ARGV.length == 1
152
+ puts cli.get_config(ARGV.shift)
153
+ elsif ARGV.length == 2
154
+ cli.set_config(ARGV.shift, ARGV.shift)
155
+ else
156
+ puts "Usage: timely-app config [key] [value]"
157
+ exit 1
158
+ end
159
+ else
160
+ if cli.command_exists?(cmd)
161
+ response = cli.call(cmd, *ARGV)
162
+ ARGV.clear
163
+ case response
164
+ when Array
165
+ response.each do |r|
166
+ puts r.to_h
167
+ end
168
+ when TimelyApp::Record
169
+ puts response.to_h
170
+ else
171
+ puts response
172
+ end
173
+ else
174
+ puts "Unknown command: #{cmd}"
175
+ exit 1
176
+ end
177
+ end
@@ -1,3 +1,3 @@
1
1
  module TimelyApp
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.3'
3
3
  end
data/timely-app.gemspec CHANGED
@@ -1,20 +1,29 @@
1
1
  Gem::Specification.new do |s|
2
- s.name = 'timely-app'
3
- s.version = '1.0.2'
4
- s.license = 'MIT'
2
+ s.name = "timely-app"
3
+ s.version = "1.0.3"
4
+
5
+ s.license = "MIT"
6
+
5
7
  s.platform = Gem::Platform::RUBY
6
- s.authors = ['Andrei Makarov']
7
- s.email = ['andrei@kiskolabs.com']
8
- s.homepage = 'https://github.com/amkisko/timely-app'
9
- s.description = 'Ruby client for the Timely API'
10
- s.summary = 'See description'
11
- s.files = Dir.glob('lib/**/*.rb') + %w(CHANGELOG.md LICENSE.md README.md timely-app.gemspec)
12
- s.required_ruby_version = '>= 1.9.3'
13
- s.require_path = 'lib'
8
+
9
+ s.authors = ["Andrei Makarov"]
10
+ s.email = ["andrei@kiskolabs.com"]
11
+ s.homepage = "https://github.com/amkisko/timely-app"
12
+ s.description = "Ruby client for the Timely API"
13
+ s.summary = "See description"
14
14
  s.metadata = {
15
- 'homepage' => 'https://github.com/amkisko/timely-app',
16
- 'source_code_uri' => 'https://github.com/amkisko/timely-app',
17
- 'bug_tracker_uri' => 'https://github.com/amkisko/timely-app/issues',
18
- 'changelog_uri' => 'https://github.com/amkisko/timely-app/blob/main/CHANGES.md'
15
+ "homepage" => "https://github.com/amkisko/timely-app",
16
+ "source_code_uri" => "https://github.com/amkisko/timely-app",
17
+ "bug_tracker_uri" => "https://github.com/amkisko/timely-app/issues",
18
+ "changelog_uri" => "https://github.com/amkisko/timely-app/blob/main/CHANGELOG.md",
19
+ "rubygems_mfa_required" => "true"
19
20
  }
21
+
22
+ s.files = Dir.glob("lib/**/*.rb") + Dir.glob("bin/**/*") + %w(CHANGELOG.md LICENSE.md README.md timely-app.gemspec)
23
+
24
+ s.bindir = "bin"
25
+ s.executables = ["timely-app"]
26
+
27
+ s.required_ruby_version = ">= 1.9.3"
28
+ s.require_path = "lib"
20
29
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timely-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Makarov
@@ -13,13 +13,15 @@ dependencies: []
13
13
  description: Ruby client for the Timely API
14
14
  email:
15
15
  - andrei@kiskolabs.com
16
- executables: []
16
+ executables:
17
+ - timely-app
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
20
21
  - CHANGELOG.md
21
22
  - LICENSE.md
22
23
  - README.md
24
+ - bin/timely-app
23
25
  - lib/timely-app.rb
24
26
  - lib/timely-app/client.rb
25
27
  - lib/timely-app/client/accounts.rb
@@ -50,7 +52,8 @@ metadata:
50
52
  homepage: https://github.com/amkisko/timely-app
51
53
  source_code_uri: https://github.com/amkisko/timely-app
52
54
  bug_tracker_uri: https://github.com/amkisko/timely-app/issues
53
- changelog_uri: https://github.com/amkisko/timely-app/blob/main/CHANGES.md
55
+ changelog_uri: https://github.com/amkisko/timely-app/blob/main/CHANGELOG.md
56
+ rubygems_mfa_required: 'true'
54
57
  post_install_message:
55
58
  rdoc_options: []
56
59
  require_paths: