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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1805d238f710f65d3770e78ef92377b207dff255de5d8d6293f77a76fd8ebbd1
4
- data.tar.gz: fe0fa0d016785c8370bbcd3c8df3a454204bfb9a165fbd3cca2146643346e9e0
3
+ metadata.gz: 1d7810e8e657f6cc9bdd4cd8c451ce96d829bfa79fed75389b4af081b0609ccc
4
+ data.tar.gz: 353814c783f580c8bfc8a6371dcf00d7acb837f5c31a8640f20e6c71d98cc291
5
5
  SHA512:
6
- metadata.gz: c354b877726e65131fbc8bdfe7b396aa5fbd825539f96e503dac63b4509f6bc0b098a23a680ecbbf48532625cc57c174292a69d95ea88e989572dcc810bc0e14
7
- data.tar.gz: ae08736c6b47a134678fc916d5045d638e4c7a3249892f2e7370ff78b3bf5b4336ae24afae114f0f93b896a54bb06927839240d95b3cede2c9967f5227969557
6
+ metadata.gz: 22d3736b78f0f4ee915469ef96ac27ba8f667a672fb9aa5a277f8b464914b5829bee30612547981b313497ca4d25baf8ca864765176b7d3a3cc265b6e0a2def7
7
+ data.tar.gz: e2f54b89aedab87683f2811497ac360b7adde2fdfee27ca59d191911200cc46b3776a6774b1d7fb5a2cc71d730f25fe501395ecabdc5c4ca9c180dd2f6c3006f
@@ -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
- resource = HTTParty.get("#{endpoint}#{api['path']}")
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 api['path'] == "/modules.json"
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