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.
- checksums.yaml +4 -4
- data/.envrc +4 -0
- data/.rubocop.yml +14 -2
- data/.rubocop_todo.yml +0 -7
- data/Gemfile.lock +157 -56
- data/README.md +14 -3
- data/flake.lock +188 -0
- data/flake.nix +55 -0
- data/gemset.nix +658 -0
- data/lib/meibo/academic_session.rb +21 -21
- data/lib/meibo/classroom.rb +47 -34
- data/lib/meibo/classroom_set.rb +5 -1
- data/lib/meibo/converter.rb +16 -18
- data/lib/meibo/course.rb +34 -21
- data/lib/meibo/course_set.rb +5 -1
- data/lib/meibo/data_model.rb +46 -36
- data/lib/meibo/data_set.rb +8 -10
- data/lib/meibo/demographic.rb +36 -36
- data/lib/meibo/enrollment.rb +22 -22
- data/lib/meibo/enrollment_set.rb +9 -2
- data/lib/meibo/eportal/v3/classroom.rb +11 -0
- data/lib/meibo/eportal/v3/course.rb +11 -0
- data/lib/meibo/eportal/v3/enrollment.rb +11 -0
- data/lib/meibo/eportal/v3/organization.rb +11 -0
- data/lib/meibo/eportal/v3/user.rb +16 -0
- data/lib/meibo/eportal/v3/user_profile.rb +11 -0
- data/lib/meibo/eportal/v3.rb +30 -0
- data/lib/meibo/eportal/v4/user.rb +37 -0
- data/lib/meibo/eportal/v4.rb +16 -0
- data/lib/meibo/eportal.rb +6 -0
- data/lib/meibo/errors.rb +27 -5
- data/lib/meibo/factory_bot/academic_session.rb +1 -1
- data/lib/meibo/factory_bot/classroom.rb +1 -1
- data/lib/meibo/factory_bot/course.rb +1 -1
- data/lib/meibo/factory_bot/demographic.rb +1 -1
- data/lib/meibo/factory_bot/enrollment.rb +1 -1
- data/lib/meibo/factory_bot/manifest.rb +0 -21
- data/lib/meibo/factory_bot/organization.rb +1 -1
- data/lib/meibo/factory_bot/role.rb +2 -4
- data/lib/meibo/factory_bot/user.rb +7 -7
- data/lib/meibo/factory_bot/user_profile.rb +1 -1
- data/lib/meibo/japan_k12_schools_profile/v1/enrollment.rb +16 -0
- data/lib/meibo/japan_k12_schools_profile/v1.rb +20 -0
- data/lib/meibo/japan_k12_schools_profile.rb +6 -0
- data/lib/meibo/japan_profile/v1_1/academic_session.rb +29 -0
- data/lib/meibo/japan_profile/v1_1/classroom.rb +27 -0
- data/lib/meibo/japan_profile/v1_1/course.rb +16 -0
- data/lib/meibo/japan_profile/v1_1/demographic.rb +11 -0
- data/lib/meibo/japan_profile/v1_1/enrollment.rb +47 -0
- data/lib/meibo/japan_profile/v1_1/organization.rb +16 -0
- data/lib/meibo/japan_profile/v1_1/organization_set.rb +23 -0
- data/lib/meibo/japan_profile/v1_1/user.rb +39 -0
- data/lib/meibo/japan_profile/v1_1/user_set.rb +17 -0
- data/lib/meibo/japan_profile/v1_1.rb +35 -0
- data/lib/meibo/japan_profile/v1_1_1.rb +9 -0
- data/lib/meibo/japan_profile/v1_2/user.rb +42 -0
- data/lib/meibo/japan_profile/v1_2.rb +20 -0
- data/lib/meibo/japan_profile.rb +6 -0
- data/lib/meibo/manifest.rb +41 -46
- data/lib/meibo/oneroster/v1_2/user.rb +43 -0
- data/lib/meibo/oneroster/v1_2.rb +62 -0
- data/lib/meibo/oneroster/v1_2_1.rb +22 -0
- data/lib/meibo/oneroster.rb +6 -0
- data/lib/meibo/organization.rb +17 -17
- data/lib/meibo/processing_mode.rb +53 -0
- data/lib/meibo/profile.rb +8 -4
- data/lib/meibo/profiles.rb +12 -120
- data/lib/meibo/pse_interoperability_standard/v5.rb +9 -0
- data/lib/meibo/pse_interoperability_standard/v6/enrollment.rb +11 -0
- data/lib/meibo/pse_interoperability_standard/v6.rb +18 -0
- data/lib/meibo/pse_interoperability_standard.rb +6 -0
- data/lib/meibo/reader.rb +24 -36
- data/lib/meibo/role.rb +24 -24
- data/lib/meibo/roster.rb +46 -47
- data/lib/meibo/user.rb +35 -35
- data/lib/meibo/user_profile.rb +20 -20
- data/lib/meibo/user_set.rb +1 -1
- data/lib/meibo/version.rb +1 -1
- data/lib/meibo.rb +10 -2
- data/meibo.gemspec +1 -1
- metadata +45 -28
- data/lib/meibo/eportal_v3/classroom.rb +0 -15
- data/lib/meibo/eportal_v3/course.rb +0 -15
- data/lib/meibo/eportal_v3/enrollment.rb +0 -15
- data/lib/meibo/eportal_v3/organization.rb +0 -15
- data/lib/meibo/eportal_v3/user.rb +0 -16
- data/lib/meibo/eportal_v3/user_profile.rb +0 -15
- data/lib/meibo/japan_profile/academic_session.rb +0 -29
- data/lib/meibo/japan_profile/classroom.rb +0 -24
- data/lib/meibo/japan_profile/course.rb +0 -18
- data/lib/meibo/japan_profile/demographic.rb +0 -15
- data/lib/meibo/japan_profile/enrollment.rb +0 -40
- data/lib/meibo/japan_profile/organization.rb +0 -20
- data/lib/meibo/japan_profile/organization_set.rb +0 -17
- data/lib/meibo/japan_profile/role_jp_m0.rb +0 -26
- data/lib/meibo/japan_profile/user.rb +0 -45
- data/lib/meibo/japan_profile/user_m0.rb +0 -12
- data/lib/meibo/japan_profile/user_set.rb +0 -14
- data/lib/meibo/manifest/processing_mode.rb +0 -41
- data/lib/meibo/user_m0.rb +0 -47
|
@@ -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
|
data/lib/meibo/manifest.rb
CHANGED
|
@@ -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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
49
|
+
attribute_names_to_header_fields = {
|
|
84
50
|
property_name: "propertyName",
|
|
85
51
|
value: "value"
|
|
86
|
-
}
|
|
87
|
-
|
|
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(
|
|
111
|
-
|
|
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
|
data/lib/meibo/organization.rb
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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(
|
|
22
|
-
data_set[
|
|
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
|
data/lib/meibo/profiles.rb
CHANGED
|
@@ -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" =>
|
|
118
|
-
"v1.2.1" =>
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
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, &
|
|
127
|
-
Meibo.with_profile(self[profile_name], &
|
|
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,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
|