lms-api 1.19.0 → 1.23.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 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