easy_caddy 0.1.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.
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyCaddy
4
+ # Minimal Caddyfile parser — extracts site blocks, domains, and reverse_proxy ports.
5
+ # Not a full grammar; covers the patterns ecaddy generates.
6
+ class Parser
7
+ ParsedConfig = Data.define(:domains, :ports, :log_paths)
8
+
9
+ def self.parse(content)
10
+ new(content).parse
11
+ end
12
+
13
+ def initialize(content)
14
+ @content = content
15
+ end
16
+
17
+ def parse
18
+ domains = []
19
+ ports = []
20
+ log_paths = []
21
+
22
+ @content.scan(/^([\w.*-]+\.localhost)\s*\{/) { domains << Regexp.last_match(1) }
23
+ @content.scan(/reverse_proxy\s+localhost:(\d+)/) { ports << Regexp.last_match(1).to_i }
24
+ @content.scan(/\boutput\s+file\s+(\S+)/) { log_paths << Regexp.last_match(1) }
25
+
26
+ ParsedConfig.new(domains: domains.uniq, ports: ports.uniq, log_paths: log_paths.uniq)
27
+ end
28
+
29
+ # Derive a project name from the first non-vite domain.
30
+ # "fishme.localhost" → "fishme", "vite.fishme.localhost" is skipped.
31
+ def self.infer_name(content)
32
+ domains = parse(content).domains
33
+ primary = domains.reject { |d| d.start_with?('vite.') }.first
34
+ return unless primary
35
+
36
+ primary.sub(/\.localhost$/, '')
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyCaddy
4
+ module Paths
5
+ def self.root
6
+ Pathname.new(ENV.fetch('ECADDY_HOME', File.join(Dir.home, '.config', 'caddy')))
7
+ end
8
+
9
+ def self.sites_dir = root.join('sites')
10
+ def self.disabled_dir = root.join('disabled')
11
+ def self.registry = root.join('ecaddy.yml')
12
+ def self.caddyfile = root.join('Caddyfile')
13
+ def self.brew_caddyfile = Pathname.new('/opt/homebrew/etc/Caddyfile')
14
+
15
+ def self.site_file(name) = sites_dir.join("#{name}.caddy")
16
+ def self.disabled_file(name) = disabled_dir.join("#{name}.caddy")
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require_relative 'paths'
5
+ require_relative 'site'
6
+
7
+ module EasyCaddy
8
+ class Registry
9
+ def self.load = new(Paths.registry)
10
+
11
+ def initialize(path = Paths.registry)
12
+ @path = path
13
+ @data = path.exist? ? YAML.safe_load(path.read, permitted_classes: [Symbol]) || {} : {}
14
+ end
15
+
16
+ def all
17
+ @data.values.map { |h| Site.from_h(h) }
18
+ end
19
+
20
+ def find(name)
21
+ h = @data[name]
22
+ Site.from_h(h) if h
23
+ end
24
+
25
+ def add(site)
26
+ @data[site.name] = site.to_h
27
+ save
28
+ end
29
+
30
+ def update(site)
31
+ raise ArgumentError, "Unknown site: #{site.name}" unless @data.key?(site.name)
32
+
33
+ @data[site.name] = site.to_h
34
+ save
35
+ end
36
+
37
+ def remove(name)
38
+ @data.delete(name)
39
+ save
40
+ end
41
+
42
+ private
43
+
44
+ def save
45
+ @path.parent.mkpath
46
+ @path.write(YAML.dump(@data))
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyCaddy
4
+ Site = Data.define(:name, :enabled, :source_path) do
5
+ def self.from_h(h)
6
+ new(name: h['name'], enabled: h.fetch('enabled', true), source_path: h['source_path'])
7
+ end
8
+
9
+ def to_h
10
+ { 'name' => name, 'enabled' => enabled, 'source_path' => source_path }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyCaddy
4
+ VERSION = '0.1.0'
5
+ end
data/lib/easy_caddy.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+ require 'fileutils'
5
+
6
+ require_relative 'easy_caddy/version'
7
+ require_relative 'easy_caddy/paths'
8
+ require_relative 'easy_caddy/site'
9
+ require_relative 'easy_caddy/registry'
10
+ require_relative 'easy_caddy/parser'
11
+ require_relative 'easy_caddy/caddy'
12
+ require_relative 'easy_caddy/conflicts'
13
+ require_relative 'easy_caddy/cli'
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_caddy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pawel Niemczyk
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: thor
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.3'
26
+ - !ruby/object:Gem::Dependency
27
+ name: tty-prompt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.23'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.23'
40
+ - !ruby/object:Gem::Dependency
41
+ name: tty-table
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.12'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.12'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.13'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.13'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.65'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.65'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rubocop-rspec
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.0'
110
+ description: ecaddy registers per-project Caddyfile fragments into a shared global
111
+ Caddy instance, with conflict detection, Procfile integration, and one-shot machine
112
+ setup.
113
+ email:
114
+ - pniemczyk.info@gmail.com
115
+ executables:
116
+ - ecaddy
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - CHANGELOG.md
121
+ - LICENSE
122
+ - README.md
123
+ - exe/ecaddy
124
+ - lib/easy_caddy.rb
125
+ - lib/easy_caddy/caddy.rb
126
+ - lib/easy_caddy/cli.rb
127
+ - lib/easy_caddy/commands/audit.rb
128
+ - lib/easy_caddy/commands/doctor.rb
129
+ - lib/easy_caddy/commands/down.rb
130
+ - lib/easy_caddy/commands/edit.rb
131
+ - lib/easy_caddy/commands/ensure.rb
132
+ - lib/easy_caddy/commands/list.rb
133
+ - lib/easy_caddy/commands/logs.rb
134
+ - lib/easy_caddy/commands/register_helpers.rb
135
+ - lib/easy_caddy/commands/reload.rb
136
+ - lib/easy_caddy/commands/remove.rb
137
+ - lib/easy_caddy/commands/run.rb
138
+ - lib/easy_caddy/commands/setup.rb
139
+ - lib/easy_caddy/commands/status.rb
140
+ - lib/easy_caddy/commands/up.rb
141
+ - lib/easy_caddy/conflicts.rb
142
+ - lib/easy_caddy/parser.rb
143
+ - lib/easy_caddy/paths.rb
144
+ - lib/easy_caddy/registry.rb
145
+ - lib/easy_caddy/site.rb
146
+ - lib/easy_caddy/version.rb
147
+ homepage: https://github.com/pniemczyk/easy_caddy
148
+ licenses:
149
+ - MIT
150
+ metadata:
151
+ source_code_uri: https://github.com/pniemczyk/easy_caddy
152
+ changelog_uri: https://github.com/pniemczyk/easy_caddy/blob/main/CHANGELOG.md
153
+ documentation_uri: https://pniemczyk.github.io/easy_caddy/
154
+ bug_tracker_uri: https://github.com/pniemczyk/easy_caddy/issues
155
+ rubygems_mfa_required: 'true'
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: 3.2.0
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubygems_version: 4.0.6
171
+ specification_version: 4
172
+ summary: CLI to manage a single global Caddy for multiple local Rails projects
173
+ test_files: []