bearcat 1.5.40 → 1.6.1

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.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -0
  3. data/bearcat.gemspec +1 -1
  4. data/lib/badgrcat/api_array.rb +0 -0
  5. data/lib/badgrcat/version.rb +0 -0
  6. data/lib/bearcat/client/account_reports.rb +0 -0
  7. data/lib/bearcat/client/accounts.rb +0 -0
  8. data/lib/bearcat/client/analytics.rb +0 -0
  9. data/lib/bearcat/client/assignment_groups.rb +0 -0
  10. data/lib/bearcat/client/assignments.rb +0 -0
  11. data/lib/bearcat/client/blueprint_courses.rb +0 -0
  12. data/lib/bearcat/client/calendar_events.rb +0 -0
  13. data/lib/bearcat/client/canvas_files.rb +0 -0
  14. data/lib/bearcat/client/conferences.rb +0 -0
  15. data/lib/bearcat/client/content_exports.rb +0 -0
  16. data/lib/bearcat/client/content_migrations.rb +0 -0
  17. data/lib/bearcat/client/conversations.rb +0 -0
  18. data/lib/bearcat/client/custom_gradebook_columns.rb +0 -0
  19. data/lib/bearcat/client/discussions.rb +0 -0
  20. data/lib/bearcat/client/enrollments.rb +0 -0
  21. data/lib/bearcat/client/external_tools.rb +0 -0
  22. data/lib/bearcat/client/file_helper.rb +0 -0
  23. data/lib/bearcat/client/files.rb +0 -0
  24. data/lib/bearcat/client/folders.rb +0 -0
  25. data/lib/bearcat/client/group_categories.rb +0 -0
  26. data/lib/bearcat/client/group_memberships.rb +0 -0
  27. data/lib/bearcat/client/groups.rb +0 -0
  28. data/lib/bearcat/client/learning_outcomes.rb +0 -0
  29. data/lib/bearcat/client/logins.rb +0 -0
  30. data/lib/bearcat/client/module_items.rb +0 -0
  31. data/lib/bearcat/client/modules.rb +0 -0
  32. data/lib/bearcat/client/o_auth2.rb +0 -0
  33. data/lib/bearcat/client/outcome_groups.rb +0 -0
  34. data/lib/bearcat/client/outcome_imports.rb +0 -0
  35. data/lib/bearcat/client/outcomes.rb +0 -0
  36. data/lib/bearcat/client/pages.rb +0 -0
  37. data/lib/bearcat/client/progresses.rb +0 -0
  38. data/lib/bearcat/client/quizzes.rb +0 -0
  39. data/lib/bearcat/client/reports.rb +0 -2
  40. data/lib/bearcat/client/roles.rb +0 -0
  41. data/lib/bearcat/client/rubric.rb +0 -0
  42. data/lib/bearcat/client/rubric_assessment.rb +0 -0
  43. data/lib/bearcat/client/rubric_association.rb +0 -0
  44. data/lib/bearcat/client/search.rb +0 -0
  45. data/lib/bearcat/client/sections.rb +0 -0
  46. data/lib/bearcat/client/sis_imports.rb +0 -0
  47. data/lib/bearcat/client/tabs.rb +0 -0
  48. data/lib/bearcat/client.rb +1 -2
  49. data/lib/bearcat/client_module.rb +0 -0
  50. data/lib/bearcat/rate_limiting/functions.lua +11 -0
  51. data/lib/bearcat/rate_limiting/increment_bucket.lua +0 -0
  52. data/lib/bearcat/rate_limiting/redis_script.rb +0 -0
  53. data/lib/bearcat/rate_limiting.rb +0 -0
  54. data/lib/bearcat/version.rb +1 -1
  55. data/lib/bearcat.rb +4 -8
  56. data/lib/catalogcat/api_array.rb +0 -0
  57. data/lib/catalogcat/client/catalogs.rb +0 -0
  58. data/lib/catalogcat/client/certificates.rb +0 -0
  59. data/lib/catalogcat/client/courses.rb +0 -0
  60. data/lib/catalogcat/client/email_domain_sets.rb +0 -0
  61. data/lib/catalogcat/client/enrollments.rb +0 -0
  62. data/lib/catalogcat/client/orders.rb +0 -0
  63. data/lib/catalogcat/client/user_registrations.rb +0 -0
  64. data/lib/catalogcat/client.rb +0 -0
  65. data/lib/catalogcat/version.rb +0 -0
  66. data/lib/catalogcat.rb +0 -0
  67. data/spec/bearcat/api_array_spec.rb +0 -0
  68. data/spec/bearcat/client/accounts_spec.rb +0 -0
  69. data/spec/bearcat/client/analytics_spec.rb +0 -0
  70. data/spec/bearcat/client/assignment_groups_spec.rb +0 -0
  71. data/spec/bearcat/client/assignments_spec.rb +0 -0
  72. data/spec/bearcat/client/blueprint_courses_spec.rb +0 -0
  73. data/spec/bearcat/client/calendar_events_spec.rb +0 -0
  74. data/spec/bearcat/client/canvas_files_spec.rb +0 -0
  75. data/spec/bearcat/client/conferences_spec.rb +0 -0
  76. data/spec/bearcat/client/content_exports_spec.rb +0 -0
  77. data/spec/bearcat/client/content_migrations_spec.rb +0 -0
  78. data/spec/bearcat/client/conversations_spec.rb +0 -0
  79. data/spec/bearcat/client/courses_spec.rb +0 -0
  80. data/spec/bearcat/client/custom_gradebook_columns_spec.rb +0 -0
  81. data/spec/bearcat/client/discussions_spec.rb +0 -0
  82. data/spec/bearcat/client/enrollments_spec.rb +0 -0
  83. data/spec/bearcat/client/external_tools_spec.rb +0 -0
  84. data/spec/bearcat/client/files_spec.rb +0 -0
  85. data/spec/bearcat/client/folders_spec.rb +0 -0
  86. data/spec/bearcat/client/graph_ql_spec.rb +0 -0
  87. data/spec/bearcat/client/group_categories_spec.rb +0 -0
  88. data/spec/bearcat/client/group_membership_spec.rb +0 -0
  89. data/spec/bearcat/client/group_memberships_spec.rb +0 -0
  90. data/spec/bearcat/client/groups_spec.rb +0 -0
  91. data/spec/bearcat/client/learning_outcomes_spec.rb +0 -0
  92. data/spec/bearcat/client/module_items_spec.rb +0 -0
  93. data/spec/bearcat/client/modules_spec.rb +0 -0
  94. data/spec/bearcat/client/o_auth2_spec.rb +0 -0
  95. data/spec/bearcat/client/outcome_groups_spec.rb +0 -0
  96. data/spec/bearcat/client/outcomes_spec.rb +0 -0
  97. data/spec/bearcat/client/pages_spec.rb +0 -0
  98. data/spec/bearcat/client/quizzes_spec.rb +0 -0
  99. data/spec/bearcat/client/reports_spec.rb +0 -0
  100. data/spec/bearcat/client/roles_spec.rb +0 -0
  101. data/spec/bearcat/client/rubric_assessment_spec.rb +0 -0
  102. data/spec/bearcat/client/rubric_association_spec.rb +0 -0
  103. data/spec/bearcat/client/rubric_spec.rb +0 -0
  104. data/spec/bearcat/client/search_spec.rb +0 -0
  105. data/spec/bearcat/client/sections_spec.rb +0 -0
  106. data/spec/bearcat/client/submissions_spec.rb +0 -0
  107. data/spec/bearcat/client/users_spec.rb +0 -0
  108. data/spec/bearcat/client_spec.rb +0 -0
  109. data/spec/bearcat/rate_limiting_spec.rb +0 -0
  110. data/spec/bearcat/stub_bearcat_spec.rb +0 -0
  111. data/spec/bearcat_spec.rb +0 -0
  112. data/spec/fixtures/access_token.json +0 -0
  113. data/spec/fixtures/account_admin_create.json +0 -0
  114. data/spec/fixtures/account_admin_delete.json +0 -0
  115. data/spec/fixtures/account_admins.json +0 -0
  116. data/spec/fixtures/account_courses.json +0 -0
  117. data/spec/fixtures/account_grading_standards.json +0 -0
  118. data/spec/fixtures/account_groups.json +0 -0
  119. data/spec/fixtures/account_reports.json +0 -0
  120. data/spec/fixtures/account_reports_index.json +0 -0
  121. data/spec/fixtures/account_reports_result_success.json +0 -0
  122. data/spec/fixtures/account_reports_start_result.json +0 -0
  123. data/spec/fixtures/account_role.json +0 -0
  124. data/spec/fixtures/account_roles.json +0 -0
  125. data/spec/fixtures/account_sis_imports.json +0 -0
  126. data/spec/fixtures/account_sub_accounts.json +0 -0
  127. data/spec/fixtures/account_user.json +0 -0
  128. data/spec/fixtures/account_users.json +0 -0
  129. data/spec/fixtures/accounts.json +0 -0
  130. data/spec/fixtures/add_custom_user_data.json +0 -0
  131. data/spec/fixtures/add_user.json +0 -0
  132. data/spec/fixtures/assignment.json +0 -0
  133. data/spec/fixtures/assignment_group.json +0 -0
  134. data/spec/fixtures/assignment_groups.json +0 -0
  135. data/spec/fixtures/assignment_section_override.json +0 -0
  136. data/spec/fixtures/assignments.json +0 -0
  137. data/spec/fixtures/bearcat.jpg +0 -0
  138. data/spec/fixtures/blueprint_migration.json +0 -0
  139. data/spec/fixtures/blueprint_subscriptions.json +0 -0
  140. data/spec/fixtures/blueprint_template.json +0 -0
  141. data/spec/fixtures/blueprint_update_assocations_success.json +0 -0
  142. data/spec/fixtures/calendar_event.json +0 -0
  143. data/spec/fixtures/calendar_events.json +0 -0
  144. data/spec/fixtures/canvas_files/declare_file.json +0 -0
  145. data/spec/fixtures/canvas_files/upload_success.json +0 -0
  146. data/spec/fixtures/cc.imscc +0 -0
  147. data/spec/fixtures/communication_channels.json +0 -0
  148. data/spec/fixtures/conclude_enrollment.json +0 -0
  149. data/spec/fixtures/content_export.json +0 -0
  150. data/spec/fixtures/content_migration_files/content_migration.json +0 -0
  151. data/spec/fixtures/content_migration_files/response.json +0 -0
  152. data/spec/fixtures/content_migration_files/upload_success.json +0 -0
  153. data/spec/fixtures/conversation.json +0 -0
  154. data/spec/fixtures/course.json +0 -0
  155. data/spec/fixtures/course_conferences.json +0 -0
  156. data/spec/fixtures/course_copy.json +0 -0
  157. data/spec/fixtures/course_enrollments.json +0 -0
  158. data/spec/fixtures/course_files.json +0 -0
  159. data/spec/fixtures/course_folder.json +0 -0
  160. data/spec/fixtures/course_folders.json +0 -0
  161. data/spec/fixtures/course_grading_standards.json +0 -0
  162. data/spec/fixtures/course_groups.json +0 -0
  163. data/spec/fixtures/course_sections.json +0 -0
  164. data/spec/fixtures/course_settings.json +0 -0
  165. data/spec/fixtures/course_students.json +0 -0
  166. data/spec/fixtures/create_course_discussion.json +0 -0
  167. data/spec/fixtures/create_group_discussion.json +0 -0
  168. data/spec/fixtures/create_outcome_in_group.json +0 -0
  169. data/spec/fixtures/create_section.json +0 -0
  170. data/spec/fixtures/created_assignment.json +0 -0
  171. data/spec/fixtures/created_course.json +0 -0
  172. data/spec/fixtures/created_group.json +0 -0
  173. data/spec/fixtures/created_group_category.json +0 -0
  174. data/spec/fixtures/created_group_membership.json +0 -0
  175. data/spec/fixtures/created_module.json +0 -0
  176. data/spec/fixtures/custom_data.json +0 -0
  177. data/spec/fixtures/custom_food_data.json +0 -0
  178. data/spec/fixtures/custom_gradebook_columns/column_data.json +0 -0
  179. data/spec/fixtures/custom_gradebook_columns/custom_gradebook_column.json +0 -0
  180. data/spec/fixtures/custom_gradebook_columns/custom_gradebook_columns.json +0 -0
  181. data/spec/fixtures/custom_gradebook_columns/gradebook_column_progress.json +0 -0
  182. data/spec/fixtures/dashboard.json +0 -0
  183. data/spec/fixtures/delete_course.json +0 -0
  184. data/spec/fixtures/delete_custom_data_scope.json +0 -0
  185. data/spec/fixtures/delete_group_category.json +0 -0
  186. data/spec/fixtures/delete_section.json +0 -0
  187. data/spec/fixtures/deleted_conversation.json +0 -0
  188. data/spec/fixtures/deleted_group.json +0 -0
  189. data/spec/fixtures/department_level_participation.json +0 -0
  190. data/spec/fixtures/department_level_statistics.json +0 -0
  191. data/spec/fixtures/discussion_entries.json +0 -0
  192. data/spec/fixtures/discussion_entry_replies.json +0 -0
  193. data/spec/fixtures/discussion_topic.json +0 -0
  194. data/spec/fixtures/discussion_topics.json +0 -0
  195. data/spec/fixtures/edited_group.json +0 -0
  196. data/spec/fixtures/edited_group_category.json +0 -0
  197. data/spec/fixtures/enroll_student.json +0 -0
  198. data/spec/fixtures/enrollment_terms.json +0 -0
  199. data/spec/fixtures/external_tool.json +0 -0
  200. data/spec/fixtures/external_tools.json +0 -0
  201. data/spec/fixtures/file.csv +0 -0
  202. data/spec/fixtures/gradebook_history.json +0 -0
  203. data/spec/fixtures/graph_ql_scores.json +0 -0
  204. data/spec/fixtures/group.json +0 -0
  205. data/spec/fixtures/group_categories.json +0 -0
  206. data/spec/fixtures/group_category.json +0 -0
  207. data/spec/fixtures/group_category_groups.json +0 -0
  208. data/spec/fixtures/group_conferences.json +0 -0
  209. data/spec/fixtures/group_membership.json +0 -0
  210. data/spec/fixtures/learning_outcome.json +0 -0
  211. data/spec/fixtures/link_unlink_outcome.json +0 -0
  212. data/spec/fixtures/merge_user.json +0 -0
  213. data/spec/fixtures/module.json +0 -0
  214. data/spec/fixtures/module_item.json +0 -0
  215. data/spec/fixtures/module_item_sequence.json +0 -0
  216. data/spec/fixtures/module_items.json +0 -0
  217. data/spec/fixtures/modules.json +0 -0
  218. data/spec/fixtures/no_custom_data.json +0 -0
  219. data/spec/fixtures/ok.json +0 -0
  220. data/spec/fixtures/outcome_group_import.json +0 -0
  221. data/spec/fixtures/outcome_groups.json +0 -0
  222. data/spec/fixtures/outcome_result.json +0 -0
  223. data/spec/fixtures/outcome_subgroup.json +0 -0
  224. data/spec/fixtures/outcome_subgroups.json +0 -0
  225. data/spec/fixtures/outcomes.json +0 -0
  226. data/spec/fixtures/paged_body.json +0 -0
  227. data/spec/fixtures/pages.json +0 -0
  228. data/spec/fixtures/progress.json +0 -0
  229. data/spec/fixtures/quizzes/course_quiz.json +0 -0
  230. data/spec/fixtures/quizzes/course_quiz_questions.json +0 -0
  231. data/spec/fixtures/quizzes/course_quizzes.json +0 -0
  232. data/spec/fixtures/quizzes/quiz_assignment_override.json +0 -0
  233. data/spec/fixtures/quizzes/quiz_extension.json +0 -0
  234. data/spec/fixtures/reactivate_enrollment.json +0 -0
  235. data/spec/fixtures/report_history.json +0 -0
  236. data/spec/fixtures/report_list.json +0 -0
  237. data/spec/fixtures/report_status.json +0 -0
  238. data/spec/fixtures/rubric.json +0 -0
  239. data/spec/fixtures/rubric_assessment.json +0 -0
  240. data/spec/fixtures/rubric_association.json +0 -0
  241. data/spec/fixtures/search_find_recipients.json +0 -0
  242. data/spec/fixtures/section.json +0 -0
  243. data/spec/fixtures/section_enrollments.json +0 -0
  244. data/spec/fixtures/single_account.json +0 -0
  245. data/spec/fixtures/start_report.json +0 -0
  246. data/spec/fixtures/submissions/submission.json +0 -0
  247. data/spec/fixtures/update_outcome.json +0 -0
  248. data/spec/fixtures/update_outcome_group.json +0 -0
  249. data/spec/fixtures/update_section.json +0 -0
  250. data/spec/fixtures/updated_course.json +0 -0
  251. data/spec/fixtures/user_avatars.json +0 -0
  252. data/spec/fixtures/user_details.json +0 -0
  253. data/spec/fixtures/user_enrollments.json +0 -0
  254. data/spec/fixtures/user_logins.json +0 -0
  255. data/spec/fixtures/user_page_views.json +0 -0
  256. data/spec/fixtures/user_profile.json +0 -0
  257. data/spec/helper.rb +1 -0
  258. metadata +12 -18
  259. data/lib/bearcat/redis_connection.rb +0 -106
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3236497a9855e8e10a1f6d658ff1d0a58c5ab584807af6855ff3ec7bdecec613
4
- data.tar.gz: 3ac14e60f373fb3ba5fe4c805ac7865a727859df438c52dd237ad368f1fa19e5
3
+ metadata.gz: ac375521a4820c6403d1ef93205828d8de6fc3456a5ede22e0c2a36f38aede93
4
+ data.tar.gz: f2e89a06538fd5afd4c925439a739b883224b085164cd86f516e9bc8116ca9bd
5
5
  SHA512:
6
- metadata.gz: c68b1547fe4ad1d6940ea56432edae963419f28e9e2dee93ce7f3c66d7ccb809e44cbbd0be60f223d2503e5f878a9e8d4b9b506ce05b10e8c9c3dbe1af8a7389
7
- data.tar.gz: 29613910bfe3a083bdc1035f6ec104b84810ed109cd3b62a62907d5010ad55cbe3edd31aa9e020cfe64cb4a843cc348b4a8b3bbecff05f05e38f7513cd3c51ac
6
+ metadata.gz: 39ec7c3b55d2fc07bf84b35a34a1193618f14f51d0ce21fac9e31650c2ea1b2ba5a383070f3683f6f3b6de6a4ecdff44b1887273aa3b89ed23ff9e5203f3591b
7
+ data.tar.gz: d3897fac75a11f98df238ac2594ffc21ec0d3a9ad31ccf5b6d9aa409b1f83f97d93e46b62f9c748315a61f7cfc9200c8bd87622489df10b3bbf507018caf4e97
data/Rakefile CHANGED
File without changes
data/bearcat.gemspec CHANGED
@@ -34,5 +34,5 @@ Gem::Specification.new do |gem|
34
34
 
35
35
  gem.add_dependency "activesupport"
36
36
  gem.add_dependency "footrest", ">= 0.2.2"
37
- gem.add_dependency "connection_pool", ">= 2.2.0", "< 3.0"
37
+ gem.add_dependency "rediconn", "~> 0.1.0"
38
38
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,5 +1,3 @@
1
- require 'csv'
2
-
3
1
  module Bearcat
4
2
  class Client < Footrest::Client
5
3
  module Reports
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -2,7 +2,6 @@ require 'active_support/core_ext/hash'
2
2
  require 'footrest/client'
3
3
  require_relative 'rate_limiting'
4
4
  require_relative 'client_module'
5
- require_relative 'redis_connection'
6
5
 
7
6
  module Bearcat
8
7
  class Client < Footrest::Client
@@ -99,7 +98,7 @@ module Bearcat
99
98
  rl = config[:rate_limiter] || Bearcat.rate_limiter
100
99
  master_rate_limit = config[:master_rate_limit].present? ? config[:master_rate_limit] : Bearcat.master_rate_limit
101
100
 
102
- if rl.nil? && master_rate_limit.nil? && defined?(Rails) && Rails.env.production? && defined?(::Redis) && Bearcat::RedisConnection.configured?("BEARCAT", explicit: false)
101
+ if rl.nil? && master_rate_limit.nil? && defined?(Rails) && Rails.env.production? && defined?(::Redis) && RediConn::RedisConnection.configured?("BEARCAT", explicit: false)
103
102
  master_rate_limit = true
104
103
  end
105
104
 
File without changes
@@ -0,0 +1,11 @@
1
+ #!lua name=bearcat_rate_limiting
2
+
3
+ local function checkin_time(keys, args)
4
+ local return_time = args[1]
5
+ local true_remaining = args[2]
6
+
7
+ local hash = keys[1]
8
+ return redis.call('HGET', hash, '_last_modified_')
9
+ end
10
+
11
+ redis.register_function('my_hset', my_hset)
File without changes
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  module Bearcat
2
- VERSION = '1.5.40' unless defined?(Bearcat::VERSION)
2
+ VERSION = '1.6.1' unless defined?(Bearcat::VERSION)
3
3
  end
data/lib/bearcat.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'bearcat/version'
2
2
  require 'bearcat/client'
3
- require 'bearcat/redis_connection'
4
3
 
5
4
  module Bearcat
6
5
  class << self
@@ -37,15 +36,12 @@ module Bearcat
37
36
  end
38
37
 
39
38
  def redis_pool
40
- require 'bearcat/redis_connection'
41
- @redis_pool ||= Bearcat::RedisConnection.create(env_prefix: "BEARCAT")
39
+ require 'rediconn'
40
+ @redis_pool ||= RediConn::RedisConnection.create(env_prefix: "BEARCAT")
42
41
  end
43
42
 
44
- def redis
45
- raise ArgumentError, "requires a block" unless block_given?
46
- redis_pool.with do |conn|
47
- yield conn
48
- end
43
+ def redis(&blk)
44
+ redis_pool.lazy_with(&blk)
49
45
  end
50
46
  end
51
47
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/catalogcat.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/spec/bearcat_spec.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes