socketry 0.5.1 → 0.6.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 +5 -5
- data/context/configuration.md +154 -0
- data/lib/socketry/version.rb +5 -1
- data/lib/socketry.rb +3 -22
- data/license.md +21 -0
- data/readme.md +47 -0
- data/releases.md +6 -0
- data/skills/socketry-github-repository/SKILL.md +95 -0
- data/skills/socketry-pull-request/SKILL.md +54 -0
- metadata +20 -69
- data/.gitignore +0 -9
- data/.rspec +0 -4
- data/.rubocop.yml +0 -59
- data/.ruby-version +0 -1
- data/.travis.yml +0 -16
- data/CHANGES.md +0 -35
- data/Gemfile +0 -20
- data/Guardfile +0 -10
- data/LICENSE.txt +0 -22
- data/README.md +0 -110
- data/Rakefile +0 -10
- data/lib/socketry/exceptions.rb +0 -40
- data/lib/socketry/resolver/resolv.rb +0 -67
- data/lib/socketry/resolver/system.rb +0 -48
- data/lib/socketry/ssl/server.rb +0 -53
- data/lib/socketry/ssl/socket.rb +0 -190
- data/lib/socketry/tcp/server.rb +0 -85
- data/lib/socketry/tcp/socket.rb +0 -345
- data/lib/socketry/timeout.rb +0 -76
- data/lib/socketry/udp/datagram.rb +0 -29
- data/lib/socketry/udp/socket.rb +0 -185
- data/logo.png +0 -0
- data/socketry.gemspec +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: bb6cedf3671c482943ca47ac78560a9336a24483c8360acf69d9fc0b554ed763
|
|
4
|
+
data.tar.gz: 3ddc39a363c81b193a83bef5f686061f97b22c116012eb0aba573cf784580773
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a1768e2f61b5471f105cebc4b694efe141c3fecd5e7d74cf209224b714f7ff15868d95b0434de9cea869f3bfa7803e213db0c4f1d4a19a519893de51915f6cc8
|
|
7
|
+
data.tar.gz: 2b0816ac308875a0b43703f6ffee289e59f8e575949d8edbea9156eb45c84edc0361b3823120ee2ccb19276f0c0670d2bfa3e58fd629484a8edd50df351553cd
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Configuration and Builder
|
|
2
|
+
|
|
3
|
+
Use a mutable `Configuration` and a separate `Builder` for Ruby configuration DSLs in Socketry projects. This guide defines their responsibilities, construction, file loading, and explicit freezing.
|
|
4
|
+
|
|
5
|
+
## Design
|
|
6
|
+
|
|
7
|
+
Create the configuration first. Pass it to a builder, which applies the DSL to that same object. Return the configuration after evaluation, keeping it mutable.
|
|
8
|
+
|
|
9
|
+
- `Configuration` owns the configuration state, defaults, readers, and mutation methods. It can be configured directly through its public API.
|
|
10
|
+
- `Builder` provides the DSL and file-loading context. It changes the configuration through its public API. Use `Builder` as the standard name for this role, including when it loads files.
|
|
11
|
+
- `Configuration.build` evaluates a block through a builder and returns the configuration.
|
|
12
|
+
- `Configuration.load` loads files in order into one configuration and returns it.
|
|
13
|
+
- `Configuration#freeze` finalises the configuration when the caller chooses. `.build` and `.load` do not call it automatically.
|
|
14
|
+
|
|
15
|
+
The builder does not keep a second set of configuration values to transfer later. There is no final `Builder#build` step, `new(builder.attributes)` conversion, snapshot copying, or automatic freezing. Configuration readers belong on `Configuration`; the builder only needs its configuration reference and any DSL context such as a root directory.
|
|
16
|
+
|
|
17
|
+
Keep domain invariants in configuration mutation methods so they also apply to direct callers. The builder can translate convenient DSL arguments into those operations. Use ordinary writers for simple values and methods such as `add` for collections. A DSL method can have the same name as a configuration reader because they are on different objects.
|
|
18
|
+
|
|
19
|
+
## Example
|
|
20
|
+
|
|
21
|
+
The classes below share a project namespace. In a gem, they can live in separate `configuration.rb` and `builder.rb` files. `entry` and `concurrency` illustrate a collection and a scalar setting; use the project's own domain operations and defaults.
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
# frozen_string_literal: true
|
|
25
|
+
|
|
26
|
+
module Example
|
|
27
|
+
class Builder
|
|
28
|
+
def initialize(configuration, root = Dir.pwd)
|
|
29
|
+
@configuration = configuration
|
|
30
|
+
@root = File.expand_path(root)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
attr :root
|
|
34
|
+
|
|
35
|
+
def entry(name, value)
|
|
36
|
+
@configuration.add(name, value)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def concurrency(value)
|
|
40
|
+
@configuration.concurrency = value
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.load_file(configuration, path)
|
|
44
|
+
path = File.realpath(path)
|
|
45
|
+
builder = self.new(configuration, File.dirname(path))
|
|
46
|
+
builder.instance_eval(File.read(path), path, 1)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def load_file(path)
|
|
50
|
+
self.class.load_file(@configuration, File.expand_path(path, @root))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Configuration
|
|
55
|
+
def self.build(root: Dir.pwd, &block)
|
|
56
|
+
configuration = self.new
|
|
57
|
+
builder = Builder.new(configuration, root)
|
|
58
|
+
|
|
59
|
+
if block
|
|
60
|
+
if block.arity.zero?
|
|
61
|
+
builder.instance_eval(&block)
|
|
62
|
+
else
|
|
63
|
+
block.call(builder)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
return configuration
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.load(paths)
|
|
71
|
+
configuration = self.new
|
|
72
|
+
Array(paths).each{|path| configuration.load_file(path)}
|
|
73
|
+
return configuration
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def initialize
|
|
77
|
+
@entries = {}
|
|
78
|
+
@concurrency = 1
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
attr :entries
|
|
82
|
+
attr_accessor :concurrency
|
|
83
|
+
|
|
84
|
+
def add(name, value)
|
|
85
|
+
@entries[name.to_sym] = value
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def load_file(path)
|
|
89
|
+
Builder.load_file(self, path)
|
|
90
|
+
return self
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def freeze
|
|
94
|
+
return self if frozen?
|
|
95
|
+
|
|
96
|
+
@entries.freeze
|
|
97
|
+
|
|
98
|
+
super
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The DSL and direct API operate on the same mutable state:
|
|
105
|
+
|
|
106
|
+
```ruby
|
|
107
|
+
configuration = Example::Configuration.build do
|
|
108
|
+
entry :primary, "https://example.com"
|
|
109
|
+
concurrency 2
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
configuration.add(:secondary, "https://secondary.example.com")
|
|
113
|
+
configuration.concurrency = 4
|
|
114
|
+
|
|
115
|
+
Example::Configuration.build do |builder|
|
|
116
|
+
builder.entry(:primary, "https://example.com")
|
|
117
|
+
end
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The example allows an omitted block to return defaults. With a zero-arity block, `self` is the builder; with an explicit block argument, the caller's `self` is preserved. Both factories return the configuration regardless of the block's or file's last expression.
|
|
121
|
+
|
|
122
|
+
## Explicit Freezing
|
|
123
|
+
|
|
124
|
+
Implement `Configuration#freeze` to freeze the state owned by the configuration, then call `super` to freeze the configuration itself. Return `self` immediately when already frozen so repeated calls do not repeat finalisation. The same configuration object is returned; freezing does not construct a replacement.
|
|
125
|
+
|
|
126
|
+
The example owns the `entries` hash and freezes it in place. Its registered values are application-supplied objects retained by reference, so they remain untouched. Freeze owned nested configuration data as appropriate to its schema, but do not recursively freeze arbitrary handlers, policies, or other application objects. Freezing the outer object alone would still allow `add` to modify an unfrozen hash.
|
|
127
|
+
|
|
128
|
+
The caller decides when configuration is complete:
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
configuration.freeze
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
After this call, `concurrency=` and `add` raise `FrozenError`, including when called through a builder attached to the configuration. References previously obtained from `configuration.entries` refer to the same frozen hash. Registered objects keep their own lifecycle and mutability.
|
|
135
|
+
|
|
136
|
+
If finalisation prepares derived state, do that before calling `super`. Runtime methods must not depend on assigning new instance variables after the configuration has been frozen.
|
|
137
|
+
|
|
138
|
+
## File Loading
|
|
139
|
+
|
|
140
|
+
Each file is evaluated by a new builder attached to the shared configuration. Its root is that file's directory. A nested `load_file "other.rb"` resolves against the calling builder's root and creates another builder for the referenced file. The original builder keeps its root throughout; no temporary root assignment or restoration is needed.
|
|
141
|
+
|
|
142
|
+
Resolve the file path before creating the builder, and pass the filename and starting line to `instance_eval` for useful source locations. Configuration files execute trusted application Ruby.
|
|
143
|
+
|
|
144
|
+
Multiple top-level files share one configuration. The example applies them in order, with later entries replacing earlier entries of the same name. Preserve the domain's duplicate and override rules when adapting the pattern. Evaluation errors propagate; mutations made before an error remain on an existing configuration. Loading is not transactional.
|
|
145
|
+
|
|
146
|
+
## Applying the Standard
|
|
147
|
+
|
|
148
|
+
Use this design for new configuration DSLs and when standardising existing ones. Preserve existing public names and entry points as compatibility wrappers where needed; an existing `Loader` can retain its name while the implementation moves to `Builder`. Keep runtime query methods and domain validation on the configuration.
|
|
149
|
+
|
|
150
|
+
Verify that block and file factories return the configured object, that it can still be changed through the direct API, and that builders for multiple files update that same object. Explicit freezing should return that object, tolerate repeated calls, and prevent changes to its owned state through writers, collection readers, or attached builders, while leaving application objects untouched. For nested files, check relative resolution, stable builder roots, and exception source locations.
|
|
151
|
+
|
|
152
|
+
## Established Examples
|
|
153
|
+
|
|
154
|
+
This design follows [Falcon's configuration/loader separation from June 2019](https://github.com/socketry/falcon/commit/438e04eb295400f0481d72b610a2f9c9ea062746), carried into [Async::Service in February 2024](https://github.com/socketry/async-service/commit/d2d717b7605d364df3a853e8a810aeab2bc36078). Async::Service's [configuration](https://github.com/socketry/async-service/blob/f32af00e5c7a54c936023b96f180710e811d410e/lib/async/service/configuration.rb) and [loader](https://github.com/socketry/async-service/blob/f32af00e5c7a54c936023b96f180710e811d410e/lib/async/service/loader.rb) illustrate the mutable state and per-file loading scopes. This standard uses the name `Builder` for that DSL role.
|
data/lib/socketry/version.rb
CHANGED
data/lib/socketry.rb
CHANGED
|
@@ -1,25 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
require "ipaddr"
|
|
6
|
-
require "socket"
|
|
7
|
-
require "openssl"
|
|
3
|
+
# Released under the MIT License.
|
|
4
|
+
# Copyright, 2026, by Samuel Williams.
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
require "hitimes"
|
|
11
|
-
|
|
12
|
-
# Socketry codebase
|
|
13
|
-
require "socketry/version"
|
|
14
|
-
|
|
15
|
-
require "socketry/exceptions"
|
|
16
|
-
require "socketry/resolver/resolv"
|
|
17
|
-
require "socketry/resolver/system"
|
|
18
|
-
require "socketry/timeout"
|
|
19
|
-
|
|
20
|
-
require "socketry/tcp/server"
|
|
21
|
-
require "socketry/tcp/socket"
|
|
22
|
-
require "socketry/ssl/server"
|
|
23
|
-
require "socketry/ssl/socket"
|
|
24
|
-
require "socketry/udp/datagram"
|
|
25
|
-
require "socketry/udp/socket"
|
|
6
|
+
require_relative "socketry/version"
|
data/license.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright, 2026, by Samuel Williams.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/readme.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Socketry
|
|
2
|
+
|
|
3
|
+
Socketry project metadata, agent context, and skills.
|
|
4
|
+
|
|
5
|
+
[](https://github.com/socketry/socketry/actions?workflow=Test)
|
|
6
|
+
|
|
7
|
+
## Agent Context
|
|
8
|
+
|
|
9
|
+
This gem distributes project conventions in the top-level `context/` directory:
|
|
10
|
+
|
|
11
|
+
- [Configuration and Builder](context/configuration.md) defines the mutable configuration and builder design for Ruby configuration DSLs.
|
|
12
|
+
|
|
13
|
+
Projects that include `socketry` and [`agent-context`](https://github.com/socketry/agent-context) can install the context and update their `agents.md` index with:
|
|
14
|
+
|
|
15
|
+
``` bash
|
|
16
|
+
bundle exec bake agent:context:install --gem socketry
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Agent Skills
|
|
20
|
+
|
|
21
|
+
This gem provides reusable agent skills in the top-level `skills/` directory. Use [`agent-skills`](https://github.com/socketry/agent-skills) to discover and install them into a project.
|
|
22
|
+
|
|
23
|
+
## Releases
|
|
24
|
+
|
|
25
|
+
Releases use [`bake-gem-github`](https://github.com/socketry/bake-gem-github). With Ruby 3.3 or later, install maintenance dependencies before preparing a release:
|
|
26
|
+
|
|
27
|
+
``` bash
|
|
28
|
+
bundle config set --local with maintenance
|
|
29
|
+
bundle install
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Add release notes under `Unreleased` in `releases.md`. From a clean, up-to-date `main`, prepare a release pull request:
|
|
33
|
+
|
|
34
|
+
``` bash
|
|
35
|
+
bundle exec bake gem:github:release:patch # or minor or major
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The release hook versions the notes. GitHub validates the release changes, then publishes the merged release to RubyGems using Trusted Publishing.
|
|
39
|
+
|
|
40
|
+
Publishing uses the `rubygems` GitHub environment, restricted to `main`. For initial activation, register a RubyGems Trusted Publisher for `socketry/socketry`, workflow `release-publish.yaml`, environment `rubygems`. After merging the setup and confirming the `Gem build` and `Release validation` checks run, review and apply the repository policy:
|
|
41
|
+
|
|
42
|
+
``` bash
|
|
43
|
+
bundle exec bake gem:github:setup:plan
|
|
44
|
+
bundle exec bake gem:github:setup:apply
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The policy requires two PR approvals with administrator bypass. See the [release setup guide](https://socketry.github.io/bake-gem-github/guides/getting-started/index) for configuration and recovery.
|
data/releases.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: socketry-github-repository
|
|
3
|
+
description: Create and maintain Socketry GitHub repositories using the project conventions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Socketry GitHub Repository
|
|
7
|
+
|
|
8
|
+
Use this skill when creating or maintaining GitHub repositories for Socketry projects.
|
|
9
|
+
|
|
10
|
+
## Repository Metadata
|
|
11
|
+
|
|
12
|
+
Repository metadata should be concise, accurate, and consistent with the project purpose.
|
|
13
|
+
|
|
14
|
+
- Use the canonical GitHub organization and repository name for the project.
|
|
15
|
+
- Set a clear repository description that explains what the project provides.
|
|
16
|
+
- Set the homepage to the project documentation site when one exists.
|
|
17
|
+
- Add relevant topics that help discovery without duplicating words already present in the repository name.
|
|
18
|
+
- Prefer existing Socketry naming conventions over inventing new phrasing.
|
|
19
|
+
|
|
20
|
+
## Repository Setup
|
|
21
|
+
|
|
22
|
+
When creating a new repository, configure the repository so it is immediately useful to contributors and automation.
|
|
23
|
+
|
|
24
|
+
- Ensure the default branch is `main`.
|
|
25
|
+
- Enable `Issues`.
|
|
26
|
+
- Enable `Sponsorships`.
|
|
27
|
+
- Enable `Preserve this repository`.
|
|
28
|
+
- Enable `Discussions`.
|
|
29
|
+
- Enable `Pull Requests`.
|
|
30
|
+
- Disable `Projects`.
|
|
31
|
+
- Disable `Wiki`.
|
|
32
|
+
|
|
33
|
+
### Pull Requests
|
|
34
|
+
|
|
35
|
+
- Disable `Allow merge commits`.
|
|
36
|
+
- Enable `Allow squash merging`.
|
|
37
|
+
- Enable `Allow rebase merging`.
|
|
38
|
+
- Enable `Always suggest updating pull request branches`.
|
|
39
|
+
- Enable `Allow auto-merge`.
|
|
40
|
+
- Enable `Automatically delete head branches`.
|
|
41
|
+
|
|
42
|
+
### Commits
|
|
43
|
+
|
|
44
|
+
- Enable `Require contributors to sign off on web-based commits`.
|
|
45
|
+
- Enable `Allow comments on individual commits`.
|
|
46
|
+
|
|
47
|
+
## Issue Types
|
|
48
|
+
|
|
49
|
+
Use GitHub issue types to classify work:
|
|
50
|
+
|
|
51
|
+
- Use `Bug` for defect fixes and regressions.
|
|
52
|
+
- Use `Feature` for new user-facing capabilities.
|
|
53
|
+
- Use `Task` for maintenance, refactoring, documentation, tests, release work, and internal improvements.
|
|
54
|
+
|
|
55
|
+
Do not duplicate issue type information in issue or pull request body sections when GitHub metadata is available.
|
|
56
|
+
|
|
57
|
+
## Labels
|
|
58
|
+
|
|
59
|
+
Prefer existing repository and organization labels. Use labels for workflow and review state rather than repeating information already captured by issue type.
|
|
60
|
+
|
|
61
|
+
Do not create new labels unless the repository genuinely needs a reusable classification that is not already represented by existing labels or issue types.
|
|
62
|
+
|
|
63
|
+
## Branches and Protection
|
|
64
|
+
|
|
65
|
+
Repository protection should ensure changes to `main` are reviewed without blocking administrative maintenance.
|
|
66
|
+
|
|
67
|
+
- Protect the `main` branch.
|
|
68
|
+
- Require a pull request before merging into `main`.
|
|
69
|
+
- Require one approval before merging into `main`.
|
|
70
|
+
- Allow administrators to bypass the branch protection rules.
|
|
71
|
+
- Configure required status checks selectively so auto-merge works for normal pull requests.
|
|
72
|
+
- Require only stable status checks needed for safe auto-merge.
|
|
73
|
+
- Do not require experimental or informational checks.
|
|
74
|
+
- Do not require coverage checks unless the repository already reliably passes them.
|
|
75
|
+
|
|
76
|
+
## Maintenance
|
|
77
|
+
|
|
78
|
+
When maintaining an existing repository, make the smallest safe metadata or settings change needed.
|
|
79
|
+
|
|
80
|
+
- Inspect the current repository settings before changing them.
|
|
81
|
+
- Preserve deliberate project-specific settings.
|
|
82
|
+
- Do not rename, archive, transfer, or delete a repository without explicit user approval.
|
|
83
|
+
- Do not disable issues, pull requests, or required checks without explicit user approval.
|
|
84
|
+
|
|
85
|
+
## GitHub CLI
|
|
86
|
+
|
|
87
|
+
Use the GitHub CLI when making repository changes. Prefer explicit commands which show the target repository.
|
|
88
|
+
|
|
89
|
+
Before changing repository settings, confirm the target repository with:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
gh repo view OWNER/REPOSITORY
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
When a command changes repository settings, use the full `OWNER/REPOSITORY` name rather than relying on the current directory.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: socketry-pull-request
|
|
3
|
+
description: Prepare Socketry pull request titles, commits, and descriptions using the project conventions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Socketry Pull Request
|
|
7
|
+
|
|
8
|
+
Use this skill when preparing commits or pull requests for Socketry projects.
|
|
9
|
+
|
|
10
|
+
## Titles and Commits
|
|
11
|
+
|
|
12
|
+
- Pull request titles must use Markdown and end with a full stop.
|
|
13
|
+
- Pull request titles must be complete sentences.
|
|
14
|
+
- Commit messages must use Markdown and end with a full stop.
|
|
15
|
+
- The first line of a commit message must focus on what was changed.
|
|
16
|
+
- Most commit messages should only be a single line.
|
|
17
|
+
- Relevant context should be retained in the code itself, such as comments, rather than using the commit message as a side channel for important details.
|
|
18
|
+
- Commit messages must not include agent links, attribution footers, generated-by annotations, or similar metadata.
|
|
19
|
+
|
|
20
|
+
## Pull Request Description
|
|
21
|
+
|
|
22
|
+
The pull request description should lead directly into a brief summary, followed by a detailed description of the problem and solution.
|
|
23
|
+
|
|
24
|
+
Do not add a `Types of Changes` section to the pull request description. Use GitHub issue type metadata for classification instead.
|
|
25
|
+
|
|
26
|
+
Use this structure, replacing the placeholder text with project-specific content:
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
Briefly summarize the change in 1-3 sentences.
|
|
30
|
+
|
|
31
|
+
Describe the problem, context, and solution. Include implementation details that help reviewers understand the change. Link relevant issues if applicable. Include screenshots for aesthetic changes.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Testing
|
|
35
|
+
|
|
36
|
+
Changes should include suitable test coverage. Aim for complete coverage of the behavior being changed or introduced.
|
|
37
|
+
|
|
38
|
+
Do not list passing test commands or verification steps in the pull request description unless they explain an unusual risk, limitation, or manual validation requirement.
|
|
39
|
+
|
|
40
|
+
### External Tests
|
|
41
|
+
|
|
42
|
+
If downstream dependencies are directly affected by the change, add them as external tests when useful. See the `bake-test-external` gem for details.
|
|
43
|
+
|
|
44
|
+
## Release Notes
|
|
45
|
+
|
|
46
|
+
If the change is user visible, add a brief release note following the `bake-releases` documentation.
|
|
47
|
+
|
|
48
|
+
## Issue Type
|
|
49
|
+
|
|
50
|
+
Set the GitHub issue type correctly when creating or updating a pull request:
|
|
51
|
+
|
|
52
|
+
- Use `Bug` for defect fixes and regressions.
|
|
53
|
+
- Use `Feature` for new user-facing capabilities.
|
|
54
|
+
- Use `Task` for maintenance, refactoring, documentation, tests, release work, and internal improvements.
|
metadata
CHANGED
|
@@ -1,81 +1,34 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: socketry
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
bindir: exe
|
|
7
|
+
- Samuel Williams
|
|
8
|
+
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: hitimes
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.2'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.2'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '1.0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - "~>"
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '1.0'
|
|
41
|
-
description: Socketry wraps Ruby's sockets with an advanced timeout engine which is
|
|
42
|
-
able to provide multiple simultaneous timeout behaviors in a thread-safe way.
|
|
43
|
-
email:
|
|
44
|
-
- bascule@gmail.com
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies: []
|
|
45
12
|
executables: []
|
|
46
13
|
extensions: []
|
|
47
14
|
extra_rdoc_files: []
|
|
48
15
|
files:
|
|
49
|
-
-
|
|
50
|
-
- ".rspec"
|
|
51
|
-
- ".rubocop.yml"
|
|
52
|
-
- ".ruby-version"
|
|
53
|
-
- ".travis.yml"
|
|
54
|
-
- CHANGES.md
|
|
55
|
-
- Gemfile
|
|
56
|
-
- Guardfile
|
|
57
|
-
- LICENSE.txt
|
|
58
|
-
- README.md
|
|
59
|
-
- Rakefile
|
|
16
|
+
- context/configuration.md
|
|
60
17
|
- lib/socketry.rb
|
|
61
|
-
- lib/socketry/exceptions.rb
|
|
62
|
-
- lib/socketry/resolver/resolv.rb
|
|
63
|
-
- lib/socketry/resolver/system.rb
|
|
64
|
-
- lib/socketry/ssl/server.rb
|
|
65
|
-
- lib/socketry/ssl/socket.rb
|
|
66
|
-
- lib/socketry/tcp/server.rb
|
|
67
|
-
- lib/socketry/tcp/socket.rb
|
|
68
|
-
- lib/socketry/timeout.rb
|
|
69
|
-
- lib/socketry/udp/datagram.rb
|
|
70
|
-
- lib/socketry/udp/socket.rb
|
|
71
18
|
- lib/socketry/version.rb
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
|
|
19
|
+
- license.md
|
|
20
|
+
- readme.md
|
|
21
|
+
- releases.md
|
|
22
|
+
- skills/socketry-github-repository/SKILL.md
|
|
23
|
+
- skills/socketry-pull-request/SKILL.md
|
|
24
|
+
homepage: https://github.com/socketry/socketry
|
|
75
25
|
licenses:
|
|
76
26
|
- MIT
|
|
77
|
-
metadata:
|
|
78
|
-
|
|
27
|
+
metadata:
|
|
28
|
+
bug_tracker_uri: https://github.com/socketry/socketry/issues
|
|
29
|
+
changelog_uri: https://github.com/socketry/socketry/blob/main/releases.md
|
|
30
|
+
funding_uri: https://github.com/sponsors/ioquatix/
|
|
31
|
+
source_code_uri: https://github.com/socketry/socketry.git
|
|
79
32
|
rdoc_options: []
|
|
80
33
|
require_paths:
|
|
81
34
|
- lib
|
|
@@ -83,16 +36,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
83
36
|
requirements:
|
|
84
37
|
- - ">="
|
|
85
38
|
- !ruby/object:Gem::Version
|
|
86
|
-
version:
|
|
39
|
+
version: '3.3'
|
|
87
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
41
|
requirements:
|
|
89
42
|
- - ">="
|
|
90
43
|
- !ruby/object:Gem::Version
|
|
91
44
|
version: '0'
|
|
92
45
|
requirements: []
|
|
93
|
-
|
|
94
|
-
rubygems_version: 2.5.2
|
|
95
|
-
signing_key:
|
|
46
|
+
rubygems_version: 4.0.16
|
|
96
47
|
specification_version: 4
|
|
97
|
-
summary:
|
|
48
|
+
summary: Socketry project metadata, agent context, and skills.
|
|
98
49
|
test_files: []
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
AllCops:
|
|
2
|
-
DisplayCopNames: true
|
|
3
|
-
|
|
4
|
-
#
|
|
5
|
-
# Style
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
LineLength:
|
|
9
|
-
Max: 128
|
|
10
|
-
|
|
11
|
-
Style/AccessorMethodName:
|
|
12
|
-
Enabled: false
|
|
13
|
-
|
|
14
|
-
Style/ConditionalAssignment:
|
|
15
|
-
Enabled: false
|
|
16
|
-
|
|
17
|
-
Style/NumericPredicate:
|
|
18
|
-
Enabled: false
|
|
19
|
-
|
|
20
|
-
Style/RescueModifier:
|
|
21
|
-
Enabled: false
|
|
22
|
-
|
|
23
|
-
Style/SpaceBeforeFirstArg:
|
|
24
|
-
Enabled: false
|
|
25
|
-
|
|
26
|
-
Style/StringLiterals:
|
|
27
|
-
EnforcedStyle: double_quotes
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# Metrics
|
|
31
|
-
#
|
|
32
|
-
|
|
33
|
-
Metrics/AbcSize:
|
|
34
|
-
Max: 50
|
|
35
|
-
|
|
36
|
-
Metrics/ClassLength:
|
|
37
|
-
Max: 200
|
|
38
|
-
|
|
39
|
-
Metrics/CyclomaticComplexity:
|
|
40
|
-
Max: 15
|
|
41
|
-
|
|
42
|
-
Metrics/MethodLength:
|
|
43
|
-
Max: 50
|
|
44
|
-
|
|
45
|
-
Metrics/ParameterLists:
|
|
46
|
-
Enabled: false
|
|
47
|
-
|
|
48
|
-
Metrics/PerceivedComplexity:
|
|
49
|
-
Max: 15
|
|
50
|
-
|
|
51
|
-
#
|
|
52
|
-
# Lint
|
|
53
|
-
#
|
|
54
|
-
|
|
55
|
-
Lint/HandleExceptions:
|
|
56
|
-
Enabled: false
|
|
57
|
-
|
|
58
|
-
Lint/ShadowedException:
|
|
59
|
-
Enabled: false
|
data/.ruby-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.3.3
|