sakura-cli 0.2.2 → 0.3.1
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/.pre-commit-config.yaml +38 -0
- data/.rubocop.yml +25 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/Rakefile +3 -1
- data/commitlint.config.cjs +8 -0
- data/exe/sakura +2 -1
- data/lib/sakura/cli/mail.rb +31 -21
- data/lib/sakura/cli/root.rb +2 -0
- data/lib/sakura/cli/version.rb +3 -1
- data/lib/sakura/client.rb +25 -21
- data/lib/sakura/mail_address.rb +90 -57
- data/lib/sakura.rb +2 -0
- data/sakura-cli.gemspec +16 -16
- metadata +8 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f7358990dba35c3c047f671e22d5bf889b75108be086326ad7c4536f309216a
|
4
|
+
data.tar.gz: 101f9ba9c359a1e465934476d0a3b67579cd2a2b303a089bac3b127690801e01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9885961c6790969dfa6f44743175c215fa577d1be4f2b0bc952dcb9d0bd3f020ab07a601ecea346c4922ad2cef62e5c72edc5d4614cfd5888da6c29ce48a99e
|
7
|
+
data.tar.gz: 1fb759e6ed463842db9e70f14d61e422d1bc2349e7cfc747c2b3df74ab1c563d9aac5522b983761c8c23d8da74b30d8d1ab23463f9ee77c7ea0d76167e7335a7
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
exclude: ^bin/(bundle|dev|rails|rake|setup)$
|
3
|
+
repos:
|
4
|
+
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
|
5
|
+
rev: v9.14.0
|
6
|
+
hooks:
|
7
|
+
- id: commitlint
|
8
|
+
stages: [ commit-msg ]
|
9
|
+
additional_dependencies: [ "@commitlint/config-conventional" ]
|
10
|
+
|
11
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
12
|
+
rev: v4.6.0
|
13
|
+
hooks:
|
14
|
+
- id: check-executables-have-shebangs
|
15
|
+
- id: check-merge-conflict
|
16
|
+
- id: check-symlinks
|
17
|
+
- id: detect-private-key
|
18
|
+
- id: check-json
|
19
|
+
- id: check-yaml
|
20
|
+
- id: check-toml
|
21
|
+
- id: pretty-format-json
|
22
|
+
args: [ "--autofix", "--no-sort-keys" ]
|
23
|
+
- id: debug-statements
|
24
|
+
- id: mixed-line-ending
|
25
|
+
- id: trailing-whitespace
|
26
|
+
- id: end-of-file-fixer
|
27
|
+
exclude: ^config/credentials.yml.enc$
|
28
|
+
|
29
|
+
# ruby
|
30
|
+
|
31
|
+
- repo: https://github.com/rubocop/rubocop
|
32
|
+
rev: v1.62.1
|
33
|
+
hooks:
|
34
|
+
- id: rubocop
|
35
|
+
args:
|
36
|
+
- "-A"
|
37
|
+
additional_dependencies:
|
38
|
+
- rubocop-rails
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Style/Documentation:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Metrics/ClassLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/MethodLength:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/BlockLength:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Metrics/AbcSize:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/CyclomaticComplexity:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Metrics/PerceivedComplexity:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
AllCops:
|
23
|
+
NewCops: enable
|
24
|
+
Exclude:
|
25
|
+
- gem/**/*
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2015-
|
3
|
+
Copyright (c) 2015-2025 Shintaro Kojima
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
data/Rakefile
CHANGED
data/exe/sakura
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'pathname'
|
4
5
|
|
5
|
-
|
6
|
+
$LOAD_PATH << File.expand_path('../../lib', Pathname.new(__FILE__).realpath)
|
6
7
|
|
7
8
|
require 'sakura/cli/root'
|
8
9
|
Sakura::Cli::Root.start
|
data/lib/sakura/cli/mail.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
1
4
|
require 'thor'
|
2
5
|
require 'sakura'
|
3
6
|
require 'sakura/client'
|
@@ -15,7 +18,7 @@ module Sakura
|
|
15
18
|
|
16
19
|
puts "# domain: #{Client.current_session.domain}"
|
17
20
|
puts MailAddress.header
|
18
|
-
addrs.each { |addr| puts addr
|
21
|
+
addrs.each { |addr| puts addr }
|
19
22
|
end
|
20
23
|
|
21
24
|
desc 'create LOCAL_PART [PASSWORD]', 'Create a mail address'
|
@@ -27,9 +30,10 @@ module Sakura
|
|
27
30
|
|
28
31
|
begin
|
29
32
|
MailAddress.create local_part, password
|
30
|
-
rescue
|
33
|
+
rescue StandardError
|
31
34
|
raise if options[:verbose]
|
32
|
-
|
35
|
+
|
36
|
+
abort $ERROR_INFO
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
@@ -40,9 +44,10 @@ module Sakura
|
|
40
44
|
|
41
45
|
begin
|
42
46
|
find(local_part).delete
|
43
|
-
rescue
|
47
|
+
rescue StandardError
|
44
48
|
raise if options[:verbose]
|
45
|
-
|
49
|
+
|
50
|
+
abort $ERROR_INFO
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
@@ -59,9 +64,10 @@ module Sakura
|
|
59
64
|
else
|
60
65
|
puts mail.quota
|
61
66
|
end
|
62
|
-
rescue
|
67
|
+
rescue StandardError
|
63
68
|
raise if options[:verbose]
|
64
|
-
|
69
|
+
|
70
|
+
abort $ERROR_INFO
|
65
71
|
end
|
66
72
|
end
|
67
73
|
|
@@ -75,9 +81,10 @@ module Sakura
|
|
75
81
|
|
76
82
|
begin
|
77
83
|
mail.password = password
|
78
|
-
rescue
|
84
|
+
rescue StandardError
|
79
85
|
raise if options[:verbose]
|
80
|
-
|
86
|
+
|
87
|
+
abort $ERROR_INFO
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
@@ -99,9 +106,10 @@ module Sakura
|
|
99
106
|
when nil
|
100
107
|
puts mail.virus_scan
|
101
108
|
end
|
102
|
-
rescue
|
109
|
+
rescue StandardError
|
103
110
|
raise if options[:verbose]
|
104
|
-
|
111
|
+
|
112
|
+
abort $ERROR_INFO
|
105
113
|
end
|
106
114
|
end
|
107
115
|
|
@@ -110,9 +118,7 @@ module Sakura
|
|
110
118
|
def forward(local_part, operation = nil, mail_to_forward = nil)
|
111
119
|
preprocess
|
112
120
|
|
113
|
-
if (operation && operation !~ /add|remove/) || (!mail_to_forward && operation)
|
114
|
-
self.class.handle_argument_error
|
115
|
-
end
|
121
|
+
self.class.handle_argument_error if (operation && operation !~ /add|remove/) || (!mail_to_forward && operation)
|
116
122
|
|
117
123
|
mail = find(local_part)
|
118
124
|
|
@@ -125,9 +131,10 @@ module Sakura
|
|
125
131
|
when nil
|
126
132
|
mail.forward_list.each { |m| puts m }
|
127
133
|
end
|
128
|
-
rescue
|
134
|
+
rescue StandardError
|
129
135
|
raise if options[:verbose]
|
130
|
-
|
136
|
+
|
137
|
+
abort $ERROR_INFO
|
131
138
|
end
|
132
139
|
end
|
133
140
|
|
@@ -149,9 +156,10 @@ module Sakura
|
|
149
156
|
when nil
|
150
157
|
puts mail.keep
|
151
158
|
end
|
152
|
-
rescue
|
159
|
+
rescue StandardError
|
153
160
|
raise if options[:verbose]
|
154
|
-
|
161
|
+
|
162
|
+
abort $ERROR_INFO
|
155
163
|
end
|
156
164
|
end
|
157
165
|
|
@@ -171,9 +179,10 @@ module Sakura
|
|
171
179
|
else
|
172
180
|
mail.spam_filter = value.to_sym
|
173
181
|
end
|
174
|
-
rescue
|
182
|
+
rescue StandardError
|
175
183
|
raise if options[:verbose]
|
176
|
-
|
184
|
+
|
185
|
+
abort $ERROR_INFO
|
177
186
|
end
|
178
187
|
end
|
179
188
|
|
@@ -196,6 +205,7 @@ module Sakura
|
|
196
205
|
mail = MailAddress.find(local_part)
|
197
206
|
rescue Capybara::ElementNotFound
|
198
207
|
raise if options[:verbose]
|
208
|
+
|
199
209
|
abort %(No mail address: "#{local_part}")
|
200
210
|
end
|
201
211
|
|
@@ -213,7 +223,7 @@ module Sakura
|
|
213
223
|
end
|
214
224
|
|
215
225
|
def abort(message)
|
216
|
-
super
|
226
|
+
super("\nERROR: #{message}")
|
217
227
|
end
|
218
228
|
end
|
219
229
|
end
|
data/lib/sakura/cli/root.rb
CHANGED
data/lib/sakura/cli/version.rb
CHANGED
data/lib/sakura/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'capybara/dsl'
|
2
4
|
require 'selenium-webdriver'
|
3
5
|
|
@@ -11,16 +13,15 @@ module Sakura
|
|
11
13
|
include Capybara::DSL
|
12
14
|
|
13
15
|
attr_reader :domain
|
14
|
-
|
16
|
+
|
17
|
+
@verbose = false
|
15
18
|
|
16
19
|
class << self
|
20
|
+
attr_accessor :verbose
|
21
|
+
|
17
22
|
def current_session
|
18
23
|
@current_session ||= new
|
19
24
|
end
|
20
|
-
|
21
|
-
def verbose=(bool)
|
22
|
-
@@verbose = !!bool
|
23
|
-
end
|
24
25
|
end
|
25
26
|
|
26
27
|
def initialize
|
@@ -32,19 +33,25 @@ module Sakura
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def login
|
35
|
-
|
36
|
+
warn 'login' if self.class.verbose
|
36
37
|
|
37
38
|
visit BASE_URL
|
38
|
-
fill_in '
|
39
|
-
fill_in '
|
39
|
+
fill_in 'username', with: @domain
|
40
|
+
fill_in 'password', with: @passwd
|
40
41
|
find('form button[type=submit]').click
|
41
42
|
|
42
|
-
|
43
|
+
if has_text?('認証コード')
|
44
|
+
puts '認証コード:'
|
45
|
+
otp = $stdin.gets
|
43
46
|
|
44
|
-
|
45
|
-
|
47
|
+
fill_in 'login-otp', with: otp
|
48
|
+
find('form button[type=submit]').click
|
46
49
|
end
|
47
50
|
|
51
|
+
wait_for_loading
|
52
|
+
|
53
|
+
@logged_in = true if page.text =~ /サーバーコントロールパネル ホーム/
|
54
|
+
|
48
55
|
raise_when_error
|
49
56
|
login?
|
50
57
|
end
|
@@ -52,23 +59,22 @@ module Sakura
|
|
52
59
|
def get(url, expected)
|
53
60
|
login unless login?
|
54
61
|
|
55
|
-
|
62
|
+
warn "visit #{url}" if self.class.verbose
|
56
63
|
visit url
|
57
64
|
wait_for_loading
|
58
|
-
unless page.text =~ expected
|
59
|
-
raise Timeout::Error.new('Timed out')
|
60
|
-
end
|
65
|
+
raise Timeout::Error, 'Timed out' unless page.text =~ expected
|
61
66
|
|
62
67
|
page
|
63
68
|
end
|
64
69
|
|
65
|
-
def process(url, expected
|
70
|
+
def process(url, expected)
|
66
71
|
login unless login?
|
67
72
|
|
68
73
|
get url, expected
|
69
74
|
yield page
|
70
75
|
|
71
76
|
raise_when_error
|
77
|
+
wait_for_loading
|
72
78
|
page
|
73
79
|
end
|
74
80
|
|
@@ -94,11 +100,9 @@ module Sakura
|
|
94
100
|
|
95
101
|
def wait_for_loading
|
96
102
|
5.times do
|
97
|
-
if
|
98
|
-
|
99
|
-
|
100
|
-
$stderr.puts 'still loading ...' if @@verbose
|
101
|
-
end
|
103
|
+
break if all('読み込み中').empty?
|
104
|
+
|
105
|
+
warn 'still loading ...' if self.class.verbose
|
102
106
|
end
|
103
107
|
end
|
104
108
|
end
|
data/lib/sakura/mail_address.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'sakura/client'
|
2
4
|
|
3
5
|
module Sakura
|
4
6
|
class MailAddress
|
5
|
-
MAIL_URL = BASE_URL
|
7
|
+
MAIL_URL = "#{BASE_URL}users/list/".freeze
|
6
8
|
|
7
9
|
attr_reader :address, :usage, :quota, :link
|
8
10
|
|
9
11
|
class << self
|
10
12
|
def create(local_part, password)
|
11
|
-
Client.current_session.process(MAIL_URL,
|
13
|
+
Client.current_session.process(MAIL_URL, /メールアドレス/) do |page|
|
12
14
|
page.first(:xpath, '//a[text() = "新規追加"]').click
|
13
15
|
|
14
16
|
page.find(:xpath, '//label[contains(text(), "ユーザ名")]/..//input')
|
15
17
|
.fill_in with: local_part
|
16
|
-
page.
|
18
|
+
page.all(:xpath, '//label[contains(text(), "パスワード")]/..//input').each do |e|
|
17
19
|
e.fill_in with: password
|
18
20
|
end
|
21
|
+
page.find(:xpath, '//label[contains(text(), "メールの受信")]/..//*[contains(text(), "受信する")]/../input').choose
|
19
22
|
page.find(:xpath, '//button[text() = "作成する"]').click
|
20
23
|
end
|
21
24
|
|
@@ -23,26 +26,33 @@ module Sakura
|
|
23
26
|
end
|
24
27
|
|
25
28
|
def all
|
26
|
-
page = Client.current_session.get(MAIL_URL,
|
27
|
-
page.
|
29
|
+
page = Client.current_session.get(MAIL_URL, /メールアドレス/)
|
30
|
+
page.find('.input-text.page-limit-selector').select '300件'
|
31
|
+
wait_for_loading page
|
28
32
|
|
29
|
-
page.all(
|
33
|
+
page.all('.entities-item').map do |element|
|
30
34
|
MailAddress.new_from_element(element)
|
31
|
-
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
def find(local_part)
|
35
|
-
page = Client.current_session.get(MAIL_URL,
|
36
|
-
page.
|
37
|
-
|
38
|
-
|
39
|
+
page = Client.current_session.get(MAIL_URL, /メールアドレス/)
|
40
|
+
page.find('.input-text.page-limit-selector').select '300件'
|
41
|
+
wait_for_loading page
|
42
|
+
|
43
|
+
element = page.find(
|
44
|
+
:xpath,
|
45
|
+
# rubocop:disable Layout/LineLength
|
46
|
+
"//div[contains(@class, \"entities-item\")]//div[@class=\"username\" and contains(text(), \"#{local_part}\")]/../../.."
|
47
|
+
# rubocop:enable Layout/LineLength
|
48
|
+
)
|
39
49
|
MailAddress.new_from_element(element)
|
40
50
|
end
|
41
51
|
|
42
52
|
def new_from_element(element)
|
43
53
|
MailAddress.new(
|
44
54
|
element.find('.username').text.split('@').first,
|
45
|
-
element.find('.
|
55
|
+
element.find('.col-usage').text
|
46
56
|
)
|
47
57
|
end
|
48
58
|
|
@@ -53,15 +63,25 @@ module Sakura
|
|
53
63
|
|
54
64
|
def tabularize(*args)
|
55
65
|
args[0].ljust(20) <<
|
56
|
-
"#{args[1]} /".
|
66
|
+
"#{args[1]} /".rjust(15) <<
|
57
67
|
args[2].to_s.rjust(10) <<
|
58
68
|
" (#{args[3].to_s.rjust(3)})"
|
59
69
|
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def wait_for_loading(page)
|
74
|
+
5.times do
|
75
|
+
break if page.all('読み込み中').empty?
|
76
|
+
|
77
|
+
warn 'still loading ...' if self.class.verbose
|
78
|
+
end
|
79
|
+
end
|
60
80
|
end
|
61
81
|
|
62
82
|
def initialize(address, usage)
|
63
83
|
@address = address
|
64
|
-
@usage, @quota = usage.split(
|
84
|
+
@usage, @quota = usage.split(%r{\s*/\s*|\s+})
|
65
85
|
end
|
66
86
|
|
67
87
|
def delete
|
@@ -80,16 +100,16 @@ module Sakura
|
|
80
100
|
Client.current_session.process(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/) do |page|
|
81
101
|
case value
|
82
102
|
when /(\d+)\s*GB$/
|
83
|
-
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with:
|
103
|
+
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with: ::Regexp.last_match(1)
|
84
104
|
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//select').select 'GB'
|
85
105
|
when /(\d+)\s*MB$/
|
86
|
-
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with:
|
106
|
+
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with: ::Regexp.last_match(1)
|
87
107
|
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//select').select 'MB'
|
88
108
|
when /(\d+)\s*KB$/
|
89
|
-
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with:
|
109
|
+
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with: ::Regexp.last_match(1)
|
90
110
|
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//select').select 'KB'
|
91
111
|
when /(\d+)\s*B$/
|
92
|
-
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with:
|
112
|
+
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//input').fill_in with: ::Regexp.last_match(1)
|
93
113
|
page.find(:xpath, '//label[contains(text(), "メール容量制限")]/..//select').select 'B'
|
94
114
|
else
|
95
115
|
raise %(Unsupported quota value "#{value}")
|
@@ -104,7 +124,7 @@ module Sakura
|
|
104
124
|
def password=(value)
|
105
125
|
# FIXME: The URL won't work when mail addresses are more than 300
|
106
126
|
Client.current_session.process(MAIL_URL + "1/password/#{@address}", /#{@address}のパスワード設定/) do |page|
|
107
|
-
page.
|
127
|
+
page.all(:xpath, '//label[contains(text(), "パスワード")]/..//input').each do |e|
|
108
128
|
e.fill_in with: value
|
109
129
|
end
|
110
130
|
page.find(:xpath, '//button[text() = "変更する"]').click
|
@@ -115,7 +135,7 @@ module Sakura
|
|
115
135
|
if @virus_scan.nil?
|
116
136
|
# FIXME: The URL won't work when mail addresses are more than 300
|
117
137
|
page ||= Client.current_session.get(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/)
|
118
|
-
@virus_scan = page.find('[name="
|
138
|
+
@virus_scan = page.find('[name="usesMailVirusCheck"]:checked').value == '1'
|
119
139
|
end
|
120
140
|
|
121
141
|
@virus_scan
|
@@ -124,7 +144,7 @@ module Sakura
|
|
124
144
|
def virus_scan=(value)
|
125
145
|
# FIXME: The URL won't work when mail addresses are more than 300
|
126
146
|
Client.current_session.process(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/) do |page|
|
127
|
-
page.find("[name='
|
147
|
+
page.find("[name='usesMailVirusCheck'][value='#{value ? 1 : 0}']").choose
|
128
148
|
page.find(:xpath, '//button[text() = "保存する"]').click
|
129
149
|
end
|
130
150
|
|
@@ -132,18 +152,18 @@ module Sakura
|
|
132
152
|
end
|
133
153
|
|
134
154
|
def enable_virus_scan
|
135
|
-
|
155
|
+
true
|
136
156
|
end
|
137
157
|
|
138
158
|
def disable_virus_scan
|
139
|
-
|
159
|
+
false
|
140
160
|
end
|
141
161
|
|
142
162
|
def keep(page = nil)
|
143
163
|
if @keep.nil?
|
144
164
|
# FIXME: The URL won't work when mail addresses are more than 300
|
145
165
|
page ||= Client.current_session.get(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/)
|
146
|
-
@keep = page.find('[name="
|
166
|
+
@keep = page.find('[name="mailReceiveType"]:checked').value == '1'
|
147
167
|
end
|
148
168
|
|
149
169
|
@keep
|
@@ -152,7 +172,8 @@ module Sakura
|
|
152
172
|
def keep=(value)
|
153
173
|
# FIXME: The URL won't work when mail addresses are more than 300
|
154
174
|
Client.current_session.process(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/) do |page|
|
155
|
-
|
175
|
+
text = value ? '受信する' : '転送専用'
|
176
|
+
page.find(:xpath, "//label[contains(text(), \"メールの受信\")]/..//*[contains(text(), \"#{text}\")]/../input").choose
|
156
177
|
page.find(:xpath, '//button[text() = "保存する"]').click
|
157
178
|
end
|
158
179
|
|
@@ -160,11 +181,11 @@ module Sakura
|
|
160
181
|
end
|
161
182
|
|
162
183
|
def enable_keep
|
163
|
-
|
184
|
+
true
|
164
185
|
end
|
165
186
|
|
166
187
|
def disable_keep
|
167
|
-
|
188
|
+
false
|
168
189
|
end
|
169
190
|
|
170
191
|
def spam_filter(page = nil)
|
@@ -172,15 +193,20 @@ module Sakura
|
|
172
193
|
# FIXME: The URL won't work when mail addresses are more than 300
|
173
194
|
page ||= Client.current_session.get(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/)
|
174
195
|
|
175
|
-
case page.find(:
|
176
|
-
when
|
196
|
+
case page.find("[name='spamFilterType']:checked").value
|
197
|
+
when '1'
|
177
198
|
@spam_filter = :disable
|
178
|
-
when
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
199
|
+
when '2'
|
200
|
+
case page.find("[name='spamFilterAction']").value
|
201
|
+
when '1'
|
202
|
+
@spam_filter = :quarantine
|
203
|
+
when '2'
|
204
|
+
@spam_filter = :discard
|
205
|
+
when '3'
|
206
|
+
@spam_filter = :mark
|
207
|
+
end
|
208
|
+
when '3'
|
209
|
+
@spam_filter = :precise
|
184
210
|
end
|
185
211
|
end
|
186
212
|
|
@@ -190,20 +216,27 @@ module Sakura
|
|
190
216
|
def spam_filter=(value)
|
191
217
|
# FIXME: The URL won't work when mail addresses are more than 300
|
192
218
|
Client.current_session.process(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/) do |page|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
case value
|
219
|
+
text = nil
|
220
|
+
action = nil
|
221
|
+
case value.to_sym
|
197
222
|
when :disable
|
198
|
-
|
223
|
+
text = '利用しない'
|
199
224
|
when :quarantine
|
200
|
-
|
225
|
+
text = '簡易' # "迷惑メールフィルタ" doesn't work
|
226
|
+
action = '「迷惑メール」フォルダに保存 [推奨]'
|
201
227
|
when :discard
|
202
|
-
|
228
|
+
text = '簡易' # "迷惑メールフィルタ" doesn't work
|
229
|
+
action = 'メールを破棄'
|
203
230
|
when :mark
|
204
|
-
|
231
|
+
text = '簡易' # "迷惑メールフィルタ" doesn't work
|
232
|
+
action = 'フィルターのみ利用'
|
233
|
+
when :precise
|
234
|
+
'高精度迷惑メールフィルタ'
|
205
235
|
end
|
206
236
|
|
237
|
+
page.find(:xpath,
|
238
|
+
"//label[contains(text(), \"迷惑メールフィルタ\")]/..//*[contains(text(), \"#{text}\")]/../input").choose
|
239
|
+
page.find("[name='spamFilterAction']").select action if action
|
207
240
|
page.find(:xpath, '//button[text() = "保存する"]').click
|
208
241
|
end
|
209
242
|
|
@@ -252,32 +285,32 @@ module Sakura
|
|
252
285
|
# FIXME: The URL won't work when mail addresses are more than 300
|
253
286
|
page = Client.current_session.get(MAIL_URL + "1/edit/#{@address}", /#{@address}の設定/)
|
254
287
|
|
255
|
-
|
256
|
-
usage / quota: #{usage} / #{quota} (#{percentage(@usage, @quota)})
|
257
|
-
forward_to: #{forward_list(page).join(' ')}
|
258
|
-
keep mail: #{keep(page)}
|
259
|
-
virus scan: #{virus_scan(page)}
|
260
|
-
spam filter: #{spam_filter(page)}
|
261
|
-
|
288
|
+
<<~END_OF_STRING
|
289
|
+
usage / quota: #{usage} / #{quota} (#{percentage(@usage, @quota)})
|
290
|
+
forward_to: #{forward_list(page).join(' ')}
|
291
|
+
keep mail: #{keep(page)}
|
292
|
+
virus scan: #{virus_scan(page)}
|
293
|
+
spam filter: #{spam_filter(page)}
|
294
|
+
END_OF_STRING
|
262
295
|
end
|
263
296
|
|
264
297
|
private
|
265
298
|
|
266
299
|
def percentage(usage, quota)
|
267
|
-
usage, quota = [usage, quota].map
|
300
|
+
usage, quota = [usage, quota].map do |i|
|
268
301
|
case i
|
269
302
|
when /([\d.]+)TB$/
|
270
|
-
|
303
|
+
::Regexp.last_match(1).to_f * 1_000_000_000_000
|
271
304
|
when /([\d.]+)GB$/
|
272
|
-
|
305
|
+
::Regexp.last_match(1).to_f * 1_000_000_000
|
273
306
|
when /([\d.]+)MB$/
|
274
|
-
|
307
|
+
::Regexp.last_match(1).to_f * 1_000_000
|
275
308
|
when /([\d.]+)KB$/
|
276
|
-
|
309
|
+
::Regexp.last_match(1).to_f * 1000
|
277
310
|
when /([\d.]+)B$/
|
278
|
-
|
311
|
+
::Regexp.last_match(1).to_i
|
279
312
|
end
|
280
|
-
|
313
|
+
end
|
281
314
|
|
282
315
|
"#{(usage * 100 / quota).to_i}%"
|
283
316
|
end
|
data/lib/sakura.rb
CHANGED
data/sakura-cli.gemspec
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'sakura/cli/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'sakura-cli'
|
8
9
|
spec.version = Sakura::Cli::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['Shintaro Kojima']
|
11
|
+
spec.email = ['goodies@codeout.net']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.summary = "Command-line tool for Sakura's Rental Server."
|
14
|
+
spec.description = 'Command-line tool and client library to control the dashboard of Sakura Rental Server.'
|
15
|
+
spec.homepage = 'https://github.com/codeout/sakura-cli'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(bin|test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
19
|
+
spec.bindir = 'exe'
|
19
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ['lib']
|
21
22
|
|
22
|
-
spec.add_runtime_dependency
|
23
|
-
spec.add_runtime_dependency
|
24
|
-
spec.add_runtime_dependency
|
25
|
-
spec.add_development_dependency "bundler"
|
26
|
-
spec.add_development_dependency "rake"
|
23
|
+
spec.add_runtime_dependency 'capybara'
|
24
|
+
spec.add_runtime_dependency 'selenium-webdriver'
|
25
|
+
spec.add_runtime_dependency 'thor'
|
27
26
|
spec.required_ruby_version = '>= 3.0.0'
|
27
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sakura-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shintaro Kojima
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-05-17 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: capybara
|
@@ -52,34 +51,6 @@ dependencies:
|
|
52
51
|
- - ">="
|
53
52
|
- !ruby/object:Gem::Version
|
54
53
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
54
|
description: Command-line tool and client library to control the dashboard of Sakura
|
84
55
|
Rental Server.
|
85
56
|
email:
|
@@ -90,10 +61,13 @@ extensions: []
|
|
90
61
|
extra_rdoc_files: []
|
91
62
|
files:
|
92
63
|
- ".gitignore"
|
64
|
+
- ".pre-commit-config.yaml"
|
65
|
+
- ".rubocop.yml"
|
93
66
|
- Gemfile
|
94
67
|
- LICENSE.txt
|
95
68
|
- README.md
|
96
69
|
- Rakefile
|
70
|
+
- commitlint.config.cjs
|
97
71
|
- exe/sakura
|
98
72
|
- lib/sakura.rb
|
99
73
|
- lib/sakura/cli/mail.rb
|
@@ -105,8 +79,8 @@ files:
|
|
105
79
|
homepage: https://github.com/codeout/sakura-cli
|
106
80
|
licenses:
|
107
81
|
- MIT
|
108
|
-
metadata:
|
109
|
-
|
82
|
+
metadata:
|
83
|
+
rubygems_mfa_required: 'true'
|
110
84
|
rdoc_options: []
|
111
85
|
require_paths:
|
112
86
|
- lib
|
@@ -121,8 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
95
|
- !ruby/object:Gem::Version
|
122
96
|
version: '0'
|
123
97
|
requirements: []
|
124
|
-
rubygems_version: 3.
|
125
|
-
signing_key:
|
98
|
+
rubygems_version: 3.6.2
|
126
99
|
specification_version: 4
|
127
100
|
summary: Command-line tool for Sakura's Rental Server.
|
128
101
|
test_files: []
|