opentofu 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1eeac402d86ae7cc5b5f2e9be3327a60f8f3132453854ea9ee5f477462e58fc7
4
- data.tar.gz: 54f68d912adb5e14a39ddde842ad4acf5ff3664923815138e5a30fcc8ba87881
3
+ metadata.gz: a69c67e3a0d558a57695eafff1a69d111d8ff7ccc6c74de393efe6cb5f0bf276
4
+ data.tar.gz: 780851bb7b0166ec9ea945f71735eba1c795cd399a7633606bdd4639762c6b59
5
5
  SHA512:
6
- metadata.gz: c74b24eada5091a0d37eb1a97b871838744e2169b36974fed374900c0a64e73acafe019751341da153f6f5e59a0b6e48e2c4aa9b1674fa65aa3573a74be44528
7
- data.tar.gz: 8c00e948a371088cd8e87698d3884fe55d7aa8b84ac65c5a5d64d6b0a53cbf505fed91010cd4d83e53f820a1b2a6dac46a9ad5947733546404e1d992d0301bf5
6
+ metadata.gz: c506b5667e6e99e717f0455c94a6e362664a5c299d880f465b031aa684969120c5484175c28606fc5aaabc39bd1fa577c89f6d05374e1df8ea37642dd4bf91e3
7
+ data.tar.gz: 5d6f6f2ea96f1ea01a5b442dba6f1f8ef8f83f40f852866b28995fcd879a96a6914030f20303a71d6c9b21e2a56346aba28ad74b9a03a832a71b34e57325a1c2
data/.rubocop.yml CHANGED
@@ -1,16 +1,13 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.6
3
3
 
4
- Metrics/MethodLength:
4
+ Metrics/AbcSize:
5
5
  Enabled: true
6
- Max: 18
7
- Exclude:
8
- - "lib/net/tofu/response.rb"
6
+ Max: 25
9
7
 
10
- Style/ClassVars:
8
+ Metrics/MethodLength:
11
9
  Enabled: true
12
- Exclude:
13
- - "lib/net/tofu/request.rb"
10
+ Max: 18
14
11
 
15
12
  Style/Semicolon:
16
13
  Enabled: true
@@ -18,9 +15,7 @@ Style/Semicolon:
18
15
  - "lib/net/tofu/response.rb"
19
16
 
20
17
  Style/SingleLineMethods:
21
- Enabled: true
22
- Exclude:
23
- - "lib/net/tofu/response.rb"
18
+ Enabled: false
24
19
 
25
20
  Style/StringLiterals:
26
21
  Enabled: true
data/CHANGELOG.md CHANGED
@@ -5,7 +5,25 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.1.0] - 2023-07027
8
+ ## [0.1.1] - 2023-07-28
9
+
10
+ ### Added
11
+
12
+ - Tests.
13
+ - The `simplecov` gem to view testing coverage.
14
+ - A new error, for if the server doesn't send any data.
15
+ - The Linux platform to the bundle platform.
16
+
17
+ ### Fixed
18
+
19
+ - Complexity issues in the Response class from the linter.
20
+
21
+ ### Removed
22
+
23
+ - The `@@current_host` class variable from Request. Clients should handle keeping track of the current host, Tofu should just fetch data.
24
+ - The complicated logic used to parse host names from the Request class, as per the above point.
25
+
26
+ ## [0.1.0] - 2023-07-27
9
27
 
10
28
  First release. Still lots of improvements to be made.
11
29
 
@@ -3,6 +3,9 @@
3
3
  module Net
4
4
  module Tofu
5
5
  class Response
6
+ # Raised when a server doesn't send any data.
7
+ class NoServerResponseError < StandardError; end
8
+
6
9
  # Raised when a server sends an invalid header.
7
10
  class InvalidHeaderError < StandardError; end
8
11
 
@@ -4,8 +4,6 @@ module Net
4
4
  module Tofu
5
5
  # Stores a client request to a Gemini server.
6
6
  class Request
7
- SCHEME = "gemini"
8
-
9
7
  MAX_URI_BYTESIZE = 1024
10
8
 
11
9
  # @return [URI] The full URI object of the request.
@@ -36,17 +34,12 @@ module Net
36
34
  # @param host [String] A host string, optionally with the gemini:// scheme.
37
35
  # @param port [Integer] Optional parameter to specify the server port to connect to.
38
36
  def initialize(host, port: nil)
39
- # Keeps track of the current host for links with only paths.
40
- @@current_host ||= ""
37
+ @uri = URI(host)
38
+ @uri.port = port unless port.nil?
41
39
 
42
- @host = host
43
- @port = port unless port.nil?
44
- determine_host
45
40
  parse_head
46
41
  parse_tail
47
42
 
48
- puts format
49
-
50
43
  # Make sure the URI isn't too large
51
44
  if format.bytesize > MAX_URI_BYTESIZE
52
45
  raise InvalidURIError,
@@ -73,63 +66,28 @@ module Net
73
66
 
74
67
  private
75
68
 
76
- # Parses the host and the path, and sets the current_host.
77
- def determine_host
78
- puts "current: #{@@current_host}"
79
- @uri = URI(@host)
80
-
81
- unless @uri.host.nil? || @uri.host.empty?
82
- @host = @uri.host
83
- @@current_host = @host
84
- return
85
- end
86
-
87
- return if @uri.path.nil? || @uri.path.empty?
88
- return unless @uri.host.nil? || @uri.host.empty?
89
-
90
- if @uri.path.start_with?("/")
91
- raise InvalidURIError, "No host specified" if @@current_host.nil? || @@current_host.empty?
92
-
93
- unless @@current_host.nil? || @@current_host.empty?
94
- @uri.host = @@current_host
95
- @host = @uri.host
96
- @@current_host = @host
97
- end
98
-
99
- return
100
- end
101
-
102
- paths = @uri.path.split("/")
103
- puts paths
104
-
105
- @uri.host = paths[0]
106
- @host = @uri.host
107
- @@current_host = @host
108
- @uri.path = nil if paths.length == 1
109
- return unless paths.length > 1
110
-
111
- @uri.path = paths[1..].join("/")
112
- @uri.path = "/#{uri.path}"
113
- end
114
-
115
69
  # Parses the scheme, the host, and the port for the request.
116
70
  def parse_head
117
71
  # Check if a scheme was specified, if not, default to gemini://
118
72
  # Also set the port if this happens
119
73
  if @uri.scheme.nil? || @uri.scheme.empty?
120
- @uri.scheme = SCHEME
121
- @uri.port = URI::Gemini::DEFAULT_PORT
74
+ @uri.scheme = URI::Gemini::DEFAULT_SCHEME
75
+ @uri.port = URI::Gemini::DEFAULT_PORT if @uri.port.nil?
122
76
  end
123
77
 
78
+ # Check if a host was specified.
79
+ raise InvalidURIError, "Request does not contain a host" if @uri.host.nil? || @uri.host.empty?
80
+
124
81
  # Set member parts
125
82
  @scheme = @uri.scheme
83
+ @host = @uri.host
126
84
  @port = @uri.port
127
85
 
128
86
  # Check if a scheme is present that isn't gemini://
129
- return if @uri.scheme == SCHEME
87
+ return if @uri.scheme == URI::Gemini::DEFAULT_SCHEME
130
88
 
131
89
  raise InvalidSchemeError,
132
- "Request uses an invalid scheme (has: #{@uri.scheme}, wants: #{SCHEME}"
90
+ "Request uses an invalid scheme (has: #{@uri.scheme}, wants: #{URI::Gemini::DEFAULT_SCHEME}"
133
91
  end
134
92
 
135
93
  # Parses the path, the query, and the fragment for the request.
@@ -83,6 +83,8 @@ module Net
83
83
 
84
84
  # Splits up the responseinto a header and a body.
85
85
  def parse
86
+ raise NoServerResponseError if @data.nil? || @data.empty?
87
+
86
88
  # Extract the header and parse it
87
89
  a = @data.split("\n")
88
90
  @header = a[0].strip
@@ -108,6 +110,7 @@ module Net
108
110
  # Parse the meta
109
111
  @meta = ""
110
112
  @meta = a[1..].join(" ") if a.length >= 2
113
+ @meta.strip!
111
114
  parse_meta
112
115
  end
113
116
 
@@ -144,14 +147,21 @@ module Net
144
147
  def parse_meta
145
148
  # Make sure the meta isn't too large
146
149
  if @meta.bytesize > MAX_META_BYTESIZE
147
- raise InvalidMetaError,
148
- "The server sent a meta that was too large, should be #{MAX_META_BYTESIZE} bytes, instead is #{@meta.bytesize} bytes"
150
+ raise InvalidMetaError, <<-TXT
151
+ The server sent a meta that was too large, should be #{MAX_META_BYTESIZE} bytes,
152
+ instead is #{@meta.bytesize} bytes
153
+ TXT
149
154
  end
150
155
 
151
156
  if @status_maj == TEMPORARY_FAILURE || @status_maj == PERMANENT_FAILURE || @status_maj == REQUEST_CERTIFICATE
152
157
  return
153
158
  end
154
159
 
160
+ # Handle extra checks based on the @status type
161
+ handle_type
162
+ end
163
+
164
+ def handle_type
155
165
  # Make sure meta exists (i.e. has length)
156
166
  # This satisfies the INPUT and SUCCESS
157
167
  unless @meta.length.positive?
@@ -169,10 +179,10 @@ module Net
169
179
  raise InvalidRedirectError, "The redirect link does not have a scheme" if uri.scheme.nil? || uri.scheme.empty?
170
180
 
171
181
  # Make sure the URI scheme is 'gemini'
172
- return if uri.scheme == "gemini"
182
+ return if uri.scheme == URI::Gemini::DEFAULT_SCHEME
173
183
 
174
184
  raise InvalidRedirectError,
175
- "The redirect link has an invalid scheme (has: #{uri.scheme}, wants: gemini)"
185
+ "The redirect link has an invalid scheme (has: #{uri.scheme}, wants: #{URI::Gemini::DEFAULT_SCHEME})"
176
186
  end
177
187
  end
178
188
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Tofu
4
- VERSION = "0.1.0"
3
+ module Net
4
+ module Tofu
5
+ VERSION = "0.1.1"
6
+ end
5
7
  end
data/lib/uri/gemini.rb CHANGED
@@ -35,6 +35,9 @@ module URI # :nodoc:
35
35
  # A Default port of 1965 for URI::Gemini.
36
36
  DEFAULT_PORT = 1965
37
37
 
38
+ # A Default scheme of gemini for URI::Gemini.
39
+ DEFAULT_SCHEME = "gemini"
40
+
38
41
  # An Array of the available components for URI::Gemini.
39
42
  COMPONENT = %i[scheme host port
40
43
  path query fragment].freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentofu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rory Dudley
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-27 00:00:00.000000000 Z
11
+ date: 2023-07-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  OpenTOFU is a client and certificate pinning library for Geminispace, derived from
@@ -39,7 +39,7 @@ metadata:
39
39
  allowed_push_host: https://rubygems.org
40
40
  homepage_uri: https://github.com/pinecat/opentofu
41
41
  source_code_uri: https://github.com/pinecat/opentofu
42
- changelog_uri: https://github.com/pinecat/opentofu
42
+ changelog_uri: https://github.com/pinecat/opentofu/blob/master/CHANGELOG.md
43
43
  post_install_message:
44
44
  rdoc_options: []
45
45
  require_paths: