factorio-mod 0.4.0 → 0.5.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
2
  SHA256:
3
- metadata.gz: 8cc46a6267996d8e4e5891e39918998a66ad25b738d85d44814426685662ea89
4
- data.tar.gz: 83c21b87bdcd20990724ed98814c9bbde13280fba66a2d6d815dd5113bb10558
3
+ metadata.gz: f87061c490f02e803b9625ad9ee1430d95ade44ea3ec2aad5f7c4dfe467d964b
4
+ data.tar.gz: baf201035dfccf9c0afdd009c86cadc6699fe24c67cfdde6b937909c6982b666
5
5
  SHA512:
6
- metadata.gz: 77486d9176c9398349bd7befbfab82ae12d02c3f77e7cdafa42933d4898be00f8b1596c4433e010149ab661de3ea63fbc5628352c7524b7cf7a199d0dd4acbe7
7
- data.tar.gz: 5b1902aa35d4dd2a704e0ee50aeb0bab8c9c741aabf30a584c85e1d34cbe5cbc324b9152b1b0a2d66e97ab22fa168e618066d9e035b2d254464e63115f583314
6
+ metadata.gz: 1f0dbbc1048d6544a6fd1354d13e2b609a58451a7b3a8a28bb33944bc8eb7719d0f3cab94591c8785370be804d87fb71eec446780c8fa0e4bf873e6fdfb6ea41
7
+ data.tar.gz: 199ce9af9186305636a6e7bcd8b46d92a3835c992bbb27ecc3f3dc9dc928151a0125b7295b36dac98bd0c4c477010dd942de10ceb093974645d07bcc3740b2f6
@@ -0,0 +1,2 @@
1
+ AllCops:
2
+ TargetRubyVersion: '2.4.0'
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
@@ -1,20 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- factorio-mod (0.4.0)
4
+ factorio-mod (0.5.0)
5
+ activesupport (~> 5.2)
5
6
  nokogiri (~> 1.8)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ activesupport (5.2.1)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
10
16
  ast (2.4.0)
11
17
  bump (0.6.1)
12
18
  coco (0.15.0)
13
19
  coderay (1.1.2)
20
+ concurrent-ruby (1.1.3)
14
21
  diff-lcs (1.3)
22
+ i18n (1.1.1)
23
+ concurrent-ruby (~> 1.0)
15
24
  jaro_winkler (1.5.1)
16
25
  method_source (0.9.0)
17
26
  mini_portile2 (2.3.0)
27
+ minitest (5.11.3)
18
28
  nokogiri (1.8.5)
19
29
  mini_portile2 (~> 2.3.0)
20
30
  parallel (1.12.1)
@@ -48,6 +58,9 @@ GEM
48
58
  ruby-progressbar (~> 1.7)
49
59
  unicode-display_width (~> 1.0, >= 1.0.1)
50
60
  ruby-progressbar (1.10.0)
61
+ thread_safe (0.3.6)
62
+ tzinfo (1.2.5)
63
+ thread_safe (~> 0.1)
51
64
  unicode-display_width (1.4.0)
52
65
 
53
66
  PLATFORMS
@@ -64,4 +77,4 @@ DEPENDENCIES
64
77
  rubocop
65
78
 
66
79
  BUNDLED WITH
67
- 1.16.6
80
+ 1.17.1
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'bump/tasks'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'factorio/mod'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'factorio/mod/version'
@@ -30,5 +32,6 @@ Gem::Specification.new do |spec|
30
32
  spec.add_development_dependency 'pry'
31
33
  spec.add_development_dependency 'rubocop'
32
34
 
35
+ spec.add_dependency 'activesupport', '~> 5.2'
33
36
  spec.add_dependency 'nokogiri', '~> 1.8'
34
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/setup'
2
4
 
3
5
  require 'factorio/mod/version'
@@ -11,3 +13,7 @@ require 'open-uri'
11
13
  require 'net/http'
12
14
  require 'nokogiri'
13
15
  require 'erb' # for uri encode
16
+
17
+ require 'active_support'
18
+ require 'active_support/core_ext/object/blank.rb'
19
+ require 'active_support/core_ext/array/access.rb'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Factorio
2
4
  # Cache mod info
3
5
  class Cache
@@ -27,12 +29,12 @@ module Factorio
27
29
  # @param better [Symbol] get which page if none of the pages exist.
28
30
  # @return [Nokogiri::HTML]
29
31
  def any(better = :information)
30
- if @cache.key? :information
31
- information
32
- elsif @cache.key? :downloads
33
- downloads
32
+ if @cache.key? better
33
+ @cache[better]
34
+ elsif @cache.any?
35
+ @cache.first.second
34
36
  else
35
- send better
37
+ public_method(better).call
36
38
  end
37
39
  end
38
40
 
@@ -42,6 +44,7 @@ module Factorio
42
44
  def get(symbol, uri)
43
45
  symbol = symbol.to_sym
44
46
  return @cache[symbol] if @cache.key? symbol
47
+
45
48
  @cache[symbol] = Nokogiri::HTML(URI.open(uri, 'Cookie' => @cookie))
46
49
  rescue OpenURI::HTTPError => e
47
50
  raise NoMODError.new @name, e.io
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Factorio
2
4
  class Mod
3
5
  # store the entry of the _download_
4
6
  Download = Struct.new(:version, :game_version, :uri, :date, :times) do
5
7
  # `Download` page table header to attribute symbol
6
8
  TABLE_HEADER_TO_SYM = {
7
- 'Version' => :version,
9
+ 'Version' => :version,
8
10
  'Game Version' => :game_version,
9
- 'Download' => :uri,
11
+ 'Download' => :uri,
10
12
  'Release Date' => :date,
11
- 'Downloads' => :times
13
+ 'Downloads' => :times
12
14
  }.freeze
13
15
 
14
16
  HANDLE_VALUE = {
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Factorio
2
4
  # The Exception that can't find MOD
3
5
  class NoMODError < StandardError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Factorio
2
4
  # Info interface
3
5
  #
@@ -11,9 +13,9 @@ module Factorio
11
13
  # puts "It latest version for factorio 0.16 can download at " \
12
14
  # "#{mod.latest_download('0.16')[:uri]}"
13
15
  # ```
14
- class Mod
16
+ class Mod # rubocop:disable ClassLength
15
17
  # factorio Mod portal website URI
16
- MOD_URI = 'https://mods.factorio.com'.freeze
18
+ MOD_URI = 'https://mods.factorio.com'
17
19
 
18
20
  attr_reader :name
19
21
  alias id name
@@ -29,9 +31,10 @@ module Factorio
29
31
  private
30
32
 
31
33
  # Get the meta table from Information page.
32
- def data_table(key = '')
34
+ def data_table(key = nil)
33
35
  table = @mod.information.xpath("//div[@class='mod-page-data-table']")
34
- return table if key == ''
36
+ return table if key.blank?
37
+
35
38
  xpath = "//td[../td[@class='data-name'][.='#{key}:']]"
36
39
  table.xpath xpath
37
40
  end
@@ -50,7 +53,7 @@ module Factorio
50
53
  end
51
54
  end
52
55
 
53
- # Get the logged in cookie.
56
+ # Get the logged in cookie by webdriver.
54
57
  #
55
58
  # @example
56
59
  # # use firefox nightly
@@ -58,12 +61,12 @@ module Factorio
58
61
  # `which firefox-nightly`.chomp
59
62
  # # open firefox
60
63
  # driver = Selenium::WebDriver.for :firefox
61
- # cookie = Factorio::Mod.login_cookie(driver)
64
+ # cookie = Factorio::Mod.login_cookie_webdriver(driver)
62
65
  # # the browser will automatically close
63
66
  # @param driver [Selenium::WebDriver::Driver] Web Driver
64
67
  # @param autoclose [Bool] automatically close the browser after logging in
65
68
  # @return [String] The logged in cookie
66
- def self.login_cookie(driver, autoclose = true)
69
+ def self.login_cookie_webdirver(driver, autoclose = true)
67
70
  begin
68
71
  driver.navigate.to 'https://mods.factorio.com/login'
69
72
  rescue Net::ReadTimeout
@@ -77,12 +80,44 @@ module Factorio
77
80
  "session=#{session}"
78
81
  end
79
82
 
83
+ # @return [String, String] `csrf_token` and cookie
84
+ def self.csrf_and_cookie
85
+ resp = open 'https://mods.factorio.com/login'
86
+ cookie = resp.meta['set-cookie'].split('; ')[0]
87
+ csrf_token = Nokogiri::HTML(resp).css('#csrf_token @value').to_s
88
+ [csrf_token, cookie]
89
+ end
90
+ private_class_method :csrf_and_cookie
91
+
92
+ # Get the logged in cookie by username and password.
93
+ #
94
+ # @example
95
+ # print 'username: '
96
+ # user = gets.chomp
97
+ # print 'password: '
98
+ # pass = gets.chomp
99
+ # cookie = Factorio::Mod.login_cookie user, pass
100
+ # @param username [String]
101
+ # @param password [String]
102
+ # @return [String] The logged in cookie
103
+ def self.login_cookie(username, password)
104
+ csrf_token, cookie = csrf_and_cookie
105
+ data = URI.encode_www_form(
106
+ 'csrf_token' => csrf_token,
107
+ 'username' => username,
108
+ 'password' => password
109
+ )
110
+ resp = Net::HTTP.post(URI(MOD_URI + '/login'), data, 'Cookie' => cookie)
111
+ resp.response['set-cookie'].split('; ').first
112
+ end
113
+
80
114
  # Extend relative links to absolute links
81
115
  # @param rel [String] relative link
82
116
  # @return [String] absolute link
83
117
  # @raise [NotLoginError]
84
118
  def self.extend_uri(rel)
85
119
  raise NotLoginError if rel =~ %r{^/login}
120
+
86
121
  MOD_URI + rel
87
122
  end
88
123
 
@@ -109,16 +144,13 @@ module Factorio
109
144
  # Get the GitHub URI.
110
145
  # @return [String] GitHub URI
111
146
  def github
112
- uri = @mod.any.xpath('//a[@class="source-code-link"]/@href').text
113
- return if uri.empty?
114
- uri
147
+ @mod.any.xpath('//a[@class="source-code-link"]/@href').text.presence
115
148
  end
116
149
 
117
150
  # Get the git repo URI that can be cloned.
118
151
  # @return [String] git URI
119
152
  def git
120
- return if github.nil?
121
- github + '.git'
153
+ github &.+ '.git'
122
154
  end
123
155
 
124
156
  # Get the license that the Mod use.
@@ -156,8 +188,9 @@ module Factorio
156
188
  # Get the latest _download_ of the Mod.
157
189
  # @param version [String] factorio version
158
190
  # @return [Download]
159
- def latest_download(version = '')
160
- return download_list.last if version == ''
191
+ def latest_download(version = nil)
192
+ return download_list.last if version.blank?
193
+
161
194
  download_list.each do |download|
162
195
  return download if download.game_version == version.to_s
163
196
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Factorio
2
4
  class Mod
3
- VERSION = '0.4.0'.freeze
5
+ VERSION = '0.5.0'
4
6
  end
5
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factorio-mod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 71e6fd52
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-16 00:00:00.000000000 Z
11
+ date: 2018-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '5.2'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '5.2'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: nokogiri
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -133,6 +147,7 @@ files:
133
147
  - ".gitignore"
134
148
  - ".gitlab-ci.yml"
135
149
  - ".rspec"
150
+ - ".rubocop.yml"
136
151
  - ".yardopts"
137
152
  - Gemfile
138
153
  - Gemfile.lock
@@ -167,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
182
  version: '0'
168
183
  requirements: []
169
184
  rubyforge_project:
170
- rubygems_version: 2.7.4
185
+ rubygems_version: 2.7.7
171
186
  signing_key:
172
187
  specification_version: 4
173
188
  summary: Get the info of Factorio's MOD.