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.
@@ -9,7 +9,7 @@ module CanvasApi
9
9
  if property["$ref"]
10
10
  canvas_name(property['$ref'], input_type)
11
11
  elsif property["allowableValues"]
12
- enum_class_name(model, name)
12
+ enum_class_name(model, name, input_type)
13
13
  else
14
14
  type = property["type"].downcase
15
15
  case type
@@ -41,11 +41,13 @@ module CanvasApi
41
41
  "[#{canvas_name(property["items"]["$ref"], input_type)}]"
42
42
  end
43
43
  else
44
- graphql_primitive(name, property["items"]["type"].downcase, property["items"]["format"])
44
+ array_type = graphql_primitive(name, property["items"]["type"].downcase, property["items"]["format"])
45
+ array_type = "[#{array_type}]" if array_type != "[ID]"
46
+ array_type
45
47
  end
46
48
  rescue
47
49
  puts "Unable to discover list type for '#{name}' ('#{property}'). Defaulting to String"
48
- type = "String"
50
+ type = "[String]"
49
51
  end
50
52
  type
51
53
  when "object"
@@ -104,11 +106,11 @@ module CanvasApi
104
106
  end
105
107
  end
106
108
 
107
- def enum_class_name(model, field_name)
108
- "#{model['id'].classify}#{field_name.classify}Enum"
109
+ def enum_class_name(model, field_name, input_type)
110
+ "#{model['id'].classify}#{input_type ? 'Input' : ''}#{field_name.classify}Enum"
109
111
  end
110
112
 
111
- def graphql_field_enums(model)
113
+ def graphql_field_enums(model, input_type = false)
112
114
  return unless model["properties"]
113
115
  enums = model["properties"].map do |name, property|
114
116
  if property["allowableValues"]
@@ -116,7 +118,7 @@ module CanvasApi
116
118
  "value \"#{value}\""
117
119
  end.join("\n ")
118
120
  <<-CODE
119
- class #{enum_class_name(model, name)} < ::GraphQL::Schema::Enum
121
+ class #{enum_class_name(model, name, input_type)} < ::GraphQL::Schema::Enum
120
122
  #{values}
121
123
  end
122
124
  CODE
@@ -198,7 +200,7 @@ field :#{name.underscore}, #{type}, "#{description}", resolver_method: :resolve_
198
200
  end
199
201
 
200
202
  def make_file_name(str)
201
- str.underscore.split("/").last.split("|").first.gsub("canvas_", "").gsub(" ", "_").strip.singularize
203
+ str.underscore.split("/").last.split("|").first.gsub(/^canvas_?/, "").gsub(" ", "_").strip.singularize
202
204
  end
203
205
 
204
206
  def require_from_operation(operation)
@@ -230,22 +232,6 @@ field :#{name.underscore}, #{type}, "#{description}", resolver_method: :resolve_
230
232
  str.gsub('"', "'")
231
233
  end
232
234
 
233
- def nested_arg(str)
234
- # TODO/HACK we are replacing values from the string here to get things to work for now.
235
- # However, removing these symbols means that the methods that use the arguments
236
- # generated herein will have bugs and be unusable.
237
- str.gsub("[", "_").
238
- gsub("]", "").
239
- gsub("*", "star").
240
- gsub("<", "_").
241
- gsub(">", "_").
242
- gsub("`", "").
243
- gsub("https://canvas.instructure.com/lti/", "").
244
- gsub("https://www.instructure.com/", "").
245
- gsub("https://purl.imsglobal.org/spec/lti/claim/", "").
246
- gsub(".", "")
247
- end
248
-
249
235
  def params_as_string(parameters, paramTypes)
250
236
  filtered = parameters.select{ |p| paramTypes.include?(p["paramType"]) }
251
237
  if filtered && !filtered.empty?
@@ -1,20 +1,26 @@
1
+ require "canvas_api/helpers"
1
2
  require "canvas_api/js_graphql_helpers"
2
3
  require "canvas_api/js_helpers"
3
4
  require "canvas_api/ruby_helpers"
4
5
  require "canvas_api/rb_graphql_helpers"
6
+ require "canvas_api/go_helpers"
5
7
  require "byebug"
8
+
6
9
  module CanvasApi
7
10
 
8
11
  class Render
12
+ include CanvasApi
9
13
  include CanvasApi::GraphQLHelpers
10
14
  include CanvasApi::JsHelpers
11
15
  include CanvasApi::RubyHelpers
16
+ include CanvasApi::GoHelpers
12
17
  attr_accessor :template, :description, :resource, :api_url, :operation,
13
18
  :args, :method, :api, :name, :resource_name, :resource_api,
14
19
  :nickname, :notes, :content, :summary, :model, :model_name
15
20
 
16
- def initialize(template, api, resource, resource_api, operation, parameters, content, model)
21
+ def initialize(template, api, resource, resource_api, operation, parameters, content, model, api_path)
17
22
  @template = File.read(File.expand_path(template, __dir__))
23
+ @api_path = api_path
18
24
  if api
19
25
  @api = api
20
26
  @name = @api["path"].gsub("/", "").gsub(".json", "")
@@ -47,7 +53,12 @@ module CanvasApi
47
53
  @summary = operation["summary"]
48
54
  end
49
55
  if parameters
50
- @parameters = parameters.map { |p| p.delete("description"); p }
56
+ # Keep a copy of full parameters for code that will include the description
57
+ @full_parameters = Marshal.load Marshal::dump(parameters)
58
+ # Strip description from parameters so that canvas_urls.rb
59
+ # doesn't error out on bad chars in the descriptions
60
+ tmp_params = Marshal.load Marshal::dump(parameters)
61
+ @parameters = tmp_params.map { |p| p.delete("description"); p }
51
62
  end
52
63
  @content = content
53
64
  @model = model
@@ -0,0 +1,241 @@
1
+ <% string_utils_required = @parameters.any?{|p| p["enum"] && !is_x_param?(p["name"]) } -%>
2
+ <% errors_required = @parameters.any?{|p| p["enum"] || is_required_field(p) }-%>
3
+ <% query_params = go_query_params(@parameters) -%>
4
+ <% path_params = go_path_params(@parameters) -%>
5
+ <% form_params = go_form_params(@parameters) -%>
6
+ <% return_type = go_return_type(operation) -%>
7
+ package requests
8
+
9
+ import (
10
+ <% if return_type && return_type != "bool" && return_type != "string" || @nickname == "assign_unassigned_members" || form_params -%>
11
+ "encoding/json"
12
+ <% end -%>
13
+ <% if path_params || errors_required -%>
14
+ "fmt"
15
+ <% end -%>
16
+ <% if !!return_type -%>
17
+ "io/ioutil"
18
+ <% end -%>
19
+ <% if is_paged?(@operation) -%>
20
+ "net/http"
21
+ <% end -%>
22
+ "net/url"
23
+ <% if return_type == "int64" -%>
24
+ "strconv"
25
+ <% end -%>
26
+ <% if errors_required || path_params -%>
27
+ "strings"
28
+ <% end -%>
29
+ <% if time_required?(@parameters) -%>
30
+ "time"
31
+ <% end -%>
32
+
33
+ <% if query_params || go_form_params(@parameters) -%>
34
+ "github.com/google/go-querystring/query"
35
+ <% end -%>
36
+
37
+ "github.com/atomicjolt/canvasapi"
38
+ <% if go_require_models(@parameters, @nickname, return_type)-%>
39
+ "github.com/atomicjolt/canvasapi/models"
40
+ <% end -%>
41
+ <% if string_utils_required -%>
42
+ "github.com/atomicjolt/string_utils"
43
+ <% end -%>
44
+ )
45
+
46
+ // <%= go_name(@nickname) %> <%= @notes %>
47
+ // https://canvas.instructure.com/doc/api<%=@api_path.gsub(".json", ".html")%>
48
+ <% if params = go_path_params(@full_parameters)-%>
49
+ //
50
+ // Path Parameters:
51
+ // <%= params.map { |p| go_parameter_doc(p) }.join("\n// ") %>
52
+ <% end -%>
53
+ <% if params = go_query_params(@full_parameters) -%>
54
+ //
55
+ // Query Parameters:
56
+ // <%= params.map { |p| go_parameter_doc(p) }.join("\n// ") %>
57
+ <% end -%>
58
+ <% if params = go_form_params(@full_parameters) -%>
59
+ //
60
+ // Form Parameters:
61
+ // <%= params.map { |p| go_parameter_doc(p) }.join("\n// ") %>
62
+ <% end -%>
63
+ //
64
+ type <%= struct_name(@nickname) %> struct {
65
+ <% if params = go_path_params(@parameters) -%>
66
+ Path struct {
67
+ <%= go_struct_fields(@nickname, params) %>
68
+ } `json:"path"`
69
+ <% end -%>
70
+
71
+ <% if query_params -%>
72
+ Query struct {
73
+ <%= go_struct_fields(@nickname, query_params) %>
74
+ } `json:"query"`
75
+ <% end -%>
76
+
77
+ <% if form_params -%>
78
+ Form struct {
79
+ <%= go_struct_fields(@nickname, form_params) %>
80
+ } `json:"form"`
81
+ <% end -%>
82
+ }
83
+
84
+ func (t *<%= struct_name(@nickname) %>) GetMethod() string {
85
+ return "<%=@method%>"
86
+ }
87
+
88
+ func (t *<%= struct_name(@nickname) %>) GetURLPath() string {
89
+ <% if params = go_path_params(@parameters) -%>
90
+ path := "<%= go_api_url %>"
91
+ <% params.each do |p| -%>
92
+ path = strings.ReplaceAll(path, "{<%=p["name"]%>}", fmt.Sprintf("%v", t.Path.<%=go_name(p["name"])%>))
93
+ <% end -%>
94
+ return path
95
+ <% else -%>
96
+ return ""
97
+ <% end -%>
98
+ }
99
+
100
+ func (t *<%= struct_name(@nickname) %>) GetQuery()(string, error) {
101
+ <% if query_params -%>
102
+ v, err := query.Values(t.Query)
103
+ if err != nil {
104
+ return "", err
105
+ }
106
+ return v.Encode(), nil
107
+ <% else -%>
108
+ return "", nil
109
+ <% end -%>
110
+ }
111
+
112
+ func (t *<%= struct_name(@nickname) %>) GetBody() (url.Values, error) {
113
+ <% if form_params -%>
114
+ return query.Values(t.Form)
115
+ <% else -%>
116
+ return nil, nil
117
+ <% end -%>
118
+ }
119
+
120
+ func (t *<%= struct_name(@nickname) %>) GetJSON() ([]byte, error) {
121
+ <% if form_params -%>
122
+ j, err := json.Marshal(t.Form)
123
+ if err != nil {
124
+ return nil, nil
125
+ }
126
+ return j, nil
127
+ <% else -%>
128
+ return nil, nil
129
+ <% end -%>
130
+ }
131
+
132
+ func (t *<%= struct_name(@nickname) %>) HasErrors() error {
133
+ <% if errors_required -%>
134
+ errs := []string{}
135
+ <% end -%>
136
+ <% @parameters.each do |p| -%>
137
+ <% type = go_type(p["name"], p) -%>
138
+ <% if is_required_field(p) -%>
139
+ <% if type == "time.Time" -%>
140
+ if t.<%=go_param_path(p)%>.IsZero() {
141
+ errs = append(errs, "'<%=go_param_path(p)%>' is required")
142
+ }
143
+ <% else -%>
144
+ if t.<%=go_param_path(p)%> == <%=go_param_empty_value(p)%> {
145
+ errs = append(errs, "'<%=go_param_path(p)%>' is required")
146
+ }
147
+ <% end -%>
148
+ <% end -%>
149
+ <% if p["enum"] && ["string", "[]string"].include?(type) -%>
150
+ <% if p["type"] == "array" || type == "[]string" -%>
151
+ for _, v := range t.<%=go_param_path(p)%> {
152
+ if v != "" && !string_utils.Include([]string{"<%= p["enum"].join("\", \"") %>"}, v) {
153
+ errs = append(errs, "<%=go_name(p["name"])%> must be one of <%= p["enum"].join(", ") %>")
154
+ }
155
+ }
156
+ <% elsif !is_x_param?(p["name"]) -%>
157
+ if t.<%=go_param_path(p)%> != "" && !string_utils.Include([]string{"<%= p["enum"].join("\", \"") %>"}, t.<%=go_param_path(p)%>) {
158
+ errs = append(errs, "<%=go_name(p["name"])%> must be one of <%= p["enum"].join(", ") %>")
159
+ }
160
+ <% end -%>
161
+ <% end -%>
162
+ <% end -%>
163
+ <% if errors_required -%>
164
+ if len(errs) > 0 {
165
+ return fmt.Errorf(strings.Join(errs, ", "))
166
+ }
167
+ <% end -%>
168
+ return nil
169
+ }
170
+
171
+ func (t *<%= struct_name(@nickname) %>) Do(c *canvasapi.Canvas<%=next_param(@operation)%>) <%=go_do_return_value(@operation, @nickname)%> {
172
+ <% ret_type = go_return_type(@operation, true) -%>
173
+ <% if ret_type -%>
174
+ <% if is_paged?(@operation) -%>
175
+ var err error
176
+ var response *http.Response
177
+ if next != nil {
178
+ response, err = c.Send(next, t.GetMethod(), nil)
179
+ } else {
180
+ response, err = c.SendRequest(t)
181
+ }
182
+
183
+ if err != nil {
184
+ return nil, nil, err
185
+ }
186
+ <% else -%>
187
+ response, err := c.SendRequest(t)
188
+ <% end -%>
189
+ <% else -%>
190
+ _, err := c.SendRequest(t)
191
+ <% end -%>
192
+ if err != nil {
193
+ <%= go_do_return_statement(operation, @nickname) %>
194
+ }
195
+
196
+ <% if ret_type -%>
197
+ body, err := ioutil.ReadAll(response.Body)
198
+ response.Body.Close()
199
+ if err != nil {
200
+ <%= go_do_return_statement(operation, @nickname) %>
201
+ }
202
+ <% if @nickname == "assign_unassigned_members" -%>
203
+ groupMembership := models.GroupMembership{}
204
+ progress := models.Progress{}
205
+ if t.Form.Sync {
206
+ err = json.Unmarshal(body, &groupMembership)
207
+ if err != nil {
208
+ return nil, nil, err
209
+ }
210
+ } else {
211
+ err = json.Unmarshal(body, &progress)
212
+ if err != nil {
213
+ return nil, nil, err
214
+ }
215
+ }
216
+ <% elsif ret_type == "bool" -%>
217
+ ret := string(body) == "true"
218
+ <% elsif ret_type == "string" -%>
219
+ ret := string(body)
220
+ <% elsif ret_type == "int64" -%>
221
+ ret := strconv.ParseInt(string(body), 10, 64)
222
+ <% else -%>
223
+ ret := <%=ret_type%>
224
+ err = json.Unmarshal(body, &ret)
225
+ if err != nil {
226
+ <%= go_do_return_statement(operation, @nickname) %>
227
+ }
228
+ <% end -%>
229
+ <% end -%>
230
+
231
+ <% if @operation["type"] == "array" -%>
232
+ pagedResource, err := canvasapi.ExtractPagedResource(response.Header)
233
+ if err != nil {
234
+ return nil, nil, err
235
+ }
236
+ <% end -%>
237
+
238
+ <%= go_do_final_return_statement(operation, @nickname) %>
239
+ }
240
+
241
+ <%= go_render_child_structs %>
@@ -0,0 +1,44 @@
1
+ <%
2
+ fields, time_required = struct_fields(@model, @resource_name)
3
+ field_validations = go_field_validation(@model)
4
+ -%>
5
+ package models
6
+
7
+ <% if time_required || field_validations -%>
8
+ import (
9
+ <% if time_required -%>
10
+ "time"
11
+ <% end -%>
12
+ <% if (field_validations && field_validations.length > 0) -%>
13
+ "fmt"
14
+
15
+ "github.com/atomicjolt/string_utils"
16
+ <% end -%>
17
+ )
18
+ <% end -%>
19
+
20
+ type <%=struct_name(@model['id'])%> struct {
21
+ <%=fields&.join("\n ")%>
22
+ }
23
+
24
+ func (t *<%=struct_name(@model['id'])%>) HasErrors() error {
25
+ <% if field_validations && field_validations.length > 0 -%>
26
+ var s []string
27
+ errs := []string{}
28
+ <%field_validations.each do |name, prop|-%>
29
+ s = []string{<%=prop[:values].join(",")%>}
30
+ <% if prop[:type] == "array" %>
31
+ for _, v := range t.<%=go_name(name)%> {
32
+ if v != "" && !string_utils.Include(s, v) {
33
+ errs = append(errs, fmt.Sprintf("expected '<%=go_name(name)%>' to be one of %v", s))
34
+ }
35
+ }
36
+ <% else -%>
37
+ if t.<%=go_name(name)%> != "" && !string_utils.Include(s, t.<%=go_name(name)%>) {
38
+ errs = append(errs, fmt.Sprintf("expected '<%=go_name(name)%>' to be one of %v", s))
39
+ }
40
+ <% end -%>
41
+ <% end -%>
42
+ <% end -%>
43
+ return nil
44
+ }
@@ -1,3 +1,3 @@
1
1
  field :<%= @nickname %>,
2
- resolver: LMSGraphQL::Resolvers::Canvas::<%= @nickname.classify %>,
3
- description: "<%= @summary %>. <%= @notes.gsub(/\n+/, " ").gsub("//", " ").gsub('"', "'") %>"
2
+ resolver: LMSGraphQL::Resolvers::Canvas::<%= graphql_resolver_class(@nickname) %>,
3
+ description: "<%= @summary %>. <%= @notes.gsub(/\n+/, " ").gsub("//", " ").gsub('"', "'") %>"
@@ -4,8 +4,8 @@ require_relative "../canvas_base_input_type"
4
4
  module LMSGraphQL
5
5
  module Types
6
6
  module Canvas
7
- <%=graphql_field_enums(@model)-%>
8
7
  class Canvas<%=@model['id'].singularize%>Input < BaseInputObject
8
+ <%=graphql_field_enums(@model, true)-%>
9
9
  description "<%=@description%>. API Docs: https://canvas.instructure.com/doc/api/<%=@name%>.html"
10
10
  <%=graphql_fields(@model, @resource_name, true, true).join(" ")%>
11
11
  end
@@ -4,7 +4,7 @@ require_relative "../canvas_base_resolver"
4
4
  module LMSGraphQL
5
5
  module Resolvers
6
6
  module Canvas
7
- class <%= @nickname.classify %> < CanvasBaseResolver
7
+ class <%= graphql_resolver_class(@nickname) %> < CanvasBaseResolver
8
8
  type <%= type_from_operation(operation) %>, null: false
9
9
  <% if operation["type"] == "array"
10
10
  %> argument :get_all, Boolean, required: false
@@ -4,8 +4,8 @@ require_relative "../canvas_base_type"
4
4
  module LMSGraphQL
5
5
  module Types
6
6
  module Canvas
7
- <%=graphql_field_enums(@model)-%>
8
7
  class Canvas<%=@model['id'].singularize%> < BaseType
8
+ <%=graphql_field_enums(@model)-%>
9
9
  description "<%=@description%>. API Docs: https://canvas.instructure.com/doc/api/<%=@name%>.html"
10
10
  <%=graphql_fields(@model, @resource_name).join(" ")%>
11
11
  end