green_day 0.1.6 → 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/.github/workflows/ruby.yml +13 -45
- data/.rubocop.yml +1 -1
- data/README.md +2 -2
- data/green_day.gemspec +4 -1
- data/lib/green_day/atcoder_client.rb +9 -3
- data/lib/green_day/cli.rb +41 -10
- data/lib/green_day/contest.rb +3 -4
- data/lib/green_day/snippet_builder.rb +17 -0
- data/lib/green_day/task.rb +3 -5
- data/lib/green_day/test_builder.rb +6 -4
- data/lib/green_day/version.rb +1 -1
- metadata +49 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dec8f7c9c721bbd5e652f18959de01d9a90d6ec3a1d7caf57eed76aa31ad9378
|
4
|
+
data.tar.gz: c2afef234af2730e3a2ac2fff659dcfc85489b0292d2395f6382bab3a73d2f37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a6f108363c5e35d96b5739184318260d64da36187a259449ac5fde602d6d70a16d7bfab01f64f4a8794fcbbfa49322bdfb13ae408a7ffd0299820a5eac2f806
|
7
|
+
data.tar.gz: 9e6d545f778fd361853c082fcd1d67564d59edef0bbe88ac2f47189c0bcc1b1c4603f35374cf0d8728c455b8c0ed33f18e96eb54ddf5e8432a72a688d1684de8
|
data/.github/workflows/ruby.yml
CHANGED
@@ -1,60 +1,28 @@
|
|
1
1
|
name: Ruby
|
2
2
|
|
3
|
-
on:
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
push:
|
6
|
+
branches: [ master ]
|
4
7
|
|
5
8
|
jobs:
|
6
|
-
|
7
|
-
|
8
|
-
runs-on: ${{ matrix.runner }}
|
9
|
-
|
9
|
+
rspec:
|
10
|
+
runs-on: ubuntu-latest
|
10
11
|
strategy:
|
11
|
-
fail-fast: false
|
12
|
-
|
13
12
|
matrix:
|
14
13
|
ruby:
|
15
|
-
- 2.
|
16
|
-
- 2.7.0
|
17
|
-
include:
|
18
|
-
- ruby: 2.3.3
|
19
|
-
runner: ubuntu-16.04
|
20
|
-
- ruby: 2.7.0
|
21
|
-
runner: ubuntu-latest
|
22
|
-
|
14
|
+
- 2.7.1
|
23
15
|
steps:
|
24
16
|
- uses: actions/checkout@v2
|
25
|
-
|
26
|
-
|
27
|
-
uses: masa-iwasaki/setup-rbenv@1.1.0
|
28
|
-
|
29
|
-
- name: Cache RBENV_ROOT
|
30
|
-
uses: actions/cache@v1
|
31
|
-
id: cache_rbenv
|
17
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
18
|
+
uses: actions/setup-ruby@v1
|
32
19
|
with:
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
- name: Reinstall libssl-dev
|
37
|
-
run: |
|
38
|
-
set -xe
|
39
|
-
sudo apt-get remove -y libssl-dev
|
40
|
-
sudo apt-get install -y libssl-dev=1.0.2g-1ubuntu4.15
|
41
|
-
if: matrix.runner == 'ubuntu-16.04'
|
42
|
-
|
43
|
-
- name: Install Ruby
|
44
|
-
env:
|
45
|
-
RBENV_VERSION: ${{ matrix.ruby }}
|
46
|
-
run: |
|
47
|
-
set -xe
|
48
|
-
eval "$(rbenv init -)"
|
49
|
-
rbenv install -s $RBENV_VERSION
|
50
|
-
gem install bundler || true
|
51
|
-
|
52
|
-
- name: test with Rake
|
20
|
+
ruby-version: ${{ matrix.ruby }}
|
21
|
+
- name: Rspec with rake
|
53
22
|
env:
|
54
23
|
USER_NAME: ${{ secrets.USER_NAME }}
|
55
24
|
PASSWORD: ${{ secrets.PASSWORD }}
|
56
|
-
|
25
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
57
26
|
run: |
|
58
|
-
eval "$(rbenv init -)"
|
59
27
|
bundle install --jobs 4 --retry 3
|
60
|
-
|
28
|
+
script -e -c rake
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -18,11 +18,11 @@ Or install it yourself as:
|
|
18
18
|
$ gem install green_day
|
19
19
|
|
20
20
|
## Usage
|
21
|
-
login(this command stores your cookie as
|
21
|
+
login(this command stores your cookie as `.cookie-store` in current directory)
|
22
22
|
|
23
23
|
$ bundle exec green_day login
|
24
24
|
|
25
|
-
If you want to delete session, remove
|
25
|
+
If you want to delete session, remove `.cookie-store`
|
26
26
|
|
27
27
|
This command creates directory and spec.
|
28
28
|
|
data/green_day.gemspec
CHANGED
@@ -25,13 +25,16 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.bindir = 'exe'
|
26
26
|
spec.require_paths = ['lib']
|
27
27
|
|
28
|
+
spec.add_dependency 'colorize'
|
28
29
|
spec.add_dependency 'faraday', '< 1.0'
|
29
30
|
spec.add_dependency 'faraday-cookie_jar'
|
30
31
|
spec.add_dependency 'nokogiri'
|
32
|
+
spec.add_dependency 'parallel'
|
31
33
|
spec.add_dependency 'rspec', '~> 3.0'
|
32
34
|
spec.add_dependency 'thor'
|
33
35
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
36
|
+
spec.add_development_dependency 'codecov'
|
34
37
|
spec.add_development_dependency 'dotenv'
|
35
|
-
spec.add_development_dependency 'rake', '
|
38
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
36
39
|
spec.add_development_dependency 'rubocop'
|
37
40
|
end
|
@@ -8,7 +8,7 @@ require 'nokogiri'
|
|
8
8
|
module GreenDay
|
9
9
|
class AtcoderClient
|
10
10
|
ATCODER_ENDPOINT = 'https://atcoder.jp'
|
11
|
-
|
11
|
+
COOKIE_FILE_NAME = '.cookie-store'
|
12
12
|
attr_reader :client, :cookie_jar
|
13
13
|
|
14
14
|
def initialize
|
@@ -57,14 +57,20 @@ module GreenDay
|
|
57
57
|
raise Error, CGI.unescape(select_flash_cookie.value).split('.').shift
|
58
58
|
end
|
59
59
|
|
60
|
-
cookie_jar.save(
|
60
|
+
cookie_jar.save(COOKIE_FILE_NAME)
|
61
61
|
end
|
62
62
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def create_or_load_cookie_jar
|
66
66
|
jar = HTTP::CookieJar.new
|
67
|
-
|
67
|
+
if File.exist?(COOKIE_FILE_NAME)
|
68
|
+
jar.load(COOKIE_FILE_NAME)
|
69
|
+
elsif File.exist?('cookie-store')
|
70
|
+
warn 'cookie-store needs rename .cookie-store'
|
71
|
+
jar.load('cookie-store')
|
72
|
+
end
|
73
|
+
|
68
74
|
jar
|
69
75
|
end
|
70
76
|
|
data/lib/green_day/cli.rb
CHANGED
@@ -1,37 +1,68 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'thor'
|
4
|
+
require 'parallel'
|
5
|
+
require 'colorize'
|
4
6
|
require 'io/console'
|
5
7
|
require_relative 'atcoder_client'
|
6
8
|
require_relative 'contest'
|
7
9
|
require_relative 'test_builder'
|
10
|
+
require_relative 'snippet_builder'
|
8
11
|
|
9
12
|
module GreenDay
|
10
13
|
class Cli < Thor
|
11
14
|
desc 'login Atcoder', 'login Atcoder and save session'
|
12
15
|
def login
|
13
16
|
print 'username:'
|
14
|
-
username = STDIN.gets
|
17
|
+
username = STDIN.gets(chomp: true)
|
15
18
|
print 'password:'
|
16
|
-
password = STDIN.gets.
|
19
|
+
password = STDIN.noecho { |stdin| stdin.gets(chomp: true) }.tap { puts }
|
17
20
|
|
18
21
|
AtcoderClient.new.login(username, password)
|
22
|
+
puts(
|
23
|
+
"Successfully created #{AtcoderClient::COOKIE_FILE_NAME}"
|
24
|
+
.colorize(:green)
|
25
|
+
)
|
19
26
|
end
|
20
27
|
|
21
28
|
desc 'new [contest name]', 'create contest workspace and spec'
|
22
29
|
def new(contest_name)
|
23
|
-
contest = Contest.new(contest_name)
|
30
|
+
contest = Contest.new(contest_name, AtcoderClient.new)
|
24
31
|
FileUtils.makedirs("#{contest_name}/spec")
|
25
32
|
|
26
|
-
contest.tasks
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
Parallel.each(contest.tasks) do |task|
|
34
|
+
create_submit_file!(contest_name, task)
|
35
|
+
create_spec_file!(contest_name, task)
|
36
|
+
end
|
37
|
+
|
38
|
+
puts "Successfully created #{contest_name} directory".colorize(:green)
|
39
|
+
end
|
30
40
|
|
31
|
-
|
32
|
-
|
33
|
-
|
41
|
+
private
|
42
|
+
|
43
|
+
def create_submit_file!(contest_name, task)
|
44
|
+
File.open(submit_file_path(contest_name, task), 'w') do |f|
|
45
|
+
f.write(SnippetBuilder.build)
|
34
46
|
end
|
35
47
|
end
|
48
|
+
|
49
|
+
def create_spec_file!(contest_name, task)
|
50
|
+
test =
|
51
|
+
TestBuilder.build_test(
|
52
|
+
submit_file_path(contest_name, task),
|
53
|
+
task.input_output_hash
|
54
|
+
)
|
55
|
+
File.open(spec_file_path(contest_name, task), 'w') do |f|
|
56
|
+
f.write(test)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def submit_file_path(contest_name, task)
|
61
|
+
"#{contest_name}/#{task.code}.rb"
|
62
|
+
end
|
63
|
+
|
64
|
+
def spec_file_path(contest_name, task)
|
65
|
+
"#{contest_name}/spec/#{task.code}_spec.rb"
|
66
|
+
end
|
36
67
|
end
|
37
68
|
end
|
data/lib/green_day/contest.rb
CHANGED
@@ -7,13 +7,12 @@ module GreenDay
|
|
7
7
|
class Contest
|
8
8
|
attr_reader :atcoder_client, :name, :tasks
|
9
9
|
|
10
|
-
def initialize(contest_name)
|
11
|
-
client = AtcoderClient.new
|
10
|
+
def initialize(contest_name, client)
|
12
11
|
raise GreenDay::Error 'cant find contest' unless client.contest_exist?(contest_name)
|
13
12
|
|
14
13
|
@name = contest_name
|
15
|
-
@tasks = client.fetch_task_codes(self)
|
16
|
-
Task.new(self, task_code)
|
14
|
+
@tasks = Parallel.map(client.fetch_task_codes(self)) do |task_code|
|
15
|
+
Task.new(self, task_code, client)
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GreenDay
|
4
|
+
module SnippetBuilder
|
5
|
+
ARRAY_INPUT_SNIPPET = 'gets.split.map(&:to_i)'
|
6
|
+
MULTIPLE_LINE_INPUT_SNIPPET =
|
7
|
+
'readlines.map(&:chomp!).map { |e| e.split.map(&:to_i) }'
|
8
|
+
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def build
|
12
|
+
[ARRAY_INPUT_SNIPPET, MULTIPLE_LINE_INPUT_SNIPPET]
|
13
|
+
.map { |snippet| '# ' + snippet }
|
14
|
+
.join("\n") + "\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/green_day/task.rb
CHANGED
@@ -3,17 +3,15 @@
|
|
3
3
|
module GreenDay
|
4
4
|
class Task
|
5
5
|
attr_reader :contest, :code, :input_output_hash
|
6
|
-
def initialize(contest, code)
|
6
|
+
def initialize(contest, code, client)
|
7
7
|
@contest = contest
|
8
8
|
@code = code
|
9
|
-
@input_output_hash = create_input_output_hash
|
9
|
+
@input_output_hash = create_input_output_hash(client)
|
10
10
|
end
|
11
11
|
|
12
12
|
private
|
13
13
|
|
14
|
-
def create_input_output_hash
|
15
|
-
client = AtcoderClient.new
|
16
|
-
|
14
|
+
def create_input_output_hash(client)
|
17
15
|
input_samples, output_samples =
|
18
16
|
client.fetch_inputs_and_outputs(contest, self)
|
19
17
|
|
@@ -4,20 +4,20 @@ module GreenDay
|
|
4
4
|
module TestBuilder
|
5
5
|
module_function
|
6
6
|
|
7
|
-
def build_test(
|
7
|
+
def build_test(submit_file_path, input_output_hash)
|
8
8
|
<<~SPEC
|
9
9
|
require 'rspec'
|
10
10
|
|
11
11
|
RSpec.describe 'test' do
|
12
|
-
#{input_output_hash.map { |input, output| build_example(
|
12
|
+
#{input_output_hash.map { |input, output| build_example(submit_file_path, input, output) }.join("\n")}
|
13
13
|
end
|
14
14
|
SPEC
|
15
15
|
end
|
16
16
|
|
17
|
-
def build_example(
|
17
|
+
def build_example(submit_file_path, input, output)
|
18
18
|
<<~SPEC
|
19
19
|
#{tab}it 'test with #{unify_cr_lf(input)}' do
|
20
|
-
#{tab}#{tab}io = IO.popen("ruby #{
|
20
|
+
#{tab}#{tab}io = IO.popen("ruby #{submit_file_path}", "w+")
|
21
21
|
#{tab}#{tab}io.puts(#{unify_cr_lf(input)})
|
22
22
|
#{tab}#{tab}io.close_write
|
23
23
|
#{tab}#{tab}expect(io.readlines.join).to eq(#{unify_cr_lf(output)})
|
@@ -26,6 +26,8 @@ module GreenDay
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def unify_cr_lf(string)
|
29
|
+
return unless string # たまに画像で例を出してくるとsampleの文字がなくなる
|
30
|
+
|
29
31
|
string.gsub(/\R/, "\n").dump
|
30
32
|
end
|
31
33
|
|
data/lib/green_day/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: green_day
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- qwyng
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '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'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: faraday
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: parallel
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rspec
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +122,20 @@ dependencies:
|
|
94
122
|
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '2.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: codecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
140
|
name: dotenv
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,16 +154,16 @@ dependencies:
|
|
112
154
|
name: rake
|
113
155
|
requirement: !ruby/object:Gem::Requirement
|
114
156
|
requirements:
|
115
|
-
- - "
|
157
|
+
- - ">="
|
116
158
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
159
|
+
version: 12.3.3
|
118
160
|
type: :development
|
119
161
|
prerelease: false
|
120
162
|
version_requirements: !ruby/object:Gem::Requirement
|
121
163
|
requirements:
|
122
|
-
- - "
|
164
|
+
- - ">="
|
123
165
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
166
|
+
version: 12.3.3
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
168
|
name: rubocop
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,6 +204,7 @@ files:
|
|
162
204
|
- lib/green_day/atcoder_client.rb
|
163
205
|
- lib/green_day/cli.rb
|
164
206
|
- lib/green_day/contest.rb
|
207
|
+
- lib/green_day/snippet_builder.rb
|
165
208
|
- lib/green_day/task.rb
|
166
209
|
- lib/green_day/test_builder.rb
|
167
210
|
- lib/green_day/version.rb
|