meibo 0.27.1 → 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 +5 -5
  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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V3
6
+ class Enrollment < ::Meibo::JapanProfile::V1_1::Enrollment
7
+ define_converters(superclass.converters.merge(required: [*superclass.converters[:required], :primary]))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V3
6
+ class Organization < ::Meibo::JapanProfile::V1_1::Organization
7
+ define_converters(superclass.converters.merge(fullwidth: [*superclass.converters[:fullwidth], :name]))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V3
6
+ class User < ::Meibo::JapanProfile::V1_1::User
7
+ define_converters(
8
+ superclass.converters.merge(
9
+ fullwidth: [*superclass.converters[:fullwidth], :given_name, :family_name, :middle_name, :preferred_given_name, :preferred_middle_name, :preferred_family_name, :kana_given_name, :kana_family_name, :kana_middle_name],
10
+ required: [*superclass.converters[:required], :user_master_identifier, :preferred_given_name, :preferred_family_name, :kana_given_name, :kana_family_name]
11
+ )
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V3
6
+ class UserProfile < ::Meibo::JapanProfile::V1_1::UserProfile
7
+ define_converters(superclass.converters.merge(fullwidth: [*superclass.converters[:fullwidth], :description]))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V3
6
+ include ::Meibo::JapanProfile::V1_1
7
+
8
+ PROFILE = Profile.new(
9
+ builders: ::Meibo::JapanProfile::V1_1::PROFILE.builders.merge(
10
+ class: Builder::ClassroomBuilder.create(::Meibo::Eportal::V3::Classroom),
11
+ course: Builder::CourseBuilder.create(::Meibo::Eportal::V3::Course),
12
+ enrollment: Builder::EnrollmentBuilder.create(::Meibo::Eportal::V3::Enrollment),
13
+ org: Builder::OrganizationBuilder.create(::Meibo::Eportal::V3::Organization),
14
+ user_profile: Builder::UserProfileBuilder.create(::Meibo::Eportal::V3::UserProfile),
15
+ user: Builder::UserBuilder.create(::Meibo::Eportal::V3::User)
16
+ ),
17
+ data_models: ::Meibo::JapanProfile::V1_1::PROFILE.data_models.merge(
18
+ file_classes: ::Meibo::Eportal::V3::Classroom,
19
+ file_courses: ::Meibo::Eportal::V3::Course,
20
+ file_enrollments: ::Meibo::Eportal::V3::Enrollment,
21
+ file_orgs: ::Meibo::Eportal::V3::Organization,
22
+ file_user_profiles: ::Meibo::Eportal::V3::UserProfile,
23
+ file_users: ::Meibo::Eportal::V3::User
24
+ ),
25
+ data_set: ::Meibo::JapanProfile::V1_1::PROFILE.data_set,
26
+ manifest_properties: { oneroster_version: "1.2" }
27
+ )
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V4
6
+ class User < ::Meibo::JapanProfile::V1_2::User
7
+ define_converters(
8
+ superclass.converters.merge(
9
+ fullwidth: [
10
+ *superclass.converters[:fullwidth],
11
+ :given_name,
12
+ :family_name,
13
+ :middle_name,
14
+ :preferred_given_name,
15
+ :preferred_middle_name,
16
+ :preferred_family_name,
17
+ :kana_given_name,
18
+ :kana_family_name,
19
+ :kana_middle_name,
20
+ :kana_preferred_family_name,
21
+ :kana_preferred_given_name,
22
+ :kana_preferred_middle_name
23
+ ],
24
+ required: [
25
+ *superclass.converters[:required],
26
+ :user_master_identifier,
27
+ :preferred_given_name,
28
+ :preferred_family_name,
29
+ :kana_given_name,
30
+ :kana_family_name
31
+ ]
32
+ )
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ module V4
6
+ include ::Meibo::Eportal::V3
7
+
8
+ PROFILE = Profile.new(
9
+ builders: ::Meibo::Eportal::V3::PROFILE.builders.merge(user: Builder::UserBuilder.create(::Meibo::Eportal::V4::User)),
10
+ data_models: ::Meibo::Eportal::V3::PROFILE.data_models.merge(file_users: ::Meibo::Eportal::V4::User),
11
+ data_set: ::Meibo::Eportal::V3::PROFILE.data_set,
12
+ manifest_properties: { oneroster_version: "1.2.1" }
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module Eportal
5
+ end
6
+ end
data/lib/meibo/errors.rb CHANGED
@@ -2,16 +2,37 @@
2
2
 
3
3
  module Meibo
4
4
  class Error < StandardError; end
5
- class CsvFileNotFoundError < Error; end
5
+
6
+ class CsvFileNotFoundError < Error
7
+ attr_reader :filename
8
+
9
+ def initialize(message = nil, filename:, **kw)
10
+ super(message, **kw)
11
+
12
+ @filename = filename
13
+ end
14
+ end
15
+
6
16
  class DataNotFoundError < Error; end
7
- class InvalidDataTypeError < Error; end
8
- class MissingDataError < Error; end
17
+
18
+ class InvalidDataTypeError < Error
19
+ attr_reader :field, :field_info
20
+
21
+ def initialize(message = nil, field:, field_info:, **kw)
22
+ super(message, **kw)
23
+
24
+ @field = field
25
+ @field_info = field_info
26
+ end
27
+ end
28
+
29
+ class MissingDataError < InvalidDataTypeError; end
9
30
 
10
31
  class MissingHeaderFieldsError < Error
11
32
  attr_reader :missing_header_fields
12
33
 
13
- def initialize(message = nil, missing_header_fields:)
14
- super(message)
34
+ def initialize(message = nil, missing_header_fields:, **kw)
35
+ super(message, **kw)
15
36
  @missing_header_fields = missing_header_fields
16
37
  end
17
38
  end
@@ -19,4 +40,5 @@ module Meibo
19
40
  class NotSupportedError < Error; end
20
41
  class ScrambledHeaderFieldsError < Error; end
21
42
  class SourcedIdDuplicatedError < Error; end
43
+ class SubjectsAndSubjectCodesLengthNotMatch < Error; end
22
44
  end
@@ -37,7 +37,7 @@ FactoryBot.define do
37
37
  end
38
38
 
39
39
  trait :jp do
40
- initialize_with { Meibo::JapanProfile::AcademicSession.new(**attributes) }
40
+ initialize_with { Meibo::JapanProfile::V1_2::AcademicSession.new(**attributes) }
41
41
  end
42
42
  end
43
43
  end
@@ -29,7 +29,7 @@ FactoryBot.define do
29
29
  end
30
30
 
31
31
  trait :jp do
32
- initialize_with { Meibo::JapanProfile::Classroom.new(**attributes) }
32
+ initialize_with { Meibo::JapanProfile::V1_2::Classroom.new(**attributes) }
33
33
  end
34
34
 
35
35
  trait :special_needs do
@@ -19,7 +19,7 @@ FactoryBot.define do
19
19
  org_sourced_id { organization&.sourced_id }
20
20
 
21
21
  trait :jp do
22
- initialize_with { Meibo::JapanProfile::Course.new(**attributes) }
22
+ initialize_with { Meibo::JapanProfile::V1_2::Course.new(**attributes) }
23
23
  end
24
24
  end
25
25
  end
@@ -14,7 +14,7 @@ FactoryBot.define do
14
14
  sourced_id { user&.sourced_id || SecureRandom.uuid }
15
15
 
16
16
  trait :jp do
17
- initialize_with { Meibo::JapanProfile::Demographic.new(**attributes) }
17
+ initialize_with { Meibo::JapanProfile::V1_2::Demographic.new(**attributes) }
18
18
  end
19
19
 
20
20
  trait :male do
@@ -35,7 +35,7 @@ FactoryBot.define do
35
35
  end
36
36
 
37
37
  trait :jp do
38
- initialize_with { Meibo::JapanProfile::Enrollment.new(**attributes) }
38
+ initialize_with { Meibo::JapanProfile::V1_2::Enrollment.new(**attributes) }
39
39
  end
40
40
 
41
41
  trait :guardian do
@@ -8,26 +8,5 @@ FactoryBot.define do
8
8
 
9
9
  manifest_version { Meibo::Manifest::EXPECTED_VALUES[:manifest_version] }
10
10
  oneroster_version { Meibo::Manifest::EXPECTED_VALUES[:oneroster_version] }
11
- file_academic_sessions { Meibo::Manifest::EXPECTED_VALUES[:file_academic_sessions] }
12
- file_categories { Meibo::Manifest::EXPECTED_VALUES[:file_categories] }
13
- file_classes { Meibo::Manifest::EXPECTED_VALUES[:file_classes] }
14
- file_class_resources { Meibo::Manifest::EXPECTED_VALUES[:file_class_resources] }
15
- file_courses { Meibo::Manifest::EXPECTED_VALUES[:file_courses] }
16
- file_course_resources { Meibo::Manifest::EXPECTED_VALUES[:file_course_resources] }
17
- file_demographics { Meibo::Manifest::EXPECTED_VALUES[:file_demographics] }
18
- file_enrollments { Meibo::Manifest::EXPECTED_VALUES[:file_enrollments] }
19
- file_line_item_learning_objective_ids { Meibo::Manifest::EXPECTED_VALUES[:file_line_item_learning_objective_ids] }
20
- file_line_items { Meibo::Manifest::EXPECTED_VALUES[:file_line_items] }
21
- file_line_item_score_scales { Meibo::Manifest::EXPECTED_VALUES[:file_line_item_score_scales] }
22
- file_orgs { Meibo::Manifest::EXPECTED_VALUES[:file_orgs] }
23
- file_resources { Meibo::Manifest::EXPECTED_VALUES[:file_resources] }
24
- file_result_learning_objective_ids { Meibo::Manifest::EXPECTED_VALUES[:file_result_learning_objective_ids] }
25
- file_results { Meibo::Manifest::EXPECTED_VALUES[:file_results] }
26
- file_result_score_scales { Meibo::Manifest::EXPECTED_VALUES[:file_result_score_scales] }
27
- file_roles { Meibo::Manifest::EXPECTED_VALUES[:file_roles] }
28
- file_score_scales { Meibo::Manifest::EXPECTED_VALUES[:file_score_scales] }
29
- file_user_profiles { Meibo::Manifest::EXPECTED_VALUES[:file_user_profiles] }
30
- file_user_resources { Meibo::Manifest::EXPECTED_VALUES[:file_user_resources] }
31
- file_users { Meibo::Manifest::EXPECTED_VALUES[:file_users] }
32
11
  end
33
12
  end
@@ -64,7 +64,7 @@ FactoryBot.define do
64
64
  end
65
65
 
66
66
  trait :jp do
67
- initialize_with { Meibo::JapanProfile::Organization.new(**attributes) }
67
+ initialize_with { Meibo::JapanProfile::V1_2::Organization.new(**attributes) }
68
68
  sequence(:name) { |n| "第#{n}教委" }
69
69
  end
70
70
  end
@@ -75,14 +75,12 @@ FactoryBot.define do
75
75
  end
76
76
 
77
77
  trait :jp do
78
- jp_version { "1.1" }
78
+ jp_version { "1.1.1" }
79
79
 
80
80
  initialize_with do
81
81
  case jp_version
82
- when "1.1"
82
+ when "1.1", "1.1.1"
83
83
  Meibo::Role.new(**attributes)
84
- when "1.0"
85
- Meibo::JapanProfile::RoleJpM0.new(**attributes)
86
84
  end
87
85
  end
88
86
  end
@@ -9,8 +9,8 @@ FactoryBot.define do
9
9
  case oneroster_version
10
10
  when "1.2.1"
11
11
  new(**attributes)
12
- when "1.2", "1.2.0"
13
- Meibo::UserM0.new(**attributes)
12
+ when "1.2"
13
+ Meibo::OneRoster::V1_2::User.new(**attributes)
14
14
  end
15
15
  end
16
16
 
@@ -35,9 +35,9 @@ FactoryBot.define do
35
35
  initialize_with do
36
36
  case oneroster_version
37
37
  when "1.2.1"
38
- Meibo::JapanProfile::User.new(**attributes)
39
- when "1.2", "1.2.0"
40
- Meibo::JapanProfile::UserM0.new(**attributes)
38
+ Meibo::JapanProfile::V1_2::User.new(**attributes)
39
+ when "1.2"
40
+ Meibo::JapanProfile::V1_1::User.new(**attributes)
41
41
  end
42
42
  end
43
43
 
@@ -19,7 +19,7 @@ FactoryBot.define do
19
19
  sequence(:username) { |n| "user#{n}" }
20
20
 
21
21
  trait :jp do
22
- initialize_with { Meibo::JapanProfile::UserProfile.new(**attributes) }
22
+ initialize_with { Meibo::JapanProfile::V1_2::UserProfile.new(**attributes) }
23
23
  end
24
24
  end
25
25
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanK12SchoolsProfile
5
+ module V1
6
+ class Enrollment < ::Meibo::JapanProfile::V1_2::Enrollment
7
+ define_attributes(
8
+ superclass.attribute_names_to_header_fields.merge(
9
+ shusseki_no: "metadata.jp.shussekiNo",
10
+ public_flg: "metadata.jp.publicFlg"
11
+ )
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanK12SchoolsProfile
5
+ module V1
6
+ include ::Meibo::JapanProfile::V1_2
7
+
8
+ PROFILE = Profile.new(
9
+ builders: ::Meibo::JapanProfile::V1_2::PROFILE.builders.merge(
10
+ enrollment: ::Meibo::Builder::EnrollmentBuilder.create(::Meibo::JapanK12SchoolsProfile::V1::Enrollment)
11
+ ),
12
+ data_models: ::Meibo::JapanProfile::V1_2::PROFILE.data_models.merge(
13
+ file_enrollments: ::Meibo::JapanK12SchoolsProfile::V1::Enrollment
14
+ ),
15
+ data_set: ::Meibo::JapanProfile::V1_2::PROFILE.data_set,
16
+ manifest_properties: { oneroster_version: "1.2_JP" }
17
+ )
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanK12SchoolsProfile
5
+ end
6
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class AcademicSession < ::Meibo::OneRoster::V1_2::AcademicSession
7
+ TYPES = { school_year: "schoolYear" }.freeze
8
+
9
+ define_converters(superclass.converters.merge(format: { title: /\A\d+年度\z/ }, enum: { type: TYPES.values }))
10
+
11
+ # NOTE: 以下固定
12
+ # - titleは連携処理実行時の対象年度西暦 + 「年度」を設定
13
+ # - typeはschoolYear固定
14
+ # - start_dateは対象年度の開始日固定
15
+ # - end_dateは対象年度の終了日固定
16
+ def initialize(
17
+ school_year:,
18
+ title: "#{school_year}年度",
19
+ type: TYPES[:school_year],
20
+ start_date: Date.new(school_year, 4, 1),
21
+ end_date: Date.new(school_year + 1, 3, 31),
22
+ **
23
+ )
24
+ super
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class Classroom < ::Meibo::OneRoster::V1_2::Classroom
7
+ define_attributes(
8
+ superclass.attribute_names_to_header_fields.merge(
9
+ special_needs: "metadata.jp.specialNeeds"
10
+ )
11
+ )
12
+ define_converters(
13
+ superclass.converters.merge(
14
+ boolean: [:special_needs],
15
+ enum: { class_type: TYPES.values },
16
+ mext_grade_code: [:grades]
17
+ )
18
+ )
19
+
20
+ def initialize(special_needs: nil, **)
21
+ super(**)
22
+ @special_needs = special_needs
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class Course < ::Meibo::OneRoster::V1_2::Course
7
+ define_converters(superclass.converters.merge(enum: { course_code: [""] }, mext_grade_code: [:grades]))
8
+
9
+ # NOTE: courseCodeは空文字固定
10
+ def initialize(course_code: "", **)
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class Demographic < ::Meibo::OneRoster::V1_2::Demographic
7
+ define_converters(superclass.converters.merge(enum: { sex: SEX.values.freeze }))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class Enrollment < ::Meibo::OneRoster::V1_2::Enrollment
7
+ ROLES = {
8
+ student: "student",
9
+ teacher: "teacher",
10
+ administrator: "administrator",
11
+ guardian: "guardian"
12
+ }.freeze
13
+
14
+ define_attributes(
15
+ superclass.attribute_names_to_header_fields.merge(
16
+ shusseki_no: "metadata.jp.ShussekiNo",
17
+ public_flg: "metadata.jp.PublicFlg"
18
+ )
19
+ )
20
+
21
+ define_converters(
22
+ superclass.converters.merge(
23
+ boolean: [*superclass.converters[:boolean], :public_flg],
24
+ enum: { role: ROLES.values },
25
+ integer: [:shusseki_no]
26
+ )
27
+ )
28
+
29
+ # NOTE: 児童生徒の場合primaryはfalse固定
30
+ # MEMO: 保護者の場合もそうでは?
31
+ def initialize(
32
+ role:,
33
+ shusseki_no: nil,
34
+ public_flg: nil,
35
+ primary: (role == ROLES[:student] ? false : nil),
36
+ **
37
+ )
38
+ super(role: role, primary: primary, **)
39
+ @shusseki_no = shusseki_no
40
+ @public_flg = public_flg
41
+ end
42
+
43
+ def guardian? = role == ROLES[:guardian]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class Organization < ::Meibo::OneRoster::V1_2::Organization
7
+ TYPES = {
8
+ district: "district",
9
+ school: "school"
10
+ }.freeze
11
+
12
+ define_converters(superclass.converters.merge(enum: { type: TYPES.values }))
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class OrganizationSet < ::Meibo::OneRoster::V1_2::OrganizationSet
7
+ def check_semantically_consistent
8
+ super
9
+
10
+ each do |organization|
11
+ next unless organization.parent_sourced_id
12
+
13
+ next unless organization.district?
14
+
15
+ field = organization.parent_sourced_id
16
+ field_info = field_info_from(organization, :parent_sourced_id)
17
+ raise ::Meibo::InvalidDataTypeError.new(field:, field_info:)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class User < ::Meibo::OneRoster::V1_2::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
+ )
14
+ )
15
+
16
+ define_converters(
17
+ superclass.converters.merge(
18
+ mext_grade_code: [:grades].freeze
19
+ )
20
+ )
21
+
22
+ # NOTE: enabled_userは必須ではないが固定
23
+ def initialize(
24
+ enabled_user: true,
25
+ kana_given_name: nil, kana_family_name: nil, kana_middle_name: nil, home_class: 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
+ end
34
+
35
+ def home_classroom = home_class && ::Meibo.current_roster.classes.find(home_class)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ class UserSet < ::Meibo::OneRoster::V1_2::UserSet
7
+ def check_semantically_consistent
8
+ super
9
+
10
+ each do |user|
11
+ roster.classes.find(user.home_class) if user.home_class
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ module V1_1
6
+ include OneRoster::V1_2
7
+
8
+ PROFILE = Profile.new(
9
+ builders: ::Meibo::OneRoster::V1_2::PROFILE.builders.merge(
10
+ academic_session: ::Meibo::Builder::AcademicSessionBuilder.create(::Meibo::JapanProfile::V1_1::AcademicSession),
11
+ class: ::Meibo::Builder::ClassroomBuilder.create(::Meibo::JapanProfile::V1_1::Classroom),
12
+ course: ::Meibo::Builder::CourseBuilder.create(::Meibo::JapanProfile::V1_1::Course),
13
+ demographic: ::Meibo::Builder::DemographicBuilder.create(::Meibo::JapanProfile::V1_1::Demographic),
14
+ enrollment: ::Meibo::Builder::EnrollmentBuilder.create(::Meibo::JapanProfile::V1_1::Enrollment),
15
+ org: ::Meibo::Builder::OrganizationBuilder.create(::Meibo::JapanProfile::V1_1::Organization),
16
+ user: ::Meibo::Builder::UserBuilder.create(::Meibo::JapanProfile::V1_1::User)
17
+ ),
18
+ data_models: ::Meibo::OneRoster::V1_2::PROFILE.data_models.merge(
19
+ file_academic_sessions: ::Meibo::JapanProfile::V1_1::AcademicSession,
20
+ file_classes: ::Meibo::JapanProfile::V1_1::Classroom,
21
+ file_courses: ::Meibo::JapanProfile::V1_1::Course,
22
+ file_demographics: ::Meibo::JapanProfile::V1_1::Demographic,
23
+ file_enrollments: ::Meibo::JapanProfile::V1_1::Enrollment,
24
+ file_orgs: ::Meibo::JapanProfile::V1_1::Organization,
25
+ file_users: ::Meibo::JapanProfile::V1_1::User
26
+ ),
27
+ data_set: ::Meibo::OneRoster::V1_2::PROFILE.data_set.merge(
28
+ file_orgs: ::Meibo::JapanProfile::V1_1::OrganizationSet,
29
+ file_users: ::Meibo::JapanProfile::V1_1::UserSet
30
+ ),
31
+ manifest_properties: { oneroster_version: "1.2" }
32
+ )
33
+ end
34
+ end
35
+ end
@@ -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