my_manga 1.1.6 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e8c579b52a739f5a0468d82ab037729cd63c45ef
4
- data.tar.gz: 3650970a5fff6c2e24e8cc2549be74f8ef4482fd
2
+ SHA256:
3
+ metadata.gz: b196ef7ec4b300ded6dc4a9270fa49d49ff3cfd43dea8f8d233e89132cdd03ad
4
+ data.tar.gz: 9c6f245d09d9b6c0363f27b6f57c295e16f4f7c17bfb799c1eedb7e596528d5b
5
5
  SHA512:
6
- metadata.gz: 7a87ba326ae963a5489b0708bce458b183fafcd75cba61fbbfe6cb53cc285131c23014d072ca3b30b2f078a703421645de061d67236ef91973033bc78ef40dcc
7
- data.tar.gz: 94a60cd4dfd2a629edc8aea1d727ae39057fa3d5f61ad34e5d39bc6c0fa48a559a68151bbbfd0d9e399117d0b83d19f9dc571f3cf873e2dd844406b8f31f6fc6
6
+ metadata.gz: 600db7c50191c5605d4a92a55fb54886a9fe43cbaae4c94e618d85fc4ba4381c5476cc72cd83f7644be0189064f5797c69b6cb75e442751016306ec98f853b74
7
+ data.tar.gz: 848b9553b785229c3043ae64293710d9dee26af9b629c00c25b6585b8eeb1c2891158137d235fba5db13d7a1b0877711ee1affd13051b037c189e83349e29693
@@ -7,13 +7,13 @@ default: &default
7
7
  host: <%= ENV["PG_HOST"] %>
8
8
  reconnect: false
9
9
  # Set these in .bashrc or .bash_profile
10
- username: <%= ENV["PG_USER"] %>
10
+ username: <%= ENV["PG_USER"] %>
11
11
  password: <%= ENV["PG_PASS"] %>
12
12
 
13
13
  production:
14
14
  <<: *default
15
- database: my_manga_library_database
15
+ database: my_manga
16
16
 
17
17
  test:
18
18
  <<: *default
19
- database: my_manga_library_test_database
19
+ database: my_manga_test
@@ -1,14 +1,16 @@
1
1
  module MyManga
2
- class DB
2
+ module DB
3
3
  MIGRATION_PATH = File.expand_path('../migrate', __FILE__)
4
4
  CONFIG_PATH = File.expand_path('../config.yml', __FILE__)
5
5
  CONFIG = YAML.load(ERB.new(File.read(CONFIG_PATH)).result)[MyManga.env]
6
6
 
7
- def self.establish_connection
7
+ module_function
8
+
9
+ def establish_connection
8
10
  ActiveRecord::Base.establish_connection(CONFIG)
9
- end
11
+ end
10
12
 
11
- def self.establish_base_connection
13
+ def establish_base_connection
12
14
  ActiveRecord::Base.establish_connection(
13
15
  CONFIG.merge(
14
16
  {
@@ -19,26 +21,28 @@ module MyManga
19
21
  )
20
22
  end
21
23
 
22
- def self.connection
24
+ def connection
23
25
  ActiveRecord::Base.connection
24
26
  end
25
27
 
26
- def self.create_database
28
+ def create_database
27
29
  connection.create_database(CONFIG["database"], CONFIG)
28
30
  end
29
31
 
30
- def self.drop_database
32
+ def drop_database
31
33
  connection.drop_database(CONFIG["database"])
32
34
  end
33
35
 
34
- def self.migrate
35
- ActiveRecord::Migrator.migrate(MIGRATION_PATH, nil)
36
+ def migrate
37
+ ActiveRecord::MigrationContext.new(MIGRATION_PATH).migrate
38
+ end
39
+
40
+ def restore
41
+ system("pg_restore --verbose --clean --no-acl --no-owner -d #{CONFIG["database"]} #{File.expand_path(__dir__)}/latest.dump")
36
42
  end
37
43
 
38
- def self.dump
44
+ def dump
39
45
  system("pg_dump -Fc #{CONFIG["database"]} > #{File.expand_path(__dir__)}/latest.dump")
40
46
  end
41
47
  end
42
48
  end
43
-
44
-
@@ -0,0 +1,3 @@
1
+ class AddZineToManga < ActiveRecord::Migration[5.2]
2
+ add_column :manga, :zine, :boolean, null: false, default: false
3
+ end
@@ -30,6 +30,18 @@ module MyManga
30
30
  Manga.pluck(:name)
31
31
  end
32
32
 
33
+ def add_to_zine(names)
34
+ Manga.where(name: names).update(zine: true)
35
+ end
36
+
37
+ def remove_from_zine(names)
38
+ Manga.where(name: names).update(zine: false)
39
+ end
40
+
41
+ def zine
42
+ Manga.where(zine: true)
43
+ end
44
+
33
45
  def add(uri)
34
46
  return if Manga.find_by_uri(uri)
35
47
 
@@ -11,6 +11,7 @@ require_relative './update'
11
11
  require_relative './mark'
12
12
  require_relative './env'
13
13
  require_relative './m_clean_up'
14
+ require_relative './zine'
14
15
 
15
16
  module MyManga
16
17
  module CLI
@@ -37,6 +38,7 @@ module MyManga
37
38
  register 'mark', Mark
38
39
  register 'env', Env, aliases: %w[-e --environment]
39
40
  register 'm:clean_up', MCleanUp, aliases: %w[purge]
41
+ register 'zine', Zine
40
42
  end
41
43
  end
42
44
  end
@@ -13,46 +13,54 @@ module MyManga
13
13
  names.one? ? list_detail(names.first) : list(names)
14
14
  end
15
15
 
16
+ private
17
+
16
18
  def list(names)
17
19
  column_width = names.map(&:length).max || 10
18
20
 
19
21
  puts 'Manga list'
20
22
  puts '=========='
21
23
  print pad('Name', column_width)
22
- puts 'Chapters read/total (unread)'
24
+ puts 'Zine Chapters read/total (unread)'
23
25
 
24
26
  names.sort.each do |name|
25
27
  manga = MyManga[name]
26
28
  read = manga.read_count
27
29
  total = manga.total_count
28
30
  unread = total - read
31
+ zine = check_box(manga.zine?)
29
32
 
30
33
  print pad(name, column_width)
31
- puts "#{read}/#{total} (#{unread}) #{manga.uri}"
34
+ puts "#{zine} #{read}/#{total} (#{unread}) #{manga.uri}"
32
35
  end
33
36
  end
34
37
 
35
38
  def list_detail(name)
36
39
  manga = MyManga[name]
37
40
  header = %(Manga details for "#{manga.name}")
38
- chapters = manga.chapters_read
41
+ chapters = manga.chapters.reorder(number: :desc)
39
42
  read = manga.read_count
40
43
  total = manga.total_count
41
44
  unread = total - read
45
+ zine = check_box(manga.zine?)
42
46
 
43
47
  puts header
44
48
  puts '=' * header.length
45
49
  print pad('Name', name.length)
46
- puts 'Chapters read/total (unread)'
47
- puts "#{name} #{read}/#{total} (#{unread}) #{manga.uri}"
50
+ puts 'Zine Chapters read/total (unread)'
51
+ puts "#{name} #{zine} #{read}/#{total} (#{unread}) #{manga.uri}"
48
52
  puts
49
- puts 'Chapters Read'
50
- puts '-------------'
51
- chapters[0..2].each do |chapter|
52
- puts chapter.name
53
+
54
+
55
+ puts 'Read Chapter'
56
+ puts '------------'
57
+ chapters.each do |chapter|
58
+ puts "#{chapter.read? ? ' [X]' : ' [ ]'} #{chapter.name}"
53
59
  end
54
- puts '...' if chapters.length > 4
55
- puts chapters[-1].name if chapters.length > 3
60
+ end
61
+
62
+ def check_box(bool)
63
+ bool ? ' [X]' : ' [ ]'
56
64
  end
57
65
  end
58
66
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MyManga
4
- VERSION = '1.1.6'
4
+ VERSION = '2.0.0'
5
5
  end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+
5
+ module MyManga
6
+ module CLI
7
+ module Commands
8
+ # See desc
9
+ class Zine < MyManga::CLI::Command
10
+ desc 'Build a new zine'
11
+ argument :names, desc: 'Manga names (comma separated)'
12
+
13
+ option :add,
14
+ type: :boolean,
15
+ default: false,
16
+ desc: 'Add manga to zine'
17
+ option :remove,
18
+ type: :boolean,
19
+ default: false,
20
+ desc: 'Remove manga from zine'
21
+ option :size,
22
+ default: '10',
23
+ desc: 'Number of chapters to include in the zine'
24
+ option :filename,
25
+ desc: 'Filename for the zine, (default `zine-<timestamp>-<hash of chapters included>`)'
26
+
27
+ TMP_DIR = File.expand_path('../../tmp', __dir__)
28
+
29
+ def call(names: nil, **options)
30
+ names = manga_names(names)
31
+ filename = options.fetch(:filename) { nil }
32
+ size = options.fetch(:size).to_i
33
+
34
+ if options[:add] && options[:remove]
35
+ puts "--add and --remove are mutually exclusive"
36
+ exit 1
37
+ end
38
+
39
+ if options[:add]
40
+ MyManga.add_to_zine(names)
41
+ puts %("#{names.join(', ')}" added to the zine!)
42
+ elsif options[:remove]
43
+ MyManga.remove_from_zine(names)
44
+ puts %("#{names.join(', ')}" removed from the zine!)
45
+ else
46
+ publish(filename, size)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def publish(filename, size)
53
+ FileUtils.rm_r(TMP_DIR) if Dir.exist?(TMP_DIR)
54
+ Dir.mkdir(TMP_DIR)
55
+
56
+ zine = zine_content(size)
57
+ serialized_name = []
58
+ zine.each do |chapter|
59
+ serialized_name << chapter.id
60
+ chapter.to_md.download_to(TMP_DIR)
61
+ MyManga.read!(chapter.manga, [chapter.number])
62
+ end
63
+
64
+ serialized_name = serialized_name.join.to_i.to_s(32)
65
+ filename ||= "zine-#{Time.now.to_i}-#{serialized_name}"
66
+
67
+ dir = File.join(MyManga.download_dir, filename)
68
+
69
+ cbz(dir)
70
+
71
+ FileUtils.rm_r(TMP_DIR)
72
+
73
+ puts "Pushlished a new zine (#{filename}) in #{MyManga.download_dir}"
74
+ end
75
+
76
+ def zine_content(chapter_count)
77
+ manga = MyManga.zine
78
+ chapters = Chapter
79
+ .unread
80
+ .where(manga_id: manga.map(&:id))
81
+ .order(:number)
82
+ .group_by(&:manga)
83
+ .values
84
+ .sort_by(&:length)
85
+ .reverse
86
+
87
+ return if chapters.empty?
88
+
89
+ zine = chapters.first.zip(*chapters.drop(1)).flatten.compact
90
+ zine.first(chapter_count).sort_by do |chapter|
91
+ [chapter.manga_id, chapter.number]
92
+ end
93
+ end
94
+
95
+ def cbz(dir)
96
+ pages = Dir["#{TMP_DIR}/**/*.*"]
97
+
98
+ Dir.mkdir(dir) unless Dir.exist?(dir)
99
+
100
+ pages.each do |page|
101
+ filename = File.basename(page)
102
+ FileUtils.cp(page, File.join(dir, filename))
103
+ end
104
+
105
+ Mangdown::CBZ.one(dir, false)
106
+
107
+ FileUtils.rm_r(dir)
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -13,19 +13,19 @@ class FeaturesTest < Minitest::Test
13
13
  name: 'Assassination Classroom',
14
14
  read_count: 0,
15
15
  total_count: 161,
16
- uri: 'http://www.mangareader.net/assassination-classroom'
16
+ uri: 'https://www.mangareader.net/assassination-classroom'
17
17
  },
18
18
  {
19
19
  name: 'Naruto',
20
20
  read_count: 699,
21
21
  total_count: 700,
22
- uri: 'http://www.mangareader.net/naruto'
22
+ uri: 'https://www.mangareader.net/naruto'
23
23
  },
24
24
  {
25
25
  name: 'Naruto Movie',
26
26
  read_count: 10,
27
27
  total_count: 10,
28
- uri: 'http://www.mangareader.net/naruto-movie'
28
+ uri: 'https://www.mangareader.net/naruto-movie'
29
29
  }
30
30
  ]
31
31
  )
@@ -63,7 +63,7 @@ class FeaturesTest < Minitest::Test
63
63
  )
64
64
  output = stdout.read
65
65
  header = 'Manga found for "assassination classroom"'
66
- url = 'http://www.mangareader.net/assassination-classroom'
66
+ url = 'https://www.mangareader.net/assassination-classroom'
67
67
 
68
68
  assert_equal 0, wait_thr.value
69
69
  assert_includes output, header
@@ -72,7 +72,7 @@ class FeaturesTest < Minitest::Test
72
72
 
73
73
  def test_add
74
74
  _, stdout, _, wait_thr = Open3.popen3(
75
- 'my_manga', 'add', 'http://www.mangareader.net/nisekoi'
75
+ 'my_manga', 'add', 'https://www.mangareader.net/nisekoi'
76
76
  )
77
77
  output = stdout.each_line.to_a
78
78
  expected = <<~EXP
@@ -106,10 +106,10 @@ class FeaturesTest < Minitest::Test
106
106
  expected = <<~EXP
107
107
  Manga list
108
108
  ==========
109
- Name Chapters read/total (unread)
110
- Assassination Classroom 0/161 (161) http://www.mangareader.net/assassination-classroom
111
- Naruto 699/700 (1) http://www.mangareader.net/naruto
112
- Naruto Movie 10/10 (0) http://www.mangareader.net/naruto-movie
109
+ Name Zine Chapters read/total (unread)
110
+ Assassination Classroom [ ] 0/161 (161) https://www.mangareader.net/assassination-classroom
111
+ Naruto [ ] 699/700 (1) https://www.mangareader.net/naruto
112
+ Naruto Movie [ ] 10/10 (0) https://www.mangareader.net/naruto-movie
113
113
  EXP
114
114
  expected = expected.split("\n").map { |line| line << "\n" }
115
115
 
@@ -123,16 +123,21 @@ class FeaturesTest < Minitest::Test
123
123
  expected = <<~EXP
124
124
  Manga details for "Naruto Movie"
125
125
  ================================
126
- Name Chapters read/total (unread)
127
- Naruto Movie 10/10 (0) http://www.mangareader.net/naruto-movie
128
-
129
- Chapters Read
130
- -------------
131
- Naruto Movie 1
132
- Naruto Movie 2
133
- Naruto Movie 3
134
- ...
135
- Naruto Movie 10
126
+ Name Zine Chapters read/total (unread)
127
+ Naruto Movie [ ] 10/10 (0) https://www.mangareader.net/naruto-movie
128
+
129
+ Read Chapter
130
+ ------------
131
+ [X] Naruto Movie 1
132
+ [X] Naruto Movie 2
133
+ [X] Naruto Movie 3
134
+ [X] Naruto Movie 4
135
+ [X] Naruto Movie 5
136
+ [X] Naruto Movie 6
137
+ [X] Naruto Movie 7
138
+ [X] Naruto Movie 8
139
+ [X] Naruto Movie 9
140
+ [X] Naruto Movie 10
136
141
  EXP
137
142
  expected = expected.split("\n").map { |line| line << "\n" }
138
143
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: my_manga
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jphager2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-21 00:00:00.000000000 Z
11
+ date: 2018-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
19
+ version: '5.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.0'
26
+ version: '5.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: hanami-cli
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.17.5
47
+ version: 0.19.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.17.5
54
+ version: 0.19.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pg
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.21'
61
+ version: '1.1'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.21'
68
+ version: '1.1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,7 @@ files:
108
108
  - db/connection.rb
109
109
  - db/environment.rb
110
110
  - db/migrate/001_add_tables.rb
111
+ - db/migrate/002_add_zine_to_manga.rb
111
112
  - lib/mangdown/adapters/manga_here.rb
112
113
  - lib/my_manga.rb
113
114
  - lib/my_manga/add.rb
@@ -122,6 +123,7 @@ files:
122
123
  - lib/my_manga/remove.rb
123
124
  - lib/my_manga/update.rb
124
125
  - lib/my_manga/version.rb
126
+ - lib/my_manga/zine.rb
125
127
  - models/chapter.rb
126
128
  - models/manga.rb
127
129
  - test/adapters_test.rb
@@ -147,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
149
  version: '0'
148
150
  requirements: []
149
151
  rubyforge_project:
150
- rubygems_version: 2.6.12
152
+ rubygems_version: 2.7.7
151
153
  signing_key:
152
154
  specification_version: 4
153
155
  summary: Manage Manga Downloads