meibo 0.27.0 → 0.28.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.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +4 -0
  3. data/.rubocop.yml +14 -2
  4. data/.rubocop_todo.yml +0 -7
  5. data/Gemfile.lock +157 -56
  6. data/README.md +14 -3
  7. data/flake.lock +188 -0
  8. data/flake.nix +55 -0
  9. data/gemset.nix +658 -0
  10. data/lib/meibo/academic_session.rb +21 -21
  11. data/lib/meibo/classroom.rb +47 -34
  12. data/lib/meibo/classroom_set.rb +5 -1
  13. data/lib/meibo/converter.rb +16 -18
  14. data/lib/meibo/course.rb +34 -21
  15. data/lib/meibo/course_set.rb +5 -1
  16. data/lib/meibo/data_model.rb +46 -36
  17. data/lib/meibo/data_set.rb +8 -10
  18. data/lib/meibo/demographic.rb +36 -36
  19. data/lib/meibo/enrollment.rb +22 -22
  20. data/lib/meibo/enrollment_set.rb +9 -2
  21. data/lib/meibo/eportal/v3/classroom.rb +11 -0
  22. data/lib/meibo/eportal/v3/course.rb +11 -0
  23. data/lib/meibo/eportal/v3/enrollment.rb +11 -0
  24. data/lib/meibo/eportal/v3/organization.rb +11 -0
  25. data/lib/meibo/eportal/v3/user.rb +16 -0
  26. data/lib/meibo/eportal/v3/user_profile.rb +11 -0
  27. data/lib/meibo/eportal/v3.rb +30 -0
  28. data/lib/meibo/eportal/v4/user.rb +37 -0
  29. data/lib/meibo/eportal/v4.rb +16 -0
  30. data/lib/meibo/eportal.rb +6 -0
  31. data/lib/meibo/errors.rb +27 -5
  32. data/lib/meibo/factory_bot/academic_session.rb +1 -1
  33. data/lib/meibo/factory_bot/classroom.rb +1 -1
  34. data/lib/meibo/factory_bot/course.rb +1 -1
  35. data/lib/meibo/factory_bot/demographic.rb +1 -1
  36. data/lib/meibo/factory_bot/enrollment.rb +1 -1
  37. data/lib/meibo/factory_bot/manifest.rb +0 -21
  38. data/lib/meibo/factory_bot/organization.rb +1 -1
  39. data/lib/meibo/factory_bot/role.rb +2 -4
  40. data/lib/meibo/factory_bot/user.rb +7 -7
  41. data/lib/meibo/factory_bot/user_profile.rb +1 -1
  42. data/lib/meibo/japan_k12_schools_profile/v1/enrollment.rb +16 -0
  43. data/lib/meibo/japan_k12_schools_profile/v1.rb +20 -0
  44. data/lib/meibo/japan_k12_schools_profile.rb +6 -0
  45. data/lib/meibo/japan_profile/v1_1/academic_session.rb +29 -0
  46. data/lib/meibo/japan_profile/v1_1/classroom.rb +27 -0
  47. data/lib/meibo/japan_profile/v1_1/course.rb +16 -0
  48. data/lib/meibo/japan_profile/v1_1/demographic.rb +11 -0
  49. data/lib/meibo/japan_profile/v1_1/enrollment.rb +47 -0
  50. data/lib/meibo/japan_profile/v1_1/organization.rb +16 -0
  51. data/lib/meibo/japan_profile/v1_1/organization_set.rb +23 -0
  52. data/lib/meibo/japan_profile/v1_1/user.rb +39 -0
  53. data/lib/meibo/japan_profile/v1_1/user_set.rb +17 -0
  54. data/lib/meibo/japan_profile/v1_1.rb +35 -0
  55. data/lib/meibo/japan_profile/v1_1_1.rb +9 -0
  56. data/lib/meibo/japan_profile/v1_2/user.rb +42 -0
  57. data/lib/meibo/japan_profile/v1_2.rb +20 -0
  58. data/lib/meibo/japan_profile.rb +6 -0
  59. data/lib/meibo/manifest.rb +41 -46
  60. data/lib/meibo/oneroster/v1_2/user.rb +43 -0
  61. data/lib/meibo/oneroster/v1_2.rb +62 -0
  62. data/lib/meibo/oneroster/v1_2_1.rb +22 -0
  63. data/lib/meibo/oneroster.rb +6 -0
  64. data/lib/meibo/organization.rb +17 -17
  65. data/lib/meibo/processing_mode.rb +53 -0
  66. data/lib/meibo/profile.rb +8 -4
  67. data/lib/meibo/profiles.rb +12 -120
  68. data/lib/meibo/pse_interoperability_standard/v5.rb +9 -0
  69. data/lib/meibo/pse_interoperability_standard/v6/enrollment.rb +11 -0
  70. data/lib/meibo/pse_interoperability_standard/v6.rb +18 -0
  71. data/lib/meibo/pse_interoperability_standard.rb +6 -0
  72. data/lib/meibo/reader.rb +24 -36
  73. data/lib/meibo/role.rb +24 -24
  74. data/lib/meibo/roster.rb +46 -47
  75. data/lib/meibo/user.rb +35 -35
  76. data/lib/meibo/user_profile.rb +20 -20
  77. data/lib/meibo/user_set.rb +1 -1
  78. data/lib/meibo/version.rb +1 -1
  79. data/lib/meibo.rb +10 -2
  80. data/meibo.gemspec +1 -1
  81. metadata +45 -28
  82. data/lib/meibo/eportal_v3/classroom.rb +0 -15
  83. data/lib/meibo/eportal_v3/course.rb +0 -15
  84. data/lib/meibo/eportal_v3/enrollment.rb +0 -15
  85. data/lib/meibo/eportal_v3/organization.rb +0 -15
  86. data/lib/meibo/eportal_v3/user.rb +0 -16
  87. data/lib/meibo/eportal_v3/user_profile.rb +0 -15
  88. data/lib/meibo/japan_profile/academic_session.rb +0 -29
  89. data/lib/meibo/japan_profile/classroom.rb +0 -24
  90. data/lib/meibo/japan_profile/course.rb +0 -18
  91. data/lib/meibo/japan_profile/demographic.rb +0 -15
  92. data/lib/meibo/japan_profile/enrollment.rb +0 -40
  93. data/lib/meibo/japan_profile/organization.rb +0 -20
  94. data/lib/meibo/japan_profile/organization_set.rb +0 -17
  95. data/lib/meibo/japan_profile/role_jp_m0.rb +0 -26
  96. data/lib/meibo/japan_profile/user.rb +0 -45
  97. data/lib/meibo/japan_profile/user_m0.rb +0 -12
  98. data/lib/meibo/japan_profile/user_set.rb +0 -14
  99. data/lib/meibo/manifest/processing_mode.rb +0 -41
  100. data/lib/meibo/user_m0.rb +0 -47
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1_1
6
+ PROFILE = V1_1::PROFILE
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_2
6
+ class User < ::Meibo::OneRoster::V1_2_1::User
7
+ define_attributes(
8
+ superclass.attribute_names_to_header_fields.merge(
9
+ kana_given_name: "metadata.jp.kanaGivenName",
10
+ kana_family_name: "metadata.jp.kanaFamilyName",
11
+ kana_middle_name: "metadata.jp.kanaMiddleName",
12
+ home_class: "metadata.jp.homeClass",
13
+ kana_preferred_family_name: "metadata.jp.kanaPreferredFamilyName",
14
+ kana_preferred_given_name: "metadata.jp.kanaPreferredGivenName",
15
+ kana_preferred_middle_name: "metadata.jp.kanaPreferredMiddleName"
16
+ )
17
+ )
18
+
19
+ define_converters(superclass.converters.merge(mext_grade_code: [:grades].freeze))
20
+
21
+ # NOTE: enabled_userは必須ではないが固定
22
+ def initialize(
23
+ enabled_user: true,
24
+ kana_given_name: nil, kana_family_name: nil, kana_middle_name: nil, home_class: nil,
25
+ kana_preferred_given_name: nil, kana_preferred_family_name: nil, kana_preferred_middle_name: nil,
26
+ **
27
+ )
28
+ super(enabled_user:, **)
29
+ @kana_given_name = kana_given_name
30
+ @kana_family_name = kana_family_name
31
+ @kana_middle_name = kana_middle_name
32
+ @home_class = home_class
33
+ @kana_preferred_given_name = kana_preferred_given_name
34
+ @kana_preferred_family_name = kana_preferred_family_name
35
+ @kana_preferred_middle_name = kana_preferred_middle_name
36
+ end
37
+
38
+ def home_classroom = home_class && ::Meibo.current_roster.classes.find(home_class)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_2
6
+ include ::Meibo::OneRoster::V1_2_1
7
+
8
+ PROFILE = Profile.new(
9
+ builders: ::Meibo::JapanProfile::V1_1::PROFILE.builders.merge(
10
+ user: ::Meibo::Builder::UserBuilder.create(::Meibo::JapanProfile::V1_2::User)
11
+ ),
12
+ data_models: ::Meibo::JapanProfile::V1_1::PROFILE.data_models.merge(
13
+ file_users: ::Meibo::JapanProfile::V1_2::User
14
+ ),
15
+ data_set: ::Meibo::JapanProfile::V1_1::PROFILE.data_set,
16
+ manifest_properties: ::Meibo::JapanProfile::V1_1::PROFILE.manifest_properties
17
+ )
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ end
6
+ end
@@ -3,13 +3,7 @@
3
3
  module Meibo
4
4
  class Manifest
5
5
  MANIFEST_VERSION = "1.0"
6
- ONEROSTER_VERSION = "1.2"
7
-
8
- PROCESSING_MODES = {
9
- absent: ProcessingMode.new("absent"),
10
- bulk: ProcessingMode.new("bulk"),
11
- delta: ProcessingMode.new("delta")
12
- }.freeze
6
+ ONEROSTER_VERSION = "1.2.1"
13
7
 
14
8
  PROPERTY_NAME_TO_ATTRIBUTE_MAP = {
15
9
  "manifest.version" => :manifest_version,
@@ -42,51 +36,27 @@ module Meibo
42
36
  [attribute, property_name]
43
37
  end.freeze
44
38
 
45
- # NOTE: 想定値
46
- DEFAULT_VALUES = {
47
- manifest_version: MANIFEST_VERSION,
48
- oneroster_version: ONEROSTER_VERSION,
49
- file_academic_sessions: PROCESSING_MODES[:bulk],
50
- file_categories: PROCESSING_MODES[:absent],
51
- file_classes: PROCESSING_MODES[:bulk],
52
- file_class_resources: PROCESSING_MODES[:absent],
53
- file_courses: PROCESSING_MODES[:bulk],
54
- file_course_resources: PROCESSING_MODES[:absent],
55
- file_demographics: PROCESSING_MODES[:bulk],
56
- file_enrollments: PROCESSING_MODES[:bulk],
57
- file_line_item_learning_objective_ids: PROCESSING_MODES[:absent],
58
- file_line_items: PROCESSING_MODES[:absent],
59
- file_line_item_score_scales: PROCESSING_MODES[:absent],
60
- file_orgs: PROCESSING_MODES[:bulk],
61
- file_resources: PROCESSING_MODES[:absent],
62
- file_result_learning_objective_ids: PROCESSING_MODES[:absent],
63
- file_results: PROCESSING_MODES[:absent],
64
- file_result_score_scales: PROCESSING_MODES[:absent],
65
- file_roles: PROCESSING_MODES[:bulk],
66
- file_score_scales: PROCESSING_MODES[:absent],
67
- file_user_profiles: PROCESSING_MODES[:bulk],
68
- file_user_resources: PROCESSING_MODES[:absent],
69
- file_users: PROCESSING_MODES[:bulk]
70
- }.freeze
71
-
72
- attr_reader :manifest_version, :oneroster_version, :file_academic_sessions, :file_categories, :file_classes,
73
- :file_class_resources, :file_courses, :file_course_resources, :file_demographics, :file_enrollments, :file_line_item_learning_objective_ids, :file_line_items, :file_line_item_score_scales, :file_orgs, :file_resources, :file_result_learning_objective_ids, :file_results, :file_result_score_scales, :file_roles, :file_score_scales, :file_user_profiles, :file_user_resources, :file_users, :source_system_name, :source_system_code
74
-
75
- def self.build_from_default(**custom_properties)
76
- new(**Manifest::DEFAULT_VALUES.merge(custom_properties))
77
- end
39
+ attr_reader :manifest_version, :oneroster_version, :source_system_name, :source_system_code, :file_academic_sessions,
40
+ :file_categories, :file_classes, :file_class_resources, :file_courses, :file_course_resources,
41
+ :file_demographics, :file_enrollments, :file_line_item_learning_objective_ids, :file_line_items, :file_line_item_score_scales,
42
+ :file_orgs, :file_resources, :file_result_learning_objective_ids, :file_results, :file_result_score_scales,
43
+ :file_roles, :file_score_scales, :file_user_profiles, :file_user_resources, :file_users
78
44
 
79
45
  def self.filename
80
46
  "manifest.csv"
81
47
  end
82
48
 
83
- attribute_name_to_header_field_map = {
49
+ attribute_names_to_header_fields = {
84
50
  property_name: "propertyName",
85
51
  value: "value"
86
- }
87
- header_fields = attribute_name_to_header_field_map.values
52
+ }.freeze
53
+ attribute_names = attribute_names_to_header_fields.keys.freeze
54
+ header_converters = Converter.build_header_field_to_attribute_converter(attribute_names_to_header_fields)
55
+ header_fields = attribute_names_to_header_fields.values.freeze
56
+ define_singleton_method(:attribute_names_to_header_fields) { attribute_names_to_header_fields }
57
+ define_singleton_method(:attribute_names) { attribute_names }
58
+ define_singleton_method(:header_converters) { header_converters }
88
59
  define_singleton_method(:header_fields) { header_fields }
89
- DataModel.define_header_converters(self, attribute_name_to_header_field_map)
90
60
 
91
61
  def self.attribute_to_property_name(attribute)
92
62
  ATTRIBUTE_TO_PROPERTY_NAME_MAP.fetch(attribute)
@@ -107,8 +77,33 @@ module Meibo
107
77
  end)
108
78
  end
109
79
 
110
- def initialize(manifest_version:, oneroster_version:, file_academic_sessions:, file_categories:, file_classes:,
111
- file_class_resources:, file_courses:, file_course_resources:, file_demographics:, file_enrollments:, file_line_item_learning_objective_ids:, file_line_items:, file_line_item_score_scales:, file_orgs:, file_resources:, file_result_learning_objective_ids:, file_results:, file_result_score_scales:, file_roles:, file_score_scales:, file_user_profiles:, file_user_resources:, file_users:, source_system_name: nil, source_system_code: nil)
80
+ def initialize(
81
+ file_academic_sessions: ProcessingMode.absent,
82
+ file_categories: ProcessingMode.absent,
83
+ file_classes: ProcessingMode.absent,
84
+ file_class_resources: ProcessingMode.absent,
85
+ file_courses: ProcessingMode.absent,
86
+ file_course_resources: ProcessingMode.absent,
87
+ file_demographics: ProcessingMode.absent,
88
+ file_enrollments: ProcessingMode.absent,
89
+ file_line_item_learning_objective_ids: ProcessingMode.absent,
90
+ file_line_items: ProcessingMode.absent,
91
+ file_line_item_score_scales: ProcessingMode.absent,
92
+ file_orgs: ProcessingMode.absent,
93
+ file_resources: ProcessingMode.absent,
94
+ file_result_learning_objective_ids: ProcessingMode.absent,
95
+ file_results: ProcessingMode.absent,
96
+ file_result_score_scales: ProcessingMode.absent,
97
+ file_roles: ProcessingMode.absent,
98
+ file_score_scales: ProcessingMode.absent,
99
+ file_user_profiles: ProcessingMode.absent,
100
+ file_user_resources: ProcessingMode.absent,
101
+ file_users: ProcessingMode.absent,
102
+ manifest_version: MANIFEST_VERSION,
103
+ oneroster_version: ONEROSTER_VERSION,
104
+ source_system_name: nil,
105
+ source_system_code: nil
106
+ )
112
107
  @manifest_version = manifest_version
113
108
  @oneroster_version = oneroster_version
114
109
  @file_academic_sessions = file_academic_sessions
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module OneRoster
5
+ module V1_2
6
+ class User < ::Meibo::User
7
+ define_attributes(
8
+ sourced_id: "sourcedId",
9
+ status: "status",
10
+ date_last_modified: "dateLastModified",
11
+ enabled_user: "enabledUser",
12
+ username: "username",
13
+ user_ids: "userIds",
14
+ given_name: "givenName",
15
+ family_name: "familyName",
16
+ middle_name: "middleName",
17
+ identifier: "identifier",
18
+ email: "email",
19
+ sms: "sms",
20
+ phone: "phone",
21
+ agent_sourced_ids: "agentSourcedIds",
22
+ grades: "grades",
23
+ password: "password",
24
+ user_master_identifier: "userMasterIdentifier",
25
+ resource_sourced_ids: "resourceSourcedIds",
26
+ preferred_given_name: "preferredGivenName",
27
+ preferred_middle_name: "preferredMiddleName",
28
+ preferred_family_name: "preferredFamilyName",
29
+ primary_org_sourced_id: "primaryOrgSourcedId",
30
+ pronouns: "pronouns"
31
+ )
32
+
33
+ define_converters(superclass.converters.merge(list: [*superclass.converters[:list], :resource_sourced_ids].freeze))
34
+
35
+ # NOTE: enabled_userは必須ではないが固定
36
+ def initialize(resource_sourced_ids: nil, **other_fields)
37
+ super(**other_fields)
38
+ @resource_sourced_ids = resource_sourced_ids
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module OneRoster
5
+ module V1_2
6
+ AcademicSession = ::Meibo::AcademicSession
7
+ AcademicSessionSet = ::Meibo::AcademicSessionSet
8
+ Classroom = ::Meibo::Classroom
9
+ ClassroomSet = ::Meibo::ClassroomSet
10
+ Course = ::Meibo::Course
11
+ CourseSet = ::Meibo::CourseSet
12
+ Demographic = ::Meibo::Demographic
13
+ DemographicSet = ::Meibo::DemographicSet
14
+ Enrollment = ::Meibo::Enrollment
15
+ EnrollmentSet = ::Meibo::EnrollmentSet
16
+ Organization = ::Meibo::Organization
17
+ OrganizationSet = ::Meibo::OrganizationSet
18
+ Role = ::Meibo::Role
19
+ RoleSet = ::Meibo::RoleSet
20
+ UserSet = ::Meibo::UserSet
21
+ UserProfile = ::Meibo::UserProfile
22
+ UserProfileSet = ::Meibo::UserProfileSet
23
+
24
+ PROFILE = Profile.new(
25
+ builders: {
26
+ academic_session: ::Meibo::Builder::AcademicSessionBuilder.create(::Meibo::OneRoster::V1_2::AcademicSession),
27
+ class: ::Meibo::Builder::ClassroomBuilder.create(::Meibo::OneRoster::V1_2::Classroom),
28
+ course: ::Meibo::Builder::CourseBuilder.create(::Meibo::OneRoster::V1_2::Course),
29
+ demographic: ::Meibo::Builder::DemographicBuilder.create(::Meibo::OneRoster::V1_2::Demographic),
30
+ enrollment: ::Meibo::Builder::EnrollmentBuilder.create(::Meibo::OneRoster::V1_2::Enrollment),
31
+ org: ::Meibo::Builder::OrganizationBuilder.create(::Meibo::OneRoster::V1_2::Organization),
32
+ role: ::Meibo::Builder::RoleBuilder.create(::Meibo::OneRoster::V1_2::Role),
33
+ user: ::Meibo::Builder::UserBuilder.create(::Meibo::OneRoster::V1_2::User),
34
+ user_profile: ::Meibo::Builder::UserProfileBuilder.create(::Meibo::OneRoster::V1_2::UserProfile)
35
+ },
36
+ data_models: {
37
+ file_academic_sessions: ::Meibo::OneRoster::V1_2::AcademicSession,
38
+ file_classes: ::Meibo::OneRoster::V1_2::Classroom,
39
+ file_courses: ::Meibo::OneRoster::V1_2::Course,
40
+ file_demographics: ::Meibo::OneRoster::V1_2::Demographic,
41
+ file_enrollments: ::Meibo::OneRoster::V1_2::Enrollment,
42
+ file_orgs: ::Meibo::OneRoster::V1_2::Organization,
43
+ file_roles: ::Meibo::OneRoster::V1_2::Role,
44
+ file_user_profiles: ::Meibo::OneRoster::V1_2::UserProfile,
45
+ file_users: ::Meibo::OneRoster::V1_2::User
46
+ },
47
+ data_set: {
48
+ file_academic_sessions: ::Meibo::OneRoster::V1_2::AcademicSessionSet,
49
+ file_classes: ::Meibo::OneRoster::V1_2::ClassroomSet,
50
+ file_courses: ::Meibo::OneRoster::V1_2::CourseSet,
51
+ file_demographics: ::Meibo::OneRoster::V1_2::DemographicSet,
52
+ file_enrollments: ::Meibo::OneRoster::V1_2::EnrollmentSet,
53
+ file_orgs: ::Meibo::OneRoster::V1_2::OrganizationSet,
54
+ file_roles: ::Meibo::OneRoster::V1_2::RoleSet,
55
+ file_user_profiles: ::Meibo::OneRoster::V1_2::UserProfileSet,
56
+ file_users: ::Meibo::OneRoster::V1_2::UserSet
57
+ },
58
+ manifest_properties: { oneroster_version: "1.2" }
59
+ )
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module OneRoster
5
+ module V1_2_1
6
+ include V1_2
7
+
8
+ User = ::Meibo::User
9
+
10
+ PROFILE = Profile.new(
11
+ builders: ::Meibo::OneRoster::V1_2::PROFILE.builders.merge(
12
+ user: ::Meibo::Builder::UserBuilder.create(User)
13
+ ),
14
+ data_models: ::Meibo::OneRoster::V1_2::PROFILE.data_models.merge(
15
+ file_users: ::Meibo::User
16
+ ),
17
+ data_set: ::Meibo::OneRoster::V1_2::PROFILE.data_set,
18
+ manifest_properties: { oneroster_version: "1.2.1" }
19
+ )
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module OneRoster
5
+ end
6
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Meibo
4
4
  class Organization
5
+ include DataModel
6
+
5
7
  TYPES = {
6
8
  department: "department",
7
9
  school: "school",
@@ -11,23 +13,21 @@ module Meibo
11
13
  national: "national"
12
14
  }.freeze
13
15
 
14
- DataModel.define(
15
- self,
16
- attribute_name_to_header_field_map: {
17
- sourced_id: "sourcedId",
18
- status: "status",
19
- date_last_modified: "dateLastModified",
20
- name: "name",
21
- type: "type",
22
- identifier: "identifier",
23
- parent_sourced_id: "parentSourcedId"
24
- },
25
- converters: {
26
- datetime: [:date_last_modified],
27
- enum: { type: [*TYPES.values, ENUM_EXT_PATTERN].freeze },
28
- required: %i[sourced_id name type],
29
- status: [:status]
30
- }
16
+ define_attributes(
17
+ sourced_id: "sourcedId",
18
+ status: "status",
19
+ date_last_modified: "dateLastModified",
20
+ name: "name",
21
+ type: "type",
22
+ identifier: "identifier",
23
+ parent_sourced_id: "parentSourcedId"
24
+ )
25
+
26
+ define_converters(
27
+ datetime: [:date_last_modified],
28
+ enum: { type: [*TYPES.values, ENUM_EXT_PATTERN] },
29
+ required: %i[sourced_id name type],
30
+ status: [:status]
31
31
  )
32
32
 
33
33
  def initialize(sourced_id:, name:, type:, status: nil, date_last_modified: nil, identifier: nil, parent_sourced_id: nil, **extension_fields)
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ class ProcessingMode
5
+ attr_reader :mode
6
+
7
+ class << self
8
+ def absent
9
+ @absent ||= ProcessingMode.new("absent")
10
+ end
11
+
12
+ def bulk
13
+ @bulk ||= ProcessingMode.new("bulk")
14
+ end
15
+
16
+ def delta
17
+ @delta ||= ProcessingMode.new("delta")
18
+ end
19
+ end
20
+
21
+ def initialize(mode)
22
+ @mode = mode
23
+ freeze
24
+ end
25
+
26
+ def absent?
27
+ @mode == "absent"
28
+ end
29
+
30
+ def bulk?
31
+ @mode == "bulk"
32
+ end
33
+
34
+ def delta?
35
+ @mode == "delta"
36
+ end
37
+
38
+ def ==(other)
39
+ case other
40
+ when ProcessingMode
41
+ @mode == other.mode
42
+ when String
43
+ to_s == other
44
+ else
45
+ false
46
+ end
47
+ end
48
+
49
+ def to_s
50
+ @mode
51
+ end
52
+ end
53
+ end
data/lib/meibo/profile.rb CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  module Meibo
4
4
  class Profile
5
- attr_reader :builders, :data_models, :data_set
5
+ attr_reader :builders, :data_models, :data_set, :manifest_properties
6
6
 
7
- def initialize(builders:, data_models:, data_set:)
7
+ def initialize(builders:, data_models:, data_set:, manifest_properties: {})
8
8
  @builders = builders
9
9
  @data_models = data_models
10
10
  @data_set = data_set
11
+ @manifest_properties = manifest_properties
11
12
  end
12
13
 
13
14
  def builder_for(key)
@@ -18,8 +19,11 @@ module Meibo
18
19
  data_models[file_attribute]
19
20
  end
20
21
 
21
- def data_set_for(name)
22
- data_set[name]
22
+ def data_set_for(file_attribute)
23
+ data_set[file_attribute]
23
24
  end
25
+
26
+ def manifest_version = manifest_properties.fetch(:manifest_version, Meibo::Manifest::MANIFEST_VERSION)
27
+ def oneroster_version = manifest_properties.fetch(:oneroster_version, Meibo::Manifest::ONEROSTER_VERSION)
24
28
  end
25
29
  end
@@ -2,129 +2,21 @@
2
2
 
3
3
  module Meibo
4
4
  module Profiles
5
- profile121 = Profile.new(
6
- builders: {
7
- academic_session: Builder::AcademicSessionBuilder.create(AcademicSession),
8
- class: Builder::ClassroomBuilder.create(Classroom),
9
- course: Builder::CourseBuilder.create(Course),
10
- demographic: Builder::DemographicBuilder.create(Demographic),
11
- enrollment: Builder::EnrollmentBuilder.create(Enrollment),
12
- org: Builder::OrganizationBuilder.create(Organization),
13
- role: Builder::RoleBuilder.create(Role),
14
- user: Builder::UserBuilder.create(User),
15
- user_profile: Builder::UserProfileBuilder.create(UserProfile)
16
- },
17
- data_models: {
18
- file_academic_sessions: Meibo::AcademicSession,
19
- file_classes: Meibo::Classroom,
20
- file_courses: Meibo::Course,
21
- file_demographics: Meibo::Demographic,
22
- file_enrollments: Meibo::Enrollment,
23
- file_orgs: Meibo::Organization,
24
- file_roles: Meibo::Role,
25
- file_user_profiles: Meibo::UserProfile,
26
- file_users: Meibo::User
27
- },
28
- data_set: {
29
- academic_sessions: Meibo::AcademicSessionSet,
30
- classes: Meibo::ClassroomSet,
31
- courses: Meibo::CourseSet,
32
- demographics: Meibo::DemographicSet,
33
- enrollments: Meibo::EnrollmentSet,
34
- orgs: Meibo::OrganizationSet,
35
- roles: Meibo::RoleSet,
36
- user_profiles: Meibo::UserProfileSet,
37
- users: Meibo::UserSet
38
- }
39
- )
40
-
41
- profile120 = Profile.new(
42
- builders: profile121.builders.merge(
43
- user: Builder::UserBuilder.create(UserM0)
44
- ),
45
- data_models: profile121.data_models.merge(
46
- file_users: UserM0
47
- ),
48
- data_set: profile121.data_set
49
- )
50
-
51
- japan_profile121_v11 = Profile.new(
52
- builders: profile121.builders.merge(
53
- academic_session: Builder::AcademicSessionBuilder.create(JapanProfile::AcademicSession),
54
- class: Builder::ClassroomBuilder.create(JapanProfile::Classroom),
55
- course: Builder::CourseBuilder.create(JapanProfile::Course),
56
- demographic: Builder::DemographicBuilder.create(JapanProfile::Demographic),
57
- enrollment: Builder::EnrollmentBuilder.create(JapanProfile::Enrollment),
58
- org: Builder::OrganizationBuilder.create(JapanProfile::Organization),
59
- user: Builder::UserBuilder.create(JapanProfile::User)
60
- ),
61
- data_models: profile121.data_models.merge(
62
- file_academic_sessions: JapanProfile::AcademicSession,
63
- file_classes: JapanProfile::Classroom,
64
- file_courses: JapanProfile::Course,
65
- file_demographics: JapanProfile::Demographic,
66
- file_enrollments: JapanProfile::Enrollment,
67
- file_orgs: JapanProfile::Organization,
68
- file_users: JapanProfile::User
69
- ),
70
- data_set: profile121.data_set.merge(
71
- orgs: JapanProfile::OrganizationSet,
72
- users: JapanProfile::UserSet
73
- )
74
- )
75
-
76
- japan_profile120_v11 = Profile.new(
77
- builders: japan_profile121_v11.builders.merge(
78
- user: Builder::UserBuilder.create(JapanProfile::UserM0)
79
- ),
80
- data_models: japan_profile121_v11.data_models.merge(
81
- file_users: JapanProfile::UserM0
82
- ),
83
- data_set: japan_profile121_v11.data_set
84
- )
85
-
86
- japan_profile120_v10 = Profile.new(
87
- builders: japan_profile120_v11.builders.merge(
88
- role: Builder::UserBuilder.create(JapanProfile::RoleJpM0)
89
- ),
90
- data_models: japan_profile120_v11.data_models.merge(
91
- file_roles: JapanProfile::RoleJpM0
92
- ),
93
- data_set: japan_profile120_v11.data_set
94
- )
95
-
96
- eportal_v3 = Profile.new(
97
- builders: japan_profile120_v11.builders.merge(
98
- class: Builder::ClassroomBuilder.create(EportalV3::Classroom),
99
- course: Builder::CourseBuilder.create(EportalV3::Course),
100
- enrollment: Builder::EnrollmentBuilder.create(EportalV3::Enrollment),
101
- organization: Builder::OrganizationBuilder.create(EportalV3::Organization),
102
- user_profile: Builder::UserProfileBuilder.create(EportalV3::UserProfile),
103
- user: Builder::UserBuilder.create(EportalV3::User)
104
- ),
105
- data_models: japan_profile120_v11.data_models.merge(
106
- file_classes: EportalV3::Classroom,
107
- file_courses: EportalV3::Course,
108
- file_enrollments: EportalV3::Enrollment,
109
- file_orgs: EportalV3::Organization,
110
- file_user_profiles: EportalV3::UserProfile,
111
- file_users: EportalV3::User
112
- ),
113
- data_set: japan_profile120_v11.data_set
114
- )
115
-
116
5
  PROFILES = {
117
- "v1.2" => profile121,
118
- "v1.2.1" => profile121,
119
- "v1.2.0" => profile120,
120
- "v1.2.0 ep v3.00" => eportal_v3,
121
- "v1.2.0 jp v1.0" => japan_profile120_v10,
122
- "v1.2.0 jp v1.1" => japan_profile120_v11,
123
- "v1.2.1 jp v1.1" => japan_profile121_v11
6
+ "IMS OneRoster: CSV Binding Final Release v1.2" => OneRoster::V1_2::PROFILE,
7
+ "IMS OneRoster: CSV Binding Final Release v1.2.1" => OneRoster::V1_2_1::PROFILE,
8
+ "学習eポータル標準モデル Ver. 3.00" => Eportal::V3::PROFILE,
9
+ "OneRoster Japan Profile 第2版" => JapanProfile::V1_1::PROFILE,
10
+ "OneRoster Japan Profile 第2 (rev.2)" => JapanProfile::V1_1_1::PROFILE,
11
+ "OneRoster Japan Profile v.1.2.1" => JapanProfile::V1_2::PROFILE,
12
+ "学習eポータル標準モデル Ver. 4.00" => Meibo::Eportal::V4::PROFILE,
13
+ "初等中等教育におけるシステム間連携のための相互運用標準モデル Ver. 5.00" => Meibo::PSEInteroperabilityStandard::V5::PROFILE,
14
+ "1EdTech OneRoster 1.2 CSV Binding: Japan K-12/Schools Profile" => JapanK12SchoolsProfile::V1::PROFILE,
15
+ "初等中等教育におけるシステム間連携のための相互運用標準モデル Ver. 6.00" => Meibo::PSEInteroperabilityStandard::V6::PROFILE
124
16
  }.freeze
125
17
 
126
- def self.use(profile_name, &block)
127
- Meibo.with_profile(self[profile_name], &block)
18
+ def self.use(profile_name, &)
19
+ Meibo.with_profile(self[profile_name], &)
128
20
  end
129
21
 
130
22
  def self.[](profile_name)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module PSEInteroperabilityStandard
5
+ module V5
6
+ include ::Meibo::Eportal::V4
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module PSEInteroperabilityStandard
5
+ module V6
6
+ class Enrollment < ::Meibo::JapanK12SchoolsProfile::V1::Enrollment
7
+ define_converters(superclass.converters.merge(required: [*superclass.converters[:required], :primary]))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module PSEInteroperabilityStandard
5
+ module V6
6
+ PROFILE = Profile.new(
7
+ builders: ::Meibo::PSEInteroperabilityStandard::V5::PROFILE.builders.merge(
8
+ enrollment: ::Meibo::Builder::EnrollmentBuilder.create(::Meibo::PSEInteroperabilityStandard::V6::Enrollment)
9
+ ),
10
+ data_models: ::Meibo::PSEInteroperabilityStandard::V5::PROFILE.data_models.merge(
11
+ file_enrollments: ::Meibo::PSEInteroperabilityStandard::V6::Enrollment
12
+ ),
13
+ data_set: ::Meibo::PSEInteroperabilityStandard::V5::PROFILE.data_set,
14
+ manifest_properties: ::Meibo::JapanK12SchoolsProfile::V1::PROFILE.manifest_properties
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module PSEInteroperabilityStandard
5
+ end
6
+ end