lms-api 1.19.0 → 1.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/canvas_api/builder.rb +76 -44
- data/lib/canvas_api/go_helpers.rb +604 -0
- data/lib/canvas_api/helpers.rb +17 -0
- data/lib/canvas_api/js_graphql_helpers.rb +8 -1
- data/lib/canvas_api/rb_graphql_helpers.rb +10 -24
- data/lib/canvas_api/render.rb +13 -2
- data/lib/canvas_api/templates/go_action.erb +241 -0
- data/lib/canvas_api/templates/go_struct.erb +44 -0
- data/lib/canvas_api/templates/rb_graphql_field.erb +2 -2
- data/lib/canvas_api/templates/rb_graphql_input_type.erb +1 -1
- data/lib/canvas_api/templates/rb_graphql_resolver.erb +1 -1
- data/lib/canvas_api/templates/rb_graphql_type.erb +1 -1
- data/lib/lms/canvas_urls.rb +93 -56
- data/lib/lms/course_ids_required.rb +17 -5
- data/lib/lms/version.rb +1 -1
- data/lib/tasks/canvas_api.rake +5 -1
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d7810e8e657f6cc9bdd4cd8c451ce96d829bfa79fed75389b4af081b0609ccc
|
4
|
+
data.tar.gz: 353814c783f580c8bfc8a6371dcf00d7acb837f5c31a8640f20e6c71d98cc291
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22d3736b78f0f4ee915469ef96ac27ba8f667a672fb9aa5a277f8b464914b5829bee30612547981b313497ca4d25baf8ca864765176b7d3a3cc265b6e0a2def7
|
7
|
+
data.tar.gz: e2f54b89aedab87683f2811497ac360b7adde2fdfee27ca59d191911200cc46b3776a6774b1d7fb5a2cc71d730f25fe501395ecabdc5c4ca9c180dd2f6c3006f
|
data/lib/canvas_api/builder.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require "canvas_api/render"
|
2
2
|
require "byebug"
|
3
|
+
require "set"
|
4
|
+
|
3
5
|
module CanvasApi
|
4
6
|
|
5
7
|
class Builder
|
@@ -11,7 +13,7 @@ module CanvasApi
|
|
11
13
|
# server_app_path: This is where all server side Javascript for accessing the Canvas API will be written.
|
12
14
|
# Currently, this is generating GraphQL for Javascript and Ruby
|
13
15
|
#
|
14
|
-
def self.build(project_root, client_app_path, server_app_path, elixir_app_path, rb_graphql_app_path)
|
16
|
+
def self.build(project_root, client_app_path, server_app_path, elixir_app_path, rb_graphql_app_path, go_app_path)
|
15
17
|
endpoint = "https://canvas.instructure.com/doc/api"
|
16
18
|
directory = HTTParty.get("#{endpoint}/api-docs.json")
|
17
19
|
|
@@ -30,20 +32,44 @@ module CanvasApi
|
|
30
32
|
nicknames = []
|
31
33
|
|
32
34
|
# Elixir has a default action that raises
|
33
|
-
lms_urls_ex << CanvasApi::Render.new("./templates/ex_default_action.erb", nil, nil, nil, nil, nil, nil, nil).render
|
35
|
+
lms_urls_ex << CanvasApi::Render.new("./templates/ex_default_action.erb", nil, nil, nil, nil, nil, nil, nil, "").render
|
34
36
|
|
35
37
|
directory["apis"].each do |api|
|
36
38
|
puts "Generating #{api['description']}"
|
37
|
-
|
39
|
+
api_path = api['path']
|
40
|
+
resource = HTTParty.get("#{endpoint}#{api_path}")
|
38
41
|
|
39
42
|
# HACK The canvas docs are missing one of the allowable value in modules
|
40
43
|
# TODO we might want to create a hacks class at some point to contain all these
|
41
|
-
if
|
44
|
+
if api_path == "/modules.json"
|
42
45
|
if !resource["models"]["CompletionRequirement"]["properties"]["type"]["allowableValues"]["values"].include?("must_mark_done")
|
43
46
|
resource["models"]["CompletionRequirement"]["properties"]["type"]["allowableValues"]["values"].push("must_mark_done")
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
50
|
+
models = []
|
51
|
+
resource["models"].map do |name, model|
|
52
|
+
models << name
|
53
|
+
|
54
|
+
if model["properties"] # Don't generate models without properties
|
55
|
+
models << CanvasApi::Render.new("./templates/js_graphql_model.erb", api, resource, nil, nil, nil, nil, model, api_path).render
|
56
|
+
end
|
57
|
+
|
58
|
+
# Generate one file for each Canvas graphql type
|
59
|
+
canvas_graphql_type_render = CanvasApi::Render.new("./templates/rb_graphql_type.erb", api, resource, nil, nil, nil, nil, model, api_path)
|
60
|
+
canvas_graphql_type_render.save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/#{model['id'].underscore.singularize}.rb")
|
61
|
+
|
62
|
+
canvas_graphql_input_render = CanvasApi::Render.new("./templates/rb_graphql_input_type.erb", api, resource, nil, nil, nil, nil, model, api_path)
|
63
|
+
canvas_graphql_input_render.save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/#{model['id'].underscore.singularize}_input.rb")
|
64
|
+
|
65
|
+
# Generate go structs
|
66
|
+
go_type_render = CanvasApi::Render.new("./templates/go_struct.erb", api, resource, nil, nil, nil, nil, model, api_path)
|
67
|
+
go_type_render.save("#{go_app_path}/models/#{model['id'].underscore}.go")
|
68
|
+
|
69
|
+
rb_forward_declarations << "class Canvas#{model['id'].singularize}Input < BaseInputObject;end"
|
70
|
+
rb_forward_declarations << "class Canvas#{model['id'].singularize} < BaseType;end"
|
71
|
+
end
|
72
|
+
|
47
73
|
constants = []
|
48
74
|
resource["apis"]&.each do |resource_api|
|
49
75
|
resource_api["operations"].each do |operation|
|
@@ -56,73 +82,79 @@ module CanvasApi
|
|
56
82
|
nicknames << nickname
|
57
83
|
operation["nickname"] = nickname
|
58
84
|
|
59
|
-
parameters = operation["parameters"]
|
60
|
-
constants << CanvasApi::Render.new("./templates/constant.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
61
|
-
lms_urls_rb << CanvasApi::Render.new("./templates/rb_url.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
62
|
-
lms_urls_js << CanvasApi::Render.new("./templates/js_url.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
63
|
-
lms_urls_ex << CanvasApi::Render.new("./templates/ex_url.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
64
|
-
lms_urls_ex << CanvasApi::Render.new("./templates/ex_action.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
85
|
+
parameters = filter_duplicate_parameters(operation["parameters"])
|
86
|
+
constants << CanvasApi::Render.new("./templates/constant.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
87
|
+
lms_urls_rb << CanvasApi::Render.new("./templates/rb_url.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
88
|
+
lms_urls_js << CanvasApi::Render.new("./templates/js_url.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
89
|
+
lms_urls_ex << CanvasApi::Render.new("./templates/ex_url.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
90
|
+
lms_urls_ex << CanvasApi::Render.new("./templates/ex_action.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
65
91
|
|
66
92
|
if parameters.detect{ |param| param["name"] == "course_id" && param["paramType"] == "path" }
|
67
|
-
course_ids_required_rb << CanvasApi::Render.new("./templates/course_id_required.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
93
|
+
course_ids_required_rb << CanvasApi::Render.new("./templates/course_id_required.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
94
|
+
end
|
95
|
+
|
96
|
+
begin
|
97
|
+
go_action_renderer = CanvasApi::Render.new("./templates/go_action.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path)
|
98
|
+
go_action_renderer.save("#{go_app_path}/requests/#{go_action_renderer.nickname}.go")
|
99
|
+
rescue => ex
|
100
|
+
byebug
|
101
|
+
puts ex
|
68
102
|
end
|
69
103
|
|
70
104
|
if operation["method"].casecmp("GET") == 0
|
71
|
-
js_graphql_queries << CanvasApi::Render.new("./templates/js_graphql_query.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
105
|
+
js_graphql_queries << CanvasApi::Render.new("./templates/js_graphql_query.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
72
106
|
|
73
107
|
# One file per Canvas graphql resolver
|
74
|
-
canvas_graphql_resolver_renderer = CanvasApi::Render.new("./templates/rb_graphql_resolver.erb", api, resource, resource_api, operation, parameters, nil, nil)
|
108
|
+
canvas_graphql_resolver_renderer = CanvasApi::Render.new("./templates/rb_graphql_resolver.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path)
|
75
109
|
canvas_graphql_resolver_renderer.save("#{rb_graphql_app_path}/lib/lms_graphql/resolvers/canvas/#{canvas_graphql_resolver_renderer.nickname}.rb")
|
76
|
-
rb_graphql_fields << CanvasApi::Render.new("./templates/rb_graphql_field.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
110
|
+
rb_graphql_fields << CanvasApi::Render.new("./templates/rb_graphql_field.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
77
111
|
else
|
78
|
-
js_graphql_mutations << CanvasApi::Render.new("./templates/js_graphql_mutation.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
112
|
+
js_graphql_mutations << CanvasApi::Render.new("./templates/js_graphql_mutation.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
79
113
|
|
80
|
-
rb_graphql_mutation_renderer = CanvasApi::Render.new("./templates/rb_graphql_mutation.erb", api, resource, resource_api, operation, parameters, nil, nil)
|
114
|
+
rb_graphql_mutation_renderer = CanvasApi::Render.new("./templates/rb_graphql_mutation.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path)
|
81
115
|
rb_graphql_mutation_renderer.save("#{rb_graphql_app_path}/lib/lms_graphql/mutations/canvas/#{rb_graphql_mutation_renderer.nickname}.rb")
|
82
|
-
rb_graphql_mutations << CanvasApi::Render.new("./templates/rb_graphql_mutation_include.erb", api, resource, resource_api, operation, parameters, nil, nil).render
|
116
|
+
rb_graphql_mutations << CanvasApi::Render.new("./templates/rb_graphql_mutation_include.erb", api, resource, resource_api, operation, parameters, nil, nil, api_path).render
|
83
117
|
end
|
84
118
|
|
85
119
|
end
|
86
120
|
end
|
87
121
|
|
88
|
-
resource["models"].map do |_name, model|
|
89
|
-
if model["properties"] # Don't generate models without properties
|
90
|
-
models << CanvasApi::Render.new("./templates/js_graphql_model.erb", api, resource, nil, nil, nil, nil, model).render
|
91
|
-
end
|
92
|
-
|
93
|
-
# Generate one file for each Canvas graphql type
|
94
|
-
canvas_graphql_type_render = CanvasApi::Render.new("./templates/rb_graphql_type.erb", api, resource, nil, nil, nil, nil, model)
|
95
|
-
canvas_graphql_type_render.save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/#{model['id'].underscore.singularize}.rb")
|
96
|
-
|
97
|
-
canvas_graphql_input_render = CanvasApi::Render.new("./templates/rb_graphql_input_type.erb", api, resource, nil, nil, nil, nil, model)
|
98
|
-
canvas_graphql_input_render.save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/#{model['id'].underscore.singularize}_input.rb")
|
99
|
-
|
100
|
-
rb_forward_declarations << "class Canvas#{model['id'].singularize}Input < BaseInputObject;end"
|
101
|
-
rb_forward_declarations << "class Canvas#{model['id'].singularize} < BaseType;end"
|
102
|
-
end
|
103
|
-
|
104
122
|
# Generate one file of constants for every LMS API
|
105
|
-
constants_renderer = CanvasApi::Render.new("./templates/constants.erb", api, resource, nil, nil, nil, constants, nil)
|
123
|
+
constants_renderer = CanvasApi::Render.new("./templates/constants.erb", api, resource, nil, nil, nil, constants, nil, api_path)
|
106
124
|
constants_renderer.save("#{client_app_path}/#{constants_renderer.name}.js")
|
107
125
|
end
|
108
126
|
|
109
|
-
CanvasApi::Render.new("./templates/rb_urls.erb", nil, nil, nil, nil, nil, lms_urls_rb, nil).save("#{project_root}/lib/lms/canvas_urls.rb")
|
110
|
-
CanvasApi::Render.new("./templates/js_urls.erb", nil, nil, nil, nil, nil, lms_urls_js, nil).save("#{server_app_path}/lib/canvas/urls.js")
|
127
|
+
CanvasApi::Render.new("./templates/rb_urls.erb", nil, nil, nil, nil, nil, lms_urls_rb, nil, "").save("#{project_root}/lib/lms/canvas_urls.rb")
|
128
|
+
CanvasApi::Render.new("./templates/js_urls.erb", nil, nil, nil, nil, nil, lms_urls_js, nil, "").save("#{server_app_path}/lib/canvas/urls.js")
|
111
129
|
|
112
130
|
# The elixir urls are sorted, to prevent linter errors
|
113
|
-
CanvasApi::Render.new("./templates/ex_urls.erb", nil, nil, nil, nil, nil, lms_urls_ex.sort, nil).save("#{elixir_app_path}/lib/canvas/actions.ex")
|
131
|
+
CanvasApi::Render.new("./templates/ex_urls.erb", nil, nil, nil, nil, nil, lms_urls_ex.sort, nil, "").save("#{elixir_app_path}/lib/canvas/actions.ex")
|
114
132
|
|
115
|
-
CanvasApi::Render.new("./templates/course_ids_required.erb", nil, nil, nil, nil, nil, course_ids_required_rb, nil).save("#{project_root}/lib/lms/course_ids_required.rb")
|
133
|
+
CanvasApi::Render.new("./templates/course_ids_required.erb", nil, nil, nil, nil, nil, course_ids_required_rb, nil, "").save("#{project_root}/lib/lms/course_ids_required.rb")
|
116
134
|
|
117
135
|
# GraphQL Javascript - still not complete
|
118
|
-
CanvasApi::Render.new("./templates/js_graphql_types.erb", nil, nil, nil, nil, nil, models.compact, nil).save("#{server_app_path}/lib/canvas/graphql_types.js")
|
119
|
-
CanvasApi::Render.new("./templates/js_graphql_queries.erb", nil, nil, nil, nil, nil, js_graphql_queries, nil).save("#{server_app_path}/lib/canvas/graphql_queries.js")
|
120
|
-
CanvasApi::Render.new("./templates/js_graphql_mutations.erb", nil, nil, nil, nil, nil, js_graphql_mutations, nil).save("#{server_app_path}/lib/canvas/graphql_mutations.js")
|
136
|
+
CanvasApi::Render.new("./templates/js_graphql_types.erb", nil, nil, nil, nil, nil, models.compact, nil, "").save("#{server_app_path}/lib/canvas/graphql_types.js")
|
137
|
+
CanvasApi::Render.new("./templates/js_graphql_queries.erb", nil, nil, nil, nil, nil, js_graphql_queries, nil, "").save("#{server_app_path}/lib/canvas/graphql_queries.js")
|
138
|
+
CanvasApi::Render.new("./templates/js_graphql_mutations.erb", nil, nil, nil, nil, nil, js_graphql_mutations, nil, "").save("#{server_app_path}/lib/canvas/graphql_mutations.js")
|
121
139
|
|
122
140
|
# GraphQL Ruby
|
123
|
-
CanvasApi::Render.new("./templates/rb_forward_declarations.erb", nil, nil, nil, nil, nil, rb_forward_declarations, nil).save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas_forward_declarations.rb")
|
124
|
-
CanvasApi::Render.new("./templates/rb_graphql_root_query.erb", nil, nil, nil, nil, nil, rb_graphql_fields, nil).save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/query_type.rb")
|
125
|
-
CanvasApi::Render.new("./templates/rb_graphql_mutations.erb", nil, nil, nil, nil, nil, rb_graphql_mutations, nil).save("#{rb_graphql_app_path}/lib/lms_graphql/mutations/canvas/mutations.rb")
|
141
|
+
CanvasApi::Render.new("./templates/rb_forward_declarations.erb", nil, nil, nil, nil, nil, rb_forward_declarations, nil, "").save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas_forward_declarations.rb")
|
142
|
+
CanvasApi::Render.new("./templates/rb_graphql_root_query.erb", nil, nil, nil, nil, nil, rb_graphql_fields, nil, "").save("#{rb_graphql_app_path}/lib/lms_graphql/types/canvas/query_type.rb")
|
143
|
+
CanvasApi::Render.new("./templates/rb_graphql_mutations.erb", nil, nil, nil, nil, nil, rb_graphql_mutations, nil, "").save("#{rb_graphql_app_path}/lib/lms_graphql/mutations/canvas/mutations.rb")
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.filter_duplicate_parameters(parameters)
|
147
|
+
# Canvas placed a deprecation warning
|
148
|
+
# at the bottom of their documentation
|
149
|
+
# for editing an assignment. This caused
|
150
|
+
# us to create two instances of that specific field
|
151
|
+
# this will filter that out (and ony other instances where they might do that)
|
152
|
+
names = Set.new
|
153
|
+
parameters.select do |param|
|
154
|
+
included = names.include? param["name"]
|
155
|
+
names.add(param["name"]) if !included
|
156
|
+
!included
|
157
|
+
end
|
126
158
|
end
|
127
159
|
end
|
128
160
|
end
|