camille 0.1.0 → 0.3.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 +4 -4
- data/Gemfile.lock +1 -9
- data/lib/camille/code_generator.rb +1 -5
- data/lib/camille/controller_extension.rb +0 -3
- data/lib/camille/generators/install_generator.rb +23 -0
- data/lib/camille/generators/schema_generator.rb +14 -0
- data/lib/camille/generators/templates/configuration.rb +6 -0
- data/lib/camille/generators/templates/schema_example.rb +35 -0
- data/lib/camille/generators/templates/schema_template.erb +14 -0
- data/lib/camille/generators/templates/type_example.rb +10 -0
- data/lib/camille/generators/templates/type_template.erb +9 -0
- data/lib/camille/generators/type_generator.rb +14 -0
- data/lib/camille/loader.rb +38 -53
- data/lib/camille/main_controller.rb +9 -0
- data/lib/camille/railtie.rb +14 -2
- data/lib/camille/schema.rb +0 -10
- data/lib/camille/type.rb +0 -9
- data/lib/camille/version.rb +1 -1
- data/lib/camille.rb +6 -0
- metadata +11 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5779c76d0ca3c695e1e15d0870d94be5739449f7ad1b9422ab9944d139f3a6d1
|
4
|
+
data.tar.gz: 855906b19324060e4fb8578451e1fd77f692918f6722a81b9f3fbdc5cbf48fd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e555aebf740ecd06dcf96928a3aeafe414430a7d439a83679da90d2e60e23a97cd28bc583a473ddab76c60275e31668b76f9220ca2278c21ecceb8f2f11743fa
|
7
|
+
data.tar.gz: 00bf823aa9f394c1198cd492f42cd716b8bd59c08fe7e704df64aa92cdb927198ad87761f867de9b59153cba96490190292296755ef1642bd9c759820b00ecc0
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
camille (0.
|
5
|
-
listen (~> 3.3)
|
4
|
+
camille (0.3.0)
|
6
5
|
rails (>= 6.1, < 8)
|
7
6
|
|
8
7
|
GEM
|
@@ -79,14 +78,10 @@ GEM
|
|
79
78
|
date (3.3.3)
|
80
79
|
diff-lcs (1.5.0)
|
81
80
|
erubi (1.12.0)
|
82
|
-
ffi (1.15.5)
|
83
81
|
globalid (1.1.0)
|
84
82
|
activesupport (>= 5.0)
|
85
83
|
i18n (1.12.0)
|
86
84
|
concurrent-ruby (~> 1.0)
|
87
|
-
listen (3.8.0)
|
88
|
-
rb-fsevent (~> 0.10, >= 0.10.3)
|
89
|
-
rb-inotify (~> 0.9, >= 0.9.10)
|
90
85
|
loofah (2.19.1)
|
91
86
|
crass (~> 1.0.2)
|
92
87
|
nokogiri (>= 1.5.9)
|
@@ -142,9 +137,6 @@ GEM
|
|
142
137
|
thor (~> 1.0)
|
143
138
|
zeitwerk (~> 2.5)
|
144
139
|
rake (13.0.6)
|
145
|
-
rb-fsevent (0.11.2)
|
146
|
-
rb-inotify (0.10.1)
|
147
|
-
ffi (~> 1.0)
|
148
140
|
rspec (3.12.0)
|
149
141
|
rspec-core (~> 3.12.0)
|
150
142
|
rspec-expectations (~> 3.12.0)
|
@@ -4,6 +4,7 @@ module Camille
|
|
4
4
|
module CodeGenerator
|
5
5
|
def self.generate_ts
|
6
6
|
io = StringIO.new
|
7
|
+
io.puts "// This file is automatically generated."
|
7
8
|
io.puts Camille::Configuration.ts_header
|
8
9
|
io.puts
|
9
10
|
Camille::Types.literal_lines.each do |line|
|
@@ -17,10 +18,5 @@ module Camille
|
|
17
18
|
io.string
|
18
19
|
end
|
19
20
|
|
20
|
-
def self.generate_ts_file
|
21
|
-
if Camille::Configuration.ts_location
|
22
|
-
File.open(Camille::Configuration.ts_location, 'w'){|f| f.write generate_ts}
|
23
|
-
end
|
24
|
-
end
|
25
21
|
end
|
26
22
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Camille
|
3
|
+
module Generators
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path("templates", __dir__)
|
6
|
+
|
7
|
+
desc 'install camille'
|
8
|
+
|
9
|
+
def copy_configuration_file
|
10
|
+
copy_file "configuration.rb", "config/camille/configuration.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_type_example
|
14
|
+
copy_file "type_example.rb", "config/camille/types/example.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_schema_example
|
18
|
+
copy_file "schema_example.rb", "config/camille/schemas/examples.rb"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Camille
|
3
|
+
module Generators
|
4
|
+
class SchemaGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path("templates", __dir__)
|
6
|
+
|
7
|
+
desc 'generate camille schema'
|
8
|
+
|
9
|
+
def generate_type_file
|
10
|
+
template 'schema_template.erb', "config/camille/schemas/#{@name}.rb"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
using Camille::CoreExt
|
2
|
+
|
3
|
+
class Camille::Schemas::Examples < Camille::Schema
|
4
|
+
include Camille::Types
|
5
|
+
|
6
|
+
get :find do
|
7
|
+
params(
|
8
|
+
id: Number
|
9
|
+
)
|
10
|
+
|
11
|
+
response(
|
12
|
+
example?: Example
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
get :list do
|
17
|
+
response(
|
18
|
+
examples: Example[]
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
post :update do
|
23
|
+
params(
|
24
|
+
id: Number,
|
25
|
+
example: Example
|
26
|
+
)
|
27
|
+
|
28
|
+
response(
|
29
|
+
success: Boolean,
|
30
|
+
errors: {
|
31
|
+
message: String
|
32
|
+
}[]
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Camille
|
3
|
+
module Generators
|
4
|
+
class TypeGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path("templates", __dir__)
|
6
|
+
|
7
|
+
desc 'generate camille type'
|
8
|
+
|
9
|
+
def generate_type_file
|
10
|
+
template 'type_template.erb', "config/camille/types/#{@name}.rb"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/camille/loader.rb
CHANGED
@@ -10,8 +10,25 @@ module Camille
|
|
10
10
|
synchronize do
|
11
11
|
loader = Zeitwerk::Loader.new
|
12
12
|
loader.enable_reloading if !app.config.cache_classes
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
types_dir = "#{app.root}/config/camille/types"
|
15
|
+
schemas_dir = "#{app.root}/config/camille/schemas"
|
16
|
+
|
17
|
+
if Dir.exist? types_dir
|
18
|
+
loader.push_dir types_dir, namespace: Camille::Types
|
19
|
+
else
|
20
|
+
unless inside_generator?
|
21
|
+
puts "[Camille Warning] Expected folder `config/camille/types`. Run `rails g camille:install` to fix it."
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if Dir.exist? schemas_dir
|
26
|
+
loader.push_dir schemas_dir, namespace: Camille::Schemas
|
27
|
+
else
|
28
|
+
unless inside_generator?
|
29
|
+
puts "[Camille Warning] Expected folder `config/camille/schemas`. Run `rails g camille:install` to fix it."
|
30
|
+
end
|
31
|
+
end
|
15
32
|
|
16
33
|
loader.setup
|
17
34
|
@zeitwerk_loader = loader
|
@@ -19,21 +36,9 @@ module Camille
|
|
19
36
|
|
20
37
|
eager_load
|
21
38
|
construct_controller_name_to_schema_map
|
22
|
-
Camille::CodeGenerator.generate_ts_file
|
23
39
|
end
|
24
40
|
end
|
25
41
|
|
26
|
-
def eager_load
|
27
|
-
@eager_loading = true
|
28
|
-
load @configuration_location
|
29
|
-
@zeitwerk_loader.eager_load
|
30
|
-
@eager_loading = false
|
31
|
-
end
|
32
|
-
|
33
|
-
def eager_loading?
|
34
|
-
@eager_loading
|
35
|
-
end
|
36
|
-
|
37
42
|
def reload_types_and_schemas
|
38
43
|
synchronize do
|
39
44
|
Camille::Loader.loaded_types.clear
|
@@ -41,14 +46,10 @@ module Camille
|
|
41
46
|
@zeitwerk_loader.reload
|
42
47
|
eager_load
|
43
48
|
construct_controller_name_to_schema_map
|
44
|
-
Camille::CodeGenerator.generate_ts_file
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
48
52
|
def register_routes router_context
|
49
|
-
if exception = Camille::Loader.exception
|
50
|
-
raise exception
|
51
|
-
end
|
52
53
|
Camille::Loader.loaded_schemas.each do |schema|
|
53
54
|
schema.endpoints.each do |name, endpoint|
|
54
55
|
router_context.public_send(endpoint.verb, endpoint.path, controller: schema.path.gsub(/^\//, ''), action: endpoint.name, as: false)
|
@@ -74,48 +75,32 @@ module Camille
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
private
|
79
|
+
def eager_load
|
80
|
+
if File.exist?(@configuration_location)
|
81
|
+
load @configuration_location
|
82
|
+
else
|
83
|
+
unless inside_generator?
|
84
|
+
puts "[Camille Warning] Expected file `config/camille/configuration.rb`. Run `rails g camille:install` to fix it."
|
85
|
+
end
|
83
86
|
end
|
87
|
+
@zeitwerk_loader.eager_load
|
84
88
|
end
|
85
|
-
end
|
86
89
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
# just for spec
|
95
|
-
@last_reload = Time.now
|
96
|
-
rescue Exception => e
|
97
|
-
Rails.logger.error e
|
98
|
-
@exception = e
|
90
|
+
def construct_controller_name_to_schema_map
|
91
|
+
synchronize do
|
92
|
+
controller_name_to_schema_map.clear
|
93
|
+
loaded_schemas.each do |schema|
|
94
|
+
controller_class_name = "#{schema.klass_name}Controller"
|
95
|
+
controller_name_to_schema_map[controller_class_name] = schema
|
96
|
+
end
|
99
97
|
end
|
100
98
|
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def exception
|
104
|
-
synchronize do
|
105
|
-
@exception
|
106
|
-
end
|
107
|
-
end
|
108
99
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
listener = Listen.to("#{app.root}/config/camille") do |changed|
|
113
|
-
#puts "Change detected. Camille reloading..."
|
114
|
-
Camille::Loader.reload
|
115
|
-
end
|
116
|
-
listener.start
|
100
|
+
def inside_generator?
|
101
|
+
# https://stackoverflow.com/a/53963584
|
102
|
+
!(Rails.const_defined?(:Server) || Rails.const_defined?(:Console))
|
117
103
|
end
|
118
|
-
end
|
119
104
|
|
120
105
|
end
|
121
106
|
|
data/lib/camille/railtie.rb
CHANGED
@@ -8,16 +8,28 @@ module Camille
|
|
8
8
|
ActionController::Base.include(Camille::ControllerExtension)
|
9
9
|
|
10
10
|
Camille::Loader.setup_zeitwerk_loader(app)
|
11
|
-
Camille::Loader.setup_listen(app)
|
12
11
|
|
13
12
|
app.routes.prepend do
|
13
|
+
if Rails.env.development?
|
14
|
+
get '/camille/endpoints.ts' => 'camille/main#endpoints_ts'
|
15
|
+
end
|
16
|
+
|
14
17
|
Camille::Loader.register_routes(self)
|
15
18
|
end
|
16
19
|
|
20
|
+
dir = "#{Rails.root}/config/camille"
|
21
|
+
|
22
|
+
update_checker = ActiveSupport::FileUpdateChecker.new([], {dir => ['rb']}) do
|
23
|
+
Camille::Loader.reload_types_and_schemas
|
24
|
+
end
|
25
|
+
|
26
|
+
app.reloaders << update_checker
|
27
|
+
|
17
28
|
app.reloader.to_run do
|
18
29
|
require_unload_lock!
|
19
|
-
|
30
|
+
update_checker.execute_if_updated
|
20
31
|
end
|
32
|
+
|
21
33
|
end
|
22
34
|
|
23
35
|
end
|
data/lib/camille/schema.rb
CHANGED
@@ -2,20 +2,10 @@ module Camille
|
|
2
2
|
class Schema
|
3
3
|
class AlreadyDefinedError < ::ArgumentError; end
|
4
4
|
|
5
|
-
include Camille::Types
|
6
|
-
|
7
5
|
def self.endpoints
|
8
6
|
@endpoints ||= {}
|
9
7
|
end
|
10
8
|
|
11
|
-
def self.const_missing name
|
12
|
-
if Camille::Loader.eager_loading?
|
13
|
-
Camille::Types.const_get(name)
|
14
|
-
else
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
9
|
def self.path
|
20
10
|
"/#{ActiveSupport::Inflector.underscore klass_name}"
|
21
11
|
end
|
data/lib/camille/type.rb
CHANGED
@@ -2,7 +2,6 @@ module Camille
|
|
2
2
|
# This class represents all custom types defined by the user.
|
3
3
|
class Type < BasicType
|
4
4
|
class NotImplementedError < ::NotImplementedError; end
|
5
|
-
include Camille::Types
|
6
5
|
|
7
6
|
attr_reader :underlying
|
8
7
|
|
@@ -30,14 +29,6 @@ module Camille
|
|
30
29
|
self.class.klass_name.gsub(/::/, '_')
|
31
30
|
end
|
32
31
|
|
33
|
-
def self.const_missing name
|
34
|
-
if Camille::Loader.eager_loading?
|
35
|
-
Camille::Types.const_get(name)
|
36
|
-
else
|
37
|
-
super
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
32
|
def self.inherited klass
|
42
33
|
Camille::Loader.loaded_types << klass
|
43
34
|
end
|
data/lib/camille/version.rb
CHANGED
data/lib/camille.rb
CHANGED
@@ -28,6 +28,12 @@ require_relative "camille/controller_extension"
|
|
28
28
|
require_relative "camille/loader"
|
29
29
|
require_relative "camille/configuration"
|
30
30
|
require_relative "camille/code_generator"
|
31
|
+
require_relative "camille/main_controller"
|
32
|
+
|
33
|
+
require "rails/generators"
|
34
|
+
require_relative "camille/generators/install_generator"
|
35
|
+
require_relative "camille/generators/type_generator"
|
36
|
+
require_relative "camille/generators/schema_generator"
|
31
37
|
|
32
38
|
module Camille
|
33
39
|
class Error < StandardError; end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: camille
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 辻彩
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,20 +30,6 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '8'
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: listen
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '3.3'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '3.3'
|
47
33
|
description: ''
|
48
34
|
email:
|
49
35
|
- cichol@live.cn
|
@@ -65,8 +51,17 @@ files:
|
|
65
51
|
- lib/camille/controller_extension.rb
|
66
52
|
- lib/camille/core_ext.rb
|
67
53
|
- lib/camille/endpoint.rb
|
54
|
+
- lib/camille/generators/install_generator.rb
|
55
|
+
- lib/camille/generators/schema_generator.rb
|
56
|
+
- lib/camille/generators/templates/configuration.rb
|
57
|
+
- lib/camille/generators/templates/schema_example.rb
|
58
|
+
- lib/camille/generators/templates/schema_template.erb
|
59
|
+
- lib/camille/generators/templates/type_example.rb
|
60
|
+
- lib/camille/generators/templates/type_template.erb
|
61
|
+
- lib/camille/generators/type_generator.rb
|
68
62
|
- lib/camille/line.rb
|
69
63
|
- lib/camille/loader.rb
|
64
|
+
- lib/camille/main_controller.rb
|
70
65
|
- lib/camille/railtie.rb
|
71
66
|
- lib/camille/schema.rb
|
72
67
|
- lib/camille/schemas.rb
|