glima 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/config_example.yml +1 -1
- data/exe/glima +44 -19
- data/glima.gemspec +1 -3
- data/lib/glima.rb +0 -1
- data/lib/glima/command.rb +1 -0
- data/lib/glima/command/init.rb +99 -0
- data/lib/glima/config.rb +6 -195
- data/lib/glima/gmail_client.rb +10 -40
- data/lib/glima/templates/config.yml.erb +7 -0
- data/lib/glima/version.rb +1 -1
- metadata +7 -34
- data/lib/glima/cli.rb +0 -151
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27d1459f172ac0f758a2ee88cd5d99cb7f8b2daa
|
4
|
+
data.tar.gz: 933620cec4309b6ef67a6d845e3bd3adc6089b84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f28c39166d7ba2f1ec4002140e2bb4a7120be0561334b38da9d63ab7ec02490abb2172f96b5646d03c3d23d458c02765d0cd76240ce674b01556e46a21a9e85f
|
7
|
+
data.tar.gz: 42c56a60f7cb35173827f1a91b50738cdddaed7db81bb796916bdf8cc5ff4335aeed1bff54b9458b257650301d4f5ee86e4623fa6a790777901bb9cac8cfc8d7
|
data/examples/config_example.yml
CHANGED
@@ -4,5 +4,5 @@ GENERAL:
|
|
4
4
|
CLIENT_ID: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"
|
5
5
|
CLIENT_SECRET: "yyyyyyyyyyyyyyyyyyyyyyyy"
|
6
6
|
TOKEN_STORE: "/Users/nom/.config/glima/token_store.yml"
|
7
|
-
|
7
|
+
CONTEXT_STORE_PATH: "/Users/nom/.config/glima/context.yml"
|
8
8
|
DEFAULT_USER: "????????@gmail.com"
|
data/exe/glima
CHANGED
@@ -23,19 +23,21 @@ if File.exists?(gemfile + ".lock")
|
|
23
23
|
end
|
24
24
|
|
25
25
|
require "rubygems"
|
26
|
+
require "clian"
|
26
27
|
require "glima"
|
27
28
|
require "cgi"
|
28
29
|
require "logger"
|
29
30
|
|
30
31
|
Encoding.default_external="UTF-8"
|
31
32
|
|
32
|
-
class GlimaCLI <
|
33
|
+
class GlimaCLI < Clian::Cli
|
33
34
|
package_name 'GLIMA'
|
34
35
|
|
35
36
|
################################################################
|
36
37
|
# global option
|
37
38
|
|
38
39
|
class_option :profile, :desc => "Set profiler flag", :type => :boolean
|
40
|
+
class_option :user, :desc => "Set Gmail/IMAP account"
|
39
41
|
|
40
42
|
################################################################
|
41
43
|
# register frequently used options
|
@@ -44,6 +46,20 @@ class GlimaCLI < Glima::Cli
|
|
44
46
|
named_option :dry_run, :desc => "Perform a trial run with no changes made", :type => :boolean
|
45
47
|
named_option :query, :desc => "Filter messages by QUERY"
|
46
48
|
|
49
|
+
################################################################
|
50
|
+
# Command: auth
|
51
|
+
################################################################
|
52
|
+
desc "auth", "Authenticate interactively"
|
53
|
+
|
54
|
+
def auth
|
55
|
+
conf = config.general
|
56
|
+
authorizer = Clian::Authorizer.new(conf.client_id,
|
57
|
+
conf.client_secret,
|
58
|
+
Google::Apis::GmailV1::AUTH_SCOPE,
|
59
|
+
conf.token_store_path)
|
60
|
+
authorizer.auth_interactively(@user)
|
61
|
+
end
|
62
|
+
|
47
63
|
################################################################
|
48
64
|
# Command: dezip
|
49
65
|
################################################################
|
@@ -76,6 +92,18 @@ class GlimaCLI < Glima::Cli
|
|
76
92
|
Glima::Command::Guess.new(message_id)
|
77
93
|
end
|
78
94
|
|
95
|
+
################################################################
|
96
|
+
# Command: init
|
97
|
+
################################################################
|
98
|
+
desc "init", "Create new config file"
|
99
|
+
|
100
|
+
expand_option :config
|
101
|
+
|
102
|
+
def init
|
103
|
+
config_file = options[:config] || DEFAULT_CONFIG_PATH
|
104
|
+
Glima::Command::Init.new(config_file)
|
105
|
+
end
|
106
|
+
|
79
107
|
################################################################
|
80
108
|
# Command: label
|
81
109
|
################################################################
|
@@ -218,18 +246,6 @@ class GlimaCLI < Glima::Cli
|
|
218
246
|
del_dst_labels: parse_label_names(options[:del_dst_labels]))
|
219
247
|
end
|
220
248
|
|
221
|
-
################################################################
|
222
|
-
# add some hooks to Thor
|
223
|
-
|
224
|
-
no_commands do
|
225
|
-
def invoke_command(command, *args)
|
226
|
-
setup_global_options unless command.name == "init"
|
227
|
-
result = super
|
228
|
-
teardown
|
229
|
-
result
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
249
|
################################################################
|
234
250
|
# private
|
235
251
|
|
@@ -249,19 +265,19 @@ class GlimaCLI < Glima::Cli
|
|
249
265
|
end
|
250
266
|
end
|
251
267
|
|
252
|
-
attr_reader :builder, :config, :
|
268
|
+
attr_reader :builder, :config, :user, :context
|
253
269
|
|
254
|
-
def setup_global_options
|
270
|
+
def setup_global_options(command, *args)
|
255
271
|
exit_on_error do
|
256
|
-
@config = Glima::Config.create_from_file(options[:config] ||
|
272
|
+
@config = Glima::Config.create_from_file(options[:config] || DEFAULT_CONFIG_PATH) unless command.name == "init"
|
257
273
|
@datastore = Glima::DataStore.new(File.expand_path("~/Mail"))
|
258
|
-
@
|
259
|
-
@context = Glima::Context.new(File.expand_path(
|
274
|
+
@user = options[:user] || config.general.default_user
|
275
|
+
@context = Glima::Context.new(File.expand_path(DEFAULT_CONFIG_HOME))
|
260
276
|
|
261
277
|
logger = ::Logger.new($stderr)
|
262
278
|
logger.formatter = proc {|severity, datetime, progname, msg| "#{msg}\n"}
|
263
279
|
|
264
|
-
Glima::Command.client = client
|
280
|
+
Glima::Command.client = client unless command.name == "auth"
|
265
281
|
Glima::Command.logger = logger
|
266
282
|
# Glima::GmailClient.logger = logger
|
267
283
|
|
@@ -276,6 +292,15 @@ class GlimaCLI < Glima::Cli
|
|
276
292
|
end
|
277
293
|
end
|
278
294
|
end
|
295
|
+
|
296
|
+
def client
|
297
|
+
begin
|
298
|
+
@client ||= Glima::GmailClient.new(config.general, @user, @datastore)
|
299
|
+
rescue Glima::GmailClient::AuthorizationError
|
300
|
+
STDERR.print "Authorization Error: try ``glima auth'' command.\n"
|
301
|
+
exit(1)
|
302
|
+
end
|
303
|
+
end
|
279
304
|
end
|
280
305
|
|
281
306
|
def teardown
|
data/glima.gemspec
CHANGED
@@ -27,9 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.required_ruby_version = ">= 2.3.0"
|
28
28
|
|
29
29
|
spec.add_runtime_dependency "thor", ">= 0.19.1"
|
30
|
-
spec.add_runtime_dependency "
|
31
|
-
spec.add_runtime_dependency "googleauth"
|
32
|
-
spec.add_runtime_dependency "launchy"
|
30
|
+
spec.add_runtime_dependency "clian", ">= 0.3.0"
|
33
31
|
spec.add_runtime_dependency "mail"
|
34
32
|
spec.add_runtime_dependency "rubyzip"
|
35
33
|
|
data/lib/glima.rb
CHANGED
data/lib/glima/command.rb
CHANGED
@@ -21,6 +21,7 @@ module Glima
|
|
21
21
|
autoload :Guess, "#{dir}/guess.rb"
|
22
22
|
autoload :Label, "#{dir}/label.rb"
|
23
23
|
autoload :Labels, "#{dir}/labels.rb"
|
24
|
+
autoload :Init, "#{dir}/init.rb"
|
24
25
|
# autoload :Open, "#{dir}/open.rb"
|
25
26
|
autoload :Profile, "#{dir}/profile.rb"
|
26
27
|
autoload :Push, "#{dir}/push.rb"
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Glima
|
2
|
+
module Command
|
3
|
+
class Init
|
4
|
+
TEMPLATE_DIR = File.expand_path("../../templates", __FILE__)
|
5
|
+
|
6
|
+
def initialize(config_file)
|
7
|
+
@shell = Thor.new
|
8
|
+
@status = {green: 0, yellow: 0, red: 0}
|
9
|
+
config = {}
|
10
|
+
|
11
|
+
config_dir = File.dirname(config_file)
|
12
|
+
|
13
|
+
if File.exists?(File.expand_path(config_file))
|
14
|
+
say_status "exist", "Ignore #{config_file}", :red
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
say "Creating #{config_file} ..."
|
19
|
+
say "Get your CLIENT_ID/CLIENT_SECRET at https://console.developers.google.com", :green
|
20
|
+
say "Googling 'Creating a Google API Console project and client ID' would help."
|
21
|
+
|
22
|
+
config[:client_id] = @shell.ask "CLIENT_ID:"
|
23
|
+
config[:client_secret] = @shell.ask "CLIENT_SECRET:"
|
24
|
+
config[:default_user] = @shell.ask "Gmail address:"
|
25
|
+
config[:token_store_path] = File.expand_path("token_store.yml", config_dir)
|
26
|
+
|
27
|
+
# mkdir
|
28
|
+
unless Dir.exist?(File.expand_path(config_dir))
|
29
|
+
say "Making config directory #{config_dir} ..."
|
30
|
+
mkdir_p(File.expand_path(config_dir))
|
31
|
+
end
|
32
|
+
|
33
|
+
# make config file from tamplate
|
34
|
+
say "Copying file(s) into #{config_file} ..."
|
35
|
+
src = File.expand_path("config.yml.erb", TEMPLATE_DIR)
|
36
|
+
dst = File.expand_path(config_file)
|
37
|
+
expand_template(src, dst, config)
|
38
|
+
|
39
|
+
say_status_report
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def say(message, color = nil)
|
45
|
+
@shell.say(message, color)
|
46
|
+
end
|
47
|
+
|
48
|
+
def say_status(status, message, log_status = nil)
|
49
|
+
@status[log_status] += 1
|
50
|
+
@shell.say_status(status, message, log_status)
|
51
|
+
end
|
52
|
+
|
53
|
+
def say_status_report
|
54
|
+
if (errors = @status[:red]) > 0
|
55
|
+
say "#{errors} error(s) were occurred.", :red
|
56
|
+
else
|
57
|
+
say "done."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def expand_template(template_path, dest_path, config)
|
62
|
+
require "erb"
|
63
|
+
template = ERB.new(File.open(template_path).read, nil, "-")
|
64
|
+
|
65
|
+
if File.exists?(dest_path)
|
66
|
+
say_status "exist", "Ignore #{dest_path}", :yellow
|
67
|
+
return
|
68
|
+
end
|
69
|
+
|
70
|
+
begin
|
71
|
+
mkdir_p(File.expand_path("..", dest_path))
|
72
|
+
File.open(dest_path, "w", 0600) do |file|
|
73
|
+
file.write(template.result(binding))
|
74
|
+
end
|
75
|
+
say_status "ok", "copy #{dest_path}", :green
|
76
|
+
rescue StandardError => e
|
77
|
+
say_status "failed", "#{e.message.split(' @').first} #{dest_path}", :red
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def mkdir_p(path)
|
82
|
+
path = File.expand_path(path)
|
83
|
+
|
84
|
+
if File.directory?(path)
|
85
|
+
say_status "exist", "Ignore #{path}", :yellow
|
86
|
+
return
|
87
|
+
end
|
88
|
+
|
89
|
+
begin
|
90
|
+
FileUtils.mkdir_p(path)
|
91
|
+
say_status "create", "#{path}", :green
|
92
|
+
rescue StandardError => e
|
93
|
+
say_status "failed", "#{e.message.split(' @').first} #{path}", :red
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end # class Init
|
98
|
+
end # module Command
|
99
|
+
end # module Glima
|
data/lib/glima/config.rb
CHANGED
@@ -1,205 +1,16 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'pp'
|
3
|
-
|
4
1
|
module Glima
|
5
|
-
class Config
|
6
|
-
# Syntax table manipulation
|
7
|
-
class Syntax
|
8
|
-
def initialize(syntax_config)
|
9
|
-
@syntax_config = syntax_config
|
10
|
-
end
|
11
|
-
|
12
|
-
def keyword_symbols
|
13
|
-
@syntax_config.keys
|
14
|
-
end
|
15
|
-
|
16
|
-
def keywords
|
17
|
-
keyword_symbols.map {|sym| sym.to_s.upcase }
|
18
|
-
end
|
19
|
-
|
20
|
-
def keyword?(word)
|
21
|
-
if word.is_a?(Symbol)
|
22
|
-
keyword_symbols.member?(word)
|
23
|
-
else
|
24
|
-
# String
|
25
|
-
keywords.member?(word)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def instance_variable_name(word)
|
30
|
-
return nil unless keyword?(word)
|
31
|
-
return '@' + as_symbol(word).to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
def item_class(word)
|
35
|
-
return nil unless keyword?(word)
|
36
|
-
@syntax_config[as_symbol(word)]
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
def as_symbol(word)
|
41
|
-
word.to_s.downcase.sub(/^@+/, "").to_sym
|
42
|
-
end
|
43
|
-
end # class Syntax
|
44
|
-
|
45
|
-
# Parse Key-Value object in YAML
|
46
|
-
class Base
|
47
|
-
# attr_accessor :name
|
48
|
-
|
49
|
-
def self.create_from_yaml_file(yaml_file)
|
50
|
-
yaml_string = File.open(File.expand_path(yaml_file)).read
|
51
|
-
return create_from_yaml_string(yaml_string, yaml_file)
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.create_from_yaml_string(yaml_string, filename = nil)
|
55
|
-
hash = YAML.load(yaml_string, filename) || {}
|
56
|
-
return new(hash)
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.define_syntax(config)
|
60
|
-
@syntax = Syntax.new(config)
|
61
|
-
@syntax.keyword_symbols.each do |sym|
|
62
|
-
attr_accessor sym # XXX: attr_reader is enough?
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.syntax
|
67
|
-
return @syntax
|
68
|
-
end
|
69
|
-
|
70
|
-
def initialize(hash = {})
|
71
|
-
@original_hash = hash
|
72
|
-
(hash || {}).each do |key, val|
|
73
|
-
raise Glima::ConfigurationError, "config syntax error (#{key})" unless syntax.keyword?(key)
|
74
|
-
var = syntax.instance_variable_name(key)
|
75
|
-
obj = create_subnode(key, val)
|
76
|
-
instance_variable_set(var, obj)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
attr_reader :original_hash
|
81
|
-
|
82
|
-
def get_value(dot_separated_string = nil)
|
83
|
-
if dot_separated_string.to_s == ""
|
84
|
-
return original_hash
|
85
|
-
end
|
86
|
-
|
87
|
-
key, subkey = dot_separated_string.to_s.upcase.split(".", 2)
|
88
|
-
subnode = get_subnode(key)
|
89
|
-
|
90
|
-
if subnode.respond_to?(:get_value)
|
91
|
-
return subnode.get_value(subkey)
|
92
|
-
else
|
93
|
-
return subnode.to_s
|
94
|
-
end
|
95
|
-
end
|
2
|
+
class Config < Clian::Config::Toplevel
|
96
3
|
|
97
|
-
|
98
|
-
return self.to_hash.to_yaml
|
99
|
-
end
|
100
|
-
|
101
|
-
def to_hash
|
102
|
-
hash = {}
|
103
|
-
syntax.keywords.each do |key|
|
104
|
-
var = syntax.instance_variable_name(key)
|
105
|
-
obj = instance_variable_get(var)
|
106
|
-
obj = obj.respond_to?(:to_hash) ? obj.to_hash : obj.to_s
|
107
|
-
hash[key] = obj
|
108
|
-
end
|
109
|
-
return hash
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
def syntax
|
114
|
-
self.class.syntax
|
115
|
-
end
|
116
|
-
|
117
|
-
def get_subnode(key)
|
118
|
-
raise Glima::ConfigurationError, "Invalid key: #{key}" unless syntax.keyword?(key)
|
119
|
-
return instance_variable_get(syntax.instance_variable_name(key))
|
120
|
-
end
|
121
|
-
|
122
|
-
def create_subnode(keyword, value)
|
123
|
-
item_class = syntax.item_class(keyword)
|
124
|
-
if item_class.is_a?(Array)
|
125
|
-
return List.new(item_class.first, value)
|
126
|
-
elsif item_class == String
|
127
|
-
return value.to_s
|
128
|
-
else
|
129
|
-
return item_class.new(value)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
end # class Base
|
134
|
-
|
135
|
-
# Parse Array object in YAML
|
136
|
-
class List < Base
|
137
|
-
include Enumerable
|
138
|
-
|
139
|
-
def initialize(item_class, array = [])
|
140
|
-
@original_hash = array
|
141
|
-
@configs = []
|
142
|
-
(array || []).each do |value|
|
143
|
-
item = item_class.new(value)
|
144
|
-
@configs << item
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def [](key)
|
149
|
-
@configs.find {|c| c.name == key}
|
150
|
-
end
|
151
|
-
|
152
|
-
alias_method :get_subnode, :[]
|
153
|
-
|
154
|
-
def <<(conf)
|
155
|
-
@configs << conf
|
156
|
-
end
|
157
|
-
|
158
|
-
def to_hash # XXX: actually, it returns a Array
|
159
|
-
return @configs.map {|c| c.respond_to?(:to_hash) ? c.to_hash : c.to_s}
|
160
|
-
end
|
161
|
-
|
162
|
-
def each
|
163
|
-
@configs.each do |conf|
|
164
|
-
yield conf
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end # List
|
168
|
-
|
169
|
-
## concrete config classes
|
170
|
-
|
171
|
-
class General < Base
|
4
|
+
class General < Clian::Config::Element
|
172
5
|
define_syntax :client_id => String,
|
173
6
|
:client_secret => String,
|
174
|
-
:
|
7
|
+
:token_store_path => String,
|
175
8
|
:context_store => String,
|
176
9
|
:zip_passwords_file => String,
|
177
10
|
:default_user => String
|
178
11
|
end # class General
|
179
12
|
|
180
|
-
|
181
|
-
class Top < Base
|
182
|
-
define_syntax :general => General
|
183
|
-
end # class Top
|
184
|
-
|
185
|
-
def self.create_from_file(file_name)
|
186
|
-
unless File.exists?(File.expand_path(file_name))
|
187
|
-
raise Glima::ConfigurationError, "config file '#{file_name}' not found"
|
188
|
-
end
|
189
|
-
begin
|
190
|
-
return Top.create_from_yaml_file(file_name)
|
191
|
-
rescue Psych::SyntaxError => e
|
192
|
-
raise Glima::ConfigurationError, e.message
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
def self.create_from_string(string)
|
197
|
-
begin
|
198
|
-
return Top.create_from_yaml_string(string)
|
199
|
-
rescue Psych::SyntaxError => e
|
200
|
-
raise Glima::ConfigurationError, e.message
|
201
|
-
end
|
202
|
-
end
|
13
|
+
define_syntax :general => General
|
203
14
|
|
204
|
-
end #
|
205
|
-
end #
|
15
|
+
end # Config
|
16
|
+
end # Glima
|
data/lib/glima/gmail_client.rb
CHANGED
@@ -8,41 +8,9 @@ require 'forwardable'
|
|
8
8
|
Google::Apis::RequestOptions.default.retries = 5
|
9
9
|
|
10
10
|
module Glima
|
11
|
-
class Authorizer
|
12
|
-
def initialize(client_id, client_secret, scope, token_store_path)
|
13
|
-
@authorizer = Google::Auth::UserAuthorizer.new(
|
14
|
-
Google::Auth::ClientId.new(client_id, client_secret),
|
15
|
-
scope,
|
16
|
-
Google::Auth::Stores::FileTokenStore.new(file: token_store_path)
|
17
|
-
)
|
18
|
-
end
|
19
|
-
|
20
|
-
def credentials(user_id)
|
21
|
-
@authorizer.get_credentials(user_id)
|
22
|
-
end
|
23
|
-
|
24
|
-
def auth_interactively(user_id)
|
25
|
-
shell = Thor.new.shell
|
26
|
-
oob_uri = "urn:ietf:wg:oauth:2.0:oob"
|
27
|
-
|
28
|
-
url = @authorizer.get_authorization_url(base_url: oob_uri)
|
29
|
-
begin
|
30
|
-
Launchy.open(url)
|
31
|
-
rescue
|
32
|
-
puts "Open URL in your browser:\n #{url}"
|
33
|
-
end
|
34
|
-
|
35
|
-
code = shell.ask "Enter the resulting code:"
|
36
|
-
|
37
|
-
@authorizer.get_and_store_credentials_from_code(
|
38
|
-
user_id: user_id,
|
39
|
-
code: code,
|
40
|
-
base_url: oob_uri
|
41
|
-
)
|
42
|
-
end
|
43
|
-
end # Authorizer
|
44
|
-
|
45
11
|
class GmailClient
|
12
|
+
class AuthorizationError < StandardError ; end
|
13
|
+
|
46
14
|
def self.logger
|
47
15
|
Google::Apis.logger
|
48
16
|
end
|
@@ -124,19 +92,21 @@ module Glima
|
|
124
92
|
}.map(&:addr).map(&:ip_address).length > 0
|
125
93
|
end
|
126
94
|
|
127
|
-
def initialize(config, datastore)
|
128
|
-
authorizer = Authorizer.new(config.client_id,
|
95
|
+
def initialize(config, user, datastore)
|
96
|
+
authorizer = Clian::Authorizer.new(config.client_id,
|
129
97
|
config.client_secret,
|
130
98
|
Google::Apis::GmailV1::AUTH_SCOPE,
|
131
|
-
config.
|
99
|
+
config.token_store_path)
|
100
|
+
|
101
|
+
unless credentials = authorizer.credentials(user)
|
102
|
+
raise AuthorizationError.new
|
103
|
+
end
|
132
104
|
|
133
|
-
credentials = authorizer.credentials(config.default_user) ||
|
134
|
-
authorizer.auth_interactively(config.default_user)
|
135
105
|
@datastore = datastore
|
136
106
|
@client = Google::Apis::GmailV1::GmailService.new
|
137
107
|
@client.client_options.application_name = 'glima'
|
138
108
|
@client.authorization = credentials
|
139
|
-
@client.authorization.username =
|
109
|
+
@client.authorization.username = user # for IMAP
|
140
110
|
|
141
111
|
return @client
|
142
112
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
################################################################
|
2
|
+
GENERAL:
|
3
|
+
################################################################
|
4
|
+
CLIENT_ID: "<%= config[:client_id] %>"
|
5
|
+
CLIENT_SECRET: "<%= config[:client_secret] %>"
|
6
|
+
TOKEN_STORE_PATH: "<%= config[:token_store_path] %>"
|
7
|
+
DEFAULT_USER: "<%= config[:default_user] %>"
|
data/lib/glima/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glima
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshinari Nomura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -25,47 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.19.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.9'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.9'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: googleauth
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: launchy
|
28
|
+
name: clian
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
31
|
- - ">="
|
60
32
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
33
|
+
version: 0.3.0
|
62
34
|
type: :runtime
|
63
35
|
prerelease: false
|
64
36
|
version_requirements: !ruby/object:Gem::Requirement
|
65
37
|
requirements:
|
66
38
|
- - ">="
|
67
39
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
40
|
+
version: 0.3.0
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: mail
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,11 +129,11 @@ files:
|
|
157
129
|
- exe/glima
|
158
130
|
- glima.gemspec
|
159
131
|
- lib/glima.rb
|
160
|
-
- lib/glima/cli.rb
|
161
132
|
- lib/glima/command.rb
|
162
133
|
- lib/glima/command/base.rb
|
163
134
|
- lib/glima/command/dezip.rb
|
164
135
|
- lib/glima/command/guess.rb
|
136
|
+
- lib/glima/command/init.rb
|
165
137
|
- lib/glima/command/label.rb
|
166
138
|
- lib/glima/command/labels.rb
|
167
139
|
- lib/glima/command/profile.rb
|
@@ -182,6 +154,7 @@ files:
|
|
182
154
|
- lib/glima/resource/label.rb
|
183
155
|
- lib/glima/resource/mail.rb
|
184
156
|
- lib/glima/resource/message.rb
|
157
|
+
- lib/glima/templates/config.yml.erb
|
185
158
|
- lib/glima/version.rb
|
186
159
|
- lib/glima/zip.rb
|
187
160
|
- spec/glima_spec.rb
|
data/lib/glima/cli.rb
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
require "thor"
|
2
|
-
|
3
|
-
module Glima
|
4
|
-
class Cli < Thor
|
5
|
-
################################################################
|
6
|
-
# config files
|
7
|
-
|
8
|
-
CONFIG_HOME = File.join((ENV["XDG_CONFIG_HOME"] || "~/.config"), basename)
|
9
|
-
CONFIG_FILE = "config.yml"
|
10
|
-
CONFIG_PATH = File.join(CONFIG_HOME, CONFIG_FILE)
|
11
|
-
|
12
|
-
def self.config_home ; CONFIG_HOME; end
|
13
|
-
def self.config_path ; CONFIG_PATH; end
|
14
|
-
|
15
|
-
################################################################
|
16
|
-
# register preset options
|
17
|
-
|
18
|
-
def self.named_option(name, options)
|
19
|
-
@named_options ||= {}
|
20
|
-
@named_options[name] = options
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.expand_option(*names)
|
24
|
-
expand_named_option(:method, *names)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.expand_class_option(*names)
|
28
|
-
expand_named_option(:class, *names)
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.expand_named_option(type, *names)
|
32
|
-
names.each do |name|
|
33
|
-
options = @named_options[name]
|
34
|
-
if type == :class
|
35
|
-
class_option name, options
|
36
|
-
else
|
37
|
-
method_option name, options
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
private_class_method :expand_named_option
|
42
|
-
|
43
|
-
named_option :debug, :desc => "Set debug flag", :type => :boolean
|
44
|
-
named_option :profile, :desc => "Set profiler flag", :type => :boolean
|
45
|
-
named_option :config, :desc => "Set config path (default: #{CONFIG_PATH})", :banner => "FILE"
|
46
|
-
named_option :dry_run, :desc => "Perform a trial run with no changes made", :type => :boolean
|
47
|
-
|
48
|
-
################################################################
|
49
|
-
# command name mappings
|
50
|
-
|
51
|
-
map ["--version", "-v"] => :version
|
52
|
-
|
53
|
-
map ["--help", "-h"] => :help
|
54
|
-
|
55
|
-
default_command :help
|
56
|
-
|
57
|
-
################################################################
|
58
|
-
# Command: help
|
59
|
-
################################################################
|
60
|
-
|
61
|
-
desc "help [COMMAND]", "Describe available commands or one specific command"
|
62
|
-
|
63
|
-
def help(command = nil)
|
64
|
-
super(command)
|
65
|
-
end
|
66
|
-
|
67
|
-
################################################################
|
68
|
-
# Command: version
|
69
|
-
################################################################
|
70
|
-
desc "version", "Show version"
|
71
|
-
|
72
|
-
def version
|
73
|
-
puts Glima::VERSION
|
74
|
-
end
|
75
|
-
|
76
|
-
################################################################
|
77
|
-
# Command: completions
|
78
|
-
################################################################
|
79
|
-
check_unknown_options! :except => :completions
|
80
|
-
|
81
|
-
desc "completions [COMMAND]", "List available commands or options for COMMAND", :hide => true
|
82
|
-
|
83
|
-
long_desc <<-LONGDESC
|
84
|
-
List available commands or options for COMMAND
|
85
|
-
This is supposed to be a zsh compsys helper"
|
86
|
-
LONGDESC
|
87
|
-
|
88
|
-
def completions(*command)
|
89
|
-
help = self.class.commands
|
90
|
-
global_options = self.class.class_options
|
91
|
-
Glima::Command::Completions.new(help, global_options, command, config)
|
92
|
-
end
|
93
|
-
|
94
|
-
################################################################
|
95
|
-
# add some hooks to Thor
|
96
|
-
|
97
|
-
no_commands do
|
98
|
-
def invoke_command(command, *args)
|
99
|
-
setup_global_options unless command.name == "init"
|
100
|
-
result = super
|
101
|
-
teardown
|
102
|
-
result
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
################################################################
|
107
|
-
# private
|
108
|
-
|
109
|
-
private
|
110
|
-
|
111
|
-
def exit_on_error(&block)
|
112
|
-
begin
|
113
|
-
yield if block_given?
|
114
|
-
rescue Glima::ConfigurationError => e
|
115
|
-
STDERR.print "ERROR: #{e.message}.\n"
|
116
|
-
exit 1
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
attr_reader :builder, :config, :client, :context, :datastore
|
121
|
-
|
122
|
-
def setup_global_options
|
123
|
-
exit_on_error do
|
124
|
-
if options[:profile]
|
125
|
-
require 'profiler'
|
126
|
-
Profiler__.start_profile
|
127
|
-
end
|
128
|
-
if options[:debug]
|
129
|
-
require "pp"
|
130
|
-
$GLIMA_DEBUG = true
|
131
|
-
$GLIMA_DEBUG_FOR_DEVELOPER = true if ENV["GLIMA_DEBUG_FOR_DEVELOPER"]
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def load_plugins
|
137
|
-
config_path = options[:config] || CONFIG_PATH
|
138
|
-
plugin_dir = File.dirname(config_path)
|
139
|
-
|
140
|
-
Dir.glob(File.expand_path("plugins/*.rb", plugin_dir)) do |rb|
|
141
|
-
require rb
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def teardown
|
146
|
-
if options[:profile]
|
147
|
-
Profiler__.print_profile($stdout)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|