Class: AgentsSkillVault::UrlParser

Inherits:
Object
  • Object
show all
Defined in:
lib/agents_skill_vault/url_parser.rb

Overview

Parses GitHub URLs into their component parts.

Supports repository URLs, folder URLs (tree), and file URLs (blob).

Examples:

Parse a repository URL

result = UrlParser.parse("https://github.com/user/repo")
result.username    # => "user"
result.repo        # => "repo"
result.type        # => :repo

Parse a folder URL

result = UrlParser.parse("https://github.com/user/repo/tree/main/lib/skills")
result.type           # => :folder
result.relative_path  # => "lib/skills"

Defined Under Namespace

Classes: ParseResult, PathSegmentsData

Constant Summary collapse

GITHUB_HOST =
"github.com"

Class Method Summary collapse

Class Method Details

.parse(url) ⇒ ParseResult

Parses a GitHub URL into its components.

Uses Addressable::URI for robust URL parsing with proper encoding/decoding.

Examples:

Parse different URL types

UrlParser.parse("https://github.com/user/repo")
UrlParser.parse("https://github.com/user/repo/tree/main/folder")
UrlParser.parse("https://github.com/user/repo/blob/main/file.rb")

Parse URL with encoded characters

result = UrlParser.parse("https://github.com/user/repo/tree/main/folder%20name")
result.relative_path  # => "folder name"

Parameters:

  • A GitHub URL (repository, tree, or blob)

Returns:

  • Parsed URL components

Raises:

  • if the URL is not a valid GitHub URL



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/agents_skill_vault/url_parser.rb', line 120

def self.parse(url)
  uri = Addressable::URI.parse(url)
  validate_github_url!(uri, url)

  segments = uri.path.sub(%r{^/}, "").split("/").map { |s| Addressable::URI.unencode(s) }
  username = segments[0]
  repo = segments[1]

  path_data = parse_path_segments(segments)

  ParseResult.new(
    username: username,
    repo: repo,
    branch: path_data.branch,
    relative_path: path_data.relative_path,
    type: path_data.type,
    skill_name: path_data.skill_name,
    skill_folder_path: path_data.skill_folder_path
  )
end