webget-mirror 0.0.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.
@@ -0,0 +1,204 @@
1
+
2
+ class Webget
3
+ class Mirror
4
+
5
+
6
+ class Website
7
+ def host
8
+ raise ArgumentError, "website.base_url not set" if @base_url.nil?
9
+ @base_url.host
10
+ end
11
+
12
+ def base_url=( url )
13
+ @base_url = URI( url ) ## note URI() same as URI.parse()
14
+ end
15
+ def base_url
16
+ raise ArgumentError, "website.base_url not set" if @base_url.nil?
17
+ @base_url.to_s ## note - returns string NOT uri object!!!
18
+ end
19
+
20
+
21
+
22
+ ## array of hash (table) records e.g.
23
+ ## page, encoding
24
+ ## /index.html, windows-1252
25
+ def start_pages=( config )
26
+ @start_pages = config
27
+ end
28
+ def start_pages
29
+ raise ArgumentError, "website.start_pages not set" if @start_pages.nil?
30
+ @start_pages
31
+ end
32
+
33
+
34
+ def start_pages_path
35
+ ## collect/build path for all start pages
36
+ ## e.g. path: ['/curdom.html',
37
+ ## '/curtour.html',
38
+ ## '/histdom.html',
39
+ ## '/intclub.html',
40
+ ## '/intland.html']
41
+ path = []
42
+ start_pages.each do |config|
43
+ path << config['page']
44
+ end
45
+ path
46
+ end
47
+ alias_method :start_path, :start_pages_path
48
+
49
+
50
+ ###
51
+ ## give preference on schedule next page batch
52
+ ## if path matches sql like term/str
53
+ ## e.g. '/table%'
54
+ ## => Page.where( 'path LIKE ?', '/table%' )
55
+ ##
56
+ ## note - sql (like) wildcard rules/syntax:
57
+ ## %: Matches zero or more characters
58
+ ## _: Matches exactly one character
59
+
60
+
61
+ def boost_pages_path_like=(str) @boost = str; end
62
+ def boost_pages_path_like?() defined?( @boost ); end
63
+ def boost_pages_path_like() defined?( @boost ) ? @boost : nil; end
64
+
65
+ alias_method :boost_path_like=, :boost_pages_path_like=
66
+ alias_method :boost_path_like?, :boost_pages_path_like?
67
+ alias_method :boost_path_like, :boost_pages_path_like
68
+
69
+
70
+
71
+
72
+
73
+ def default_page_encoding=( encoding )
74
+ @default_page_encoding = encoding
75
+ end
76
+ def _default_page_encoding
77
+ defined?( @default_page_encoding ) ? @default_page_encoding : 'UTF-8'
78
+ end
79
+
80
+ ##
81
+ ## use hash with custom (individual) defaults e.g.
82
+ ## Hash.new { |h,key| h[key] = 'windows-1252' }
83
+ ##
84
+ def page_encodings=( encodings ) ## hash (path => encoding)
85
+ @page_encodings = encodings
86
+ end
87
+
88
+ ## default page encoding (lookup by path);
89
+ ## change to windows-1256 if needed
90
+ def page_encoding( path )
91
+ if defined?( @page_encodings )
92
+ @page_encodings[ path ]
93
+ else
94
+ _default_page_encoding
95
+ end
96
+ end
97
+
98
+
99
+
100
+ def errata_edits=(edits) @errata_edits = edits; end
101
+
102
+ ### quick fix html w/ search & replace
103
+ ## default: do nothing
104
+ def errata?() defined?( @errata_edits ); end
105
+ def errata( html, url: )
106
+ if defined?( @errata_edits )
107
+
108
+ ## lookup edits by path e.g. /tablesp/poland-satrip77.html
109
+ ## or /miscellaneous/torre-madrid.html
110
+
111
+ page_url = URI( url )
112
+
113
+ edits = @errata_edits[page_url.path]
114
+
115
+ ## note - for now always use gsub (not sub)
116
+ ## maybe add option later
117
+ if edits
118
+ edits.each do |search,replace|
119
+ html = html.gsub( search, replace )
120
+ end
121
+ end
122
+ html
123
+ else ## pass along as is (1:1)
124
+ html
125
+ end
126
+ end
127
+
128
+
129
+ def autofix_href=( m )
130
+ raise ArgumentError,
131
+ "proc expected for autofix_href=; got #{m} #{m.class.name}" unless m.is_a?( Proc )
132
+
133
+ @autofix_href = m
134
+ end
135
+ def autofix_href() defined?( @autofix_href ) ? @autofix_href : nil; end
136
+
137
+
138
+
139
+ ### kick-off mirror (pages) operation/run
140
+ def mirror
141
+
142
+
143
+ ## add seed/start pages
144
+ start_pages.each do |config|
145
+ path = config['page']
146
+ encoding = config['encoding']
147
+ encoding = page_encoding( path ) if config['encoding'].nil? || config['encoding'].empty?
148
+
149
+ page_rec = MirrorDb::Model::Page.find_or_create_by!( path: path ) do |rec|
150
+ ## note - block only called on create (NOT find!!)
151
+ puts " add page #{rec.path} (cached: false) to mirror.db"
152
+
153
+ rec.encoding = encoding
154
+ rec.cached = false
155
+ end
156
+ pp page_rec
157
+
158
+
159
+
160
+ ## fix-fix-fix use Mirror.new( self )
161
+ ## pass in site config on new!!!
162
+ mirror = Mirror.new
163
+ mirror._mirror_pages( site: self )
164
+ end
165
+ end
166
+ end # class Website
167
+ end ## class Mirror
168
+ end ## class Webget
169
+
170
+
171
+
172
+
173
+ __END__
174
+
175
+
176
+ =begin
177
+ module Mirror
178
+ class Configuration
179
+ def host() @base_url.host; end
180
+
181
+ def base_url
182
+ raise ArgumentError, "config.base_url not set" if @base_url.nil?
183
+ @base_url
184
+ end
185
+ def base_url=( url )
186
+ @base_url = URI( url ) ## note URI() same as URI.parse()
187
+ end
188
+ end # class Configuration
189
+
190
+
191
+ ## lets you use
192
+ ## Webcache.configure do |config|
193
+ ## config.root = './cache'
194
+ ## end
195
+ def self.configure() yield( config ); end
196
+ def self.config() @config ||= Configuration.new; end
197
+
198
+
199
+ ## add "high level" root convenience helpers
200
+ ## use delegate helper - why? why not?
201
+ ## def self.host() config.host; end
202
+ ## def self.host=(value) config.host = value; end
203
+ end # module Mirror
204
+ =end
@@ -0,0 +1,55 @@
1
+ $LOAD_PATH.unshift( '/sports/rubycocos/webclient/webclient/lib' )
2
+ $LOAD_PATH.unshift( '/sports/rubycocos/webclient/webget/lib' )
3
+
4
+
5
+ require 'cocos'
6
+ require 'webget' ## incl. webget, webcache, webclient, etc.
7
+ require 'nokogiri'
8
+
9
+ require 'active_record' ## todo: add sqlite3? etc.
10
+
11
+
12
+ ### our own
13
+ require_relative 'mirror/version' ## version first
14
+
15
+ require_relative 'mirror/database/schema'
16
+ require_relative 'mirror/database/models'
17
+ require_relative 'mirror/database/open'
18
+
19
+
20
+
21
+
22
+ require_relative 'mirror/download_page'
23
+ require_relative 'mirror/find_links' ## find_links helper 'n' more
24
+ require_relative 'mirror/collect_page_info'
25
+
26
+
27
+ require_relative 'mirror/mirror'
28
+
29
+
30
+ require_relative 'mirror/utils'
31
+ require_relative 'mirror/website'
32
+
33
+
34
+
35
+ class Webget
36
+ class Mirror
37
+
38
+ ## auto log errors (append to logs.txt)
39
+ def log( msg )
40
+ ## append msg to ./logs.txt
41
+ ## use ./errors.txt - why? why not?
42
+ File.open( './mirror_logs.txt', 'a:utf-8' ) do |f|
43
+ f.write( msg )
44
+ f.write( "\n" )
45
+ end
46
+ end
47
+
48
+ end ## class Mirror
49
+ end ## class Webget
50
+
51
+
52
+
53
+
54
+
55
+ puts Webget::Mirror.banner ## say hello
@@ -0,0 +1,2 @@
1
+ ## alternative single-file for "webget/mirror"
2
+ require_relative 'webget/mirror'
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webget-mirror
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: webget
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
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: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
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: rdoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '4.0'
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '7'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '4.0'
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '7'
89
+ - !ruby/object:Gem::Dependency
90
+ name: hoe
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '4.2'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '4.2'
103
+ description: webget-mirror gem - addon to webget to mirror websites
104
+ email: gerald.bauer@gmail.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files:
108
+ - CHANGELOG.md
109
+ - Manifest.txt
110
+ - README.md
111
+ files:
112
+ - CHANGELOG.md
113
+ - Manifest.txt
114
+ - README.md
115
+ - Rakefile
116
+ - lib/webget-mirror.rb
117
+ - lib/webget/mirror.rb
118
+ - lib/webget/mirror/collect_page_info.rb
119
+ - lib/webget/mirror/database/models.rb
120
+ - lib/webget/mirror/database/open.rb
121
+ - lib/webget/mirror/database/schema.rb
122
+ - lib/webget/mirror/download_page.rb
123
+ - lib/webget/mirror/find_links.rb
124
+ - lib/webget/mirror/mirror.rb
125
+ - lib/webget/mirror/utils.rb
126
+ - lib/webget/mirror/version.rb
127
+ - lib/webget/mirror/website.rb
128
+ homepage: https://github.com/rubycocos/webclient
129
+ licenses:
130
+ - Public Domain
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options:
134
+ - "--main"
135
+ - README.md
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 3.1.0
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubygems_version: 3.5.22
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: webget-mirror gem - addon to webget to mirror websites
153
+ test_files: []