green_day 0.1.7 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 847d8c7165f8f49cde2bfa74baa93dbfe5c768f3d79b5e75f62f3c06c178c029
4
- data.tar.gz: 765aa083bcf03e74c5f3d4ce43713209bcc76bdcb857872c1d05d729ebfaa793
3
+ metadata.gz: 36a5e97dca37d3a8c3763cc0ac411b143c70a9bb9371b415a0e64828141613fb
4
+ data.tar.gz: 4c3101ee0d718b79907850334211d6f92671c2817322eb22862c74077eaa8a40
5
5
  SHA512:
6
- metadata.gz: 5e048781f120481b08b1c51a62744f5214cee0a0bd20902d528a2f0753330894682d24e29ff1ef63672ed5b3936011a611a30a6243d26b88b1c12cbf80ce588a
7
- data.tar.gz: e80f114af4d24f10ce607ba652097e2ed0f42dee1ba49c2baf90f3c789557397ac7ca4595058a5d7238580aeb0f5bc050eddd3457a2afd81ef4a765866db21e0
6
+ metadata.gz: ea1311da8032a5403d8fccb3e53acb74e5bd36b443d9e985b3d79a8a8dab47151151a5413b645c4ff8f98290011a970daece21f2329727b6f6511878ce75740b
7
+ data.tar.gz: 65683e77ffb9e1beb340a2131ab0bd60b92e35276cafd4740f6ce1df5ca165c77b4d1ab72dbaccaba9067ef17824d2fea47ef61b500d8ec2cd75a233252aea98
@@ -1,60 +1,34 @@
1
1
  name: Ruby
2
2
 
3
- on: [push]
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [ master ]
4
7
 
5
8
  jobs:
6
- build:
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.3.3
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
15
+ - 3.0.0
23
16
  steps:
24
17
  - uses: actions/checkout@v2
25
-
26
- - name: Set up rbenv
27
- uses: masa-iwasaki/setup-rbenv@1.1.0
28
-
29
- - name: Cache RBENV_ROOT
30
- uses: actions/cache@v1
31
- id: cache_rbenv
18
+ - name: Set up Ruby ${{ matrix.ruby }}
19
+ uses: ruby/setup-ruby@v1
32
20
  with:
33
- path: ~/.rbenv/versions
34
- key: v1-rbenv-${{ runner.os }}-${{ matrix.ruby }}
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
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - name: bundle install
23
+ run: bundle install
24
+ - name: Rubocop
25
+ run: bundle exec rubocop
26
+ - name: Rspec
53
27
  env:
54
28
  USER_NAME: ${{ secrets.USER_NAME }}
55
29
  PASSWORD: ${{ secrets.PASSWORD }}
56
- RBENV_VERSION: ${{ matrix.ruby }}
57
- run: |
58
- eval "$(rbenv init -)"
59
- bundle install --jobs 4 --retry 3
60
- bundle exec rake
30
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
31
+ run: script -e -c "rake spec"
32
+
33
+
34
+
data/.rubocop.yml CHANGED
@@ -1,4 +1,9 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+
1
5
  AllCops:
6
+ NewCops: enable
2
7
  Exclude:
3
8
  - 'spec/spec_helper.rb'
4
9
  Style/Documentation:
@@ -9,5 +14,11 @@ Layout/LineLength:
9
14
  Max: 90
10
15
  Metrics/BlockLength:
11
16
  Exclude:
12
- - 'spec/*'
13
-
17
+ - 'spec/*/**'
18
+ - 'green_day.gemspec'
19
+ RSpec/NamedSubject:
20
+ Enabled: false
21
+ RSpec/NestedGroups:
22
+ Max: 4
23
+ RSpec/ExampleLength:
24
+ Enabled: false
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # GreenDay
2
- Automatically create workspace and tests for Atcoder contests
2
+ Automatically create workspace and tests for Atcoder contest
3
3
  (日本語で解説した記事は[こちら](https://qiita.com/QWYNG/items/0e2e6b72bd1969d0d751))
4
4
  ## Installation
5
5
 
@@ -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 `cookie-store` in current directory)
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 `cookie-store`
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
@@ -5,6 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'green_day/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
+ spec.required_ruby_version = '>= 2.7.1'
8
9
  spec.name = 'green_day'
9
10
  spec.executables = ['green_day']
10
11
  spec.version = GreenDay::VERSION
@@ -25,13 +26,19 @@ Gem::Specification.new do |spec|
25
26
  spec.bindir = 'exe'
26
27
  spec.require_paths = ['lib']
27
28
 
29
+ spec.add_dependency 'colorize'
28
30
  spec.add_dependency 'faraday', '< 1.0'
29
31
  spec.add_dependency 'faraday-cookie_jar'
30
32
  spec.add_dependency 'nokogiri'
31
- spec.add_dependency 'rspec', '~> 3.0'
33
+ spec.add_dependency 'parallel'
32
34
  spec.add_dependency 'thor'
35
+ spec.add_dependency 'webrick'
33
36
  spec.add_development_dependency 'bundler', '~> 2.0'
37
+ spec.add_development_dependency 'codecov'
34
38
  spec.add_development_dependency 'dotenv'
35
39
  spec.add_development_dependency 'rake', '>= 12.3.3'
40
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
41
  spec.add_development_dependency 'rubocop'
42
+ spec.add_development_dependency 'rubocop-rake'
43
+ spec.add_development_dependency 'rubocop-rspec'
37
44
  end
@@ -8,7 +8,7 @@ require 'nokogiri'
8
8
  module GreenDay
9
9
  class AtcoderClient
10
10
  ATCODER_ENDPOINT = 'https://atcoder.jp'
11
- COOKIE_DB = 'cookie-store'
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(COOKIE_DB)
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
- jar.load(COOKIE_DB) if File.exist?(COOKIE_DB)
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,65 +1,65 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'thor'
4
+ require 'parallel'
5
+ require 'colorize'
6
+ require 'io/console'
4
7
  require_relative 'atcoder_client'
5
8
  require_relative 'contest'
6
9
  require_relative 'test_builder'
7
- require_relative 'snippet_builder'
8
10
 
9
11
  module GreenDay
10
12
  class Cli < Thor
11
13
  desc 'login Atcoder', 'login Atcoder and save session'
12
14
  def login
13
15
  print 'username:'
14
- username = STDIN.gets.chomp!
16
+ username = $stdin.gets(chomp: true)
15
17
  print 'password:'
16
- password = STDIN.gets.chomp!
18
+ password = $stdin.noecho { |stdin| stdin.gets(chomp: true) }.tap { puts }
17
19
 
18
20
  AtcoderClient.new.login(username, password)
21
+ puts(
22
+ "Successfully created #{AtcoderClient::COOKIE_FILE_NAME}"
23
+ .colorize(:green)
24
+ )
19
25
  end
20
26
 
21
27
  desc 'new [contest name]', 'create contest workspace and spec'
22
28
  def new(contest_name)
23
- contest = Contest.new(contest_name)
24
- FileUtils.makedirs("#{contest_name}/spec")
29
+ contest = Contest.new(contest_name, AtcoderClient.new)
30
+ FileUtils.makedirs("#{contest.name}/spec")
25
31
 
26
- contest.tasks.each do |task|
27
- task_code = task.code
28
-
29
- create_submit_file!(contest_name, task_code)
30
- create_spec_file!(contest_name, task_code, task.input_output_hash)
32
+ Parallel.each(contest.tasks) do |task|
33
+ create_submit_file(task)
34
+ create_spec_file(task)
31
35
  end
36
+
37
+ puts "Successfully created #{contest.name} directory".colorize(:green)
32
38
  end
33
39
 
34
40
  private
35
41
 
36
- def create_submit_file!(contest_name, task_code)
37
- File.open(submit_file_path(contest_name, task_code), 'w') do |f|
38
- f.write(SnippetBuilder.build)
39
- end
40
-
41
- true
42
+ def create_submit_file(task)
43
+ File.open(submit_file_path(task), 'w')
42
44
  end
43
45
 
44
- def create_spec_file!(contest_name, task_code, input_output_hash)
46
+ def create_spec_file(task)
45
47
  test =
46
48
  TestBuilder.build_test(
47
- submit_file_path(contest_name, task_code),
48
- input_output_hash
49
+ submit_file_path(task),
50
+ task.sample_answers
49
51
  )
50
- File.open(spec_file_path(contest_name, task_code), 'w') do |f|
52
+ File.open(spec_file_path(task), 'w') do |f|
51
53
  f.write(test)
52
54
  end
53
-
54
- true
55
55
  end
56
56
 
57
- def submit_file_path(contest_name, task_code)
58
- "#{contest_name}/#{task_code}.rb"
57
+ def submit_file_path(task)
58
+ "#{task.contest.name}/#{task.code}.rb"
59
59
  end
60
60
 
61
- def spec_file_path(contest_name, task_code)
62
- "#{contest_name}/spec/#{task_code}_spec.rb"
61
+ def spec_file_path(task)
62
+ "#{task.contest.name}/spec/#{task.code}_spec.rb"
63
63
  end
64
64
  end
65
65
  end
@@ -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).map do |task_code|
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
@@ -2,27 +2,21 @@
2
2
 
3
3
  module GreenDay
4
4
  class Task
5
- attr_reader :contest, :code, :input_output_hash
6
- def initialize(contest, code)
5
+ attr_reader :contest, :code, :sample_answers
6
+
7
+ def initialize(contest, code, client)
7
8
  @contest = contest
8
9
  @code = code
9
- @input_output_hash = create_input_output_hash
10
+ @sample_answers = create_sample_answers(client)
10
11
  end
11
12
 
12
13
  private
13
14
 
14
- def create_input_output_hash
15
- client = AtcoderClient.new
16
-
15
+ def create_sample_answers(client)
17
16
  input_samples, output_samples =
18
17
  client.fetch_inputs_and_outputs(contest, self)
19
18
 
20
- hash = {}
21
- input_samples.zip(output_samples).each do |input, output|
22
- hash[input] = output
23
- end
24
-
25
- hash
19
+ input_samples.zip(output_samples).to_h
26
20
  end
27
21
  end
28
22
  end
@@ -6,8 +6,6 @@ module GreenDay
6
6
 
7
7
  def build_test(submit_file_path, input_output_hash)
8
8
  <<~SPEC
9
- require 'rspec'
10
-
11
9
  RSpec.describe 'test' do
12
10
  #{input_output_hash.map { |input, output| build_example(submit_file_path, input, output) }.join("\n")}
13
11
  end
@@ -26,6 +24,8 @@ module GreenDay
26
24
  end
27
25
 
28
26
  def unify_cr_lf(string)
27
+ return unless string # たまに画像で例を出してくるとsampleの文字がなくなる
28
+
29
29
  string.gsub(/\R/, "\n").dump
30
30
  end
31
31
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GreenDay
4
- VERSION = '0.1.7'
4
+ VERSION = '0.3.1'
5
5
  end
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.1.7
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - qwyng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-01 00:00:00.000000000 Z
11
+ date: 2021-04-10 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
@@ -53,19 +67,19 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: rspec
70
+ name: parallel
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - "~>"
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
- version: '3.0'
75
+ version: '0'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - "~>"
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
- version: '3.0'
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: thor
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webrick
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: bundler
85
113
  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
@@ -122,6 +164,20 @@ dependencies:
122
164
  - - ">="
123
165
  - !ruby/object:Gem::Version
124
166
  version: 12.3.3
167
+ - !ruby/object:Gem::Dependency
168
+ name: rspec
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '3.0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '3.0'
125
181
  - !ruby/object:Gem::Dependency
126
182
  name: rubocop
127
183
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +192,34 @@ dependencies:
136
192
  - - ">="
137
193
  - !ruby/object:Gem::Version
138
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-rake
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop-rspec
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
139
223
  description: CLI tool for AtCoder and Ruby
140
224
  email:
141
225
  - ikusawasi@gmail.com
@@ -162,7 +246,6 @@ files:
162
246
  - lib/green_day/atcoder_client.rb
163
247
  - lib/green_day/cli.rb
164
248
  - lib/green_day/contest.rb
165
- - lib/green_day/snippet_builder.rb
166
249
  - lib/green_day/task.rb
167
250
  - lib/green_day/test_builder.rb
168
251
  - lib/green_day/version.rb
@@ -180,14 +263,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
263
  requirements:
181
264
  - - ">="
182
265
  - !ruby/object:Gem::Version
183
- version: '0'
266
+ version: 2.7.1
184
267
  required_rubygems_version: !ruby/object:Gem::Requirement
185
268
  requirements:
186
269
  - - ">="
187
270
  - !ruby/object:Gem::Version
188
271
  version: '0'
189
272
  requirements: []
190
- rubygems_version: 3.1.2
273
+ rubygems_version: 3.2.3
191
274
  signing_key:
192
275
  specification_version: 4
193
276
  summary: CLI tool for AtCoder and Ruby
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SnippetBuilder
4
- INCREASE_STACK_SIZE_SNIPPET =
5
- "ENV[Z = 'RUBY_THREAD_VM_STACK_SIZE'] || exec( { Z => '50000000' },'ruby',$0)"
6
- MULTIPLE_LINE_INPUT_SNIPPET = 'readlines.map(&:chomp!).map { |e| e.split.map(&:to_i) }'
7
- ARRAY_INPUT_SNIPPET = 'gets.split.map(&:to_i)'
8
-
9
- module_function
10
-
11
- def build
12
- [INCREASE_STACK_SIZE_SNIPPET, MULTIPLE_LINE_INPUT_SNIPPET, ARRAY_INPUT_SNIPPET]
13
- .map { |snippet| '# ' + snippet }
14
- .join("\n") + "\n"
15
- end
16
- end