meibo 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -4
- data/.rubocop_todo.yml +130 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +11 -2
- data/lib/meibo/academic_session.rb +17 -16
- data/lib/meibo/builder/academic_session_builder.rb +2 -2
- data/lib/meibo/builder/base_builder.rb +3 -2
- data/lib/meibo/builder/classroom_builder.rb +3 -3
- data/lib/meibo/builder/course_builder.rb +3 -3
- data/lib/meibo/builder/demographic_builder.rb +2 -2
- data/lib/meibo/builder/enrollment_builder.rb +3 -3
- data/lib/meibo/builder/organization_builder.rb +2 -2
- data/lib/meibo/builder/role_builder.rb +3 -3
- data/lib/meibo/builder/user_builder.rb +2 -2
- data/lib/meibo/builder/user_profile_builder.rb +3 -3
- data/lib/meibo/builder.rb +3 -2
- data/lib/meibo/classroom.rb +27 -28
- data/lib/meibo/classroom_set.rb +1 -3
- data/lib/meibo/converter.rb +29 -31
- data/lib/meibo/course.rb +15 -16
- data/lib/meibo/course_set.rb +1 -3
- data/lib/meibo/data_model.rb +6 -9
- data/lib/meibo/data_set.rb +17 -8
- data/lib/meibo/demographic.rb +30 -29
- data/lib/meibo/enrollment.rb +18 -17
- data/lib/meibo/factory_bot/academic_session.rb +3 -3
- data/lib/meibo/factory_bot/all.rb +11 -11
- data/lib/meibo/factory_bot/classroom.rb +4 -4
- data/lib/meibo/factory_bot/course.rb +4 -4
- data/lib/meibo/factory_bot/demographic.rb +3 -3
- data/lib/meibo/factory_bot/enrollment.rb +3 -3
- data/lib/meibo/factory_bot/manifest.rb +2 -2
- data/lib/meibo/factory_bot/organization.rb +15 -12
- data/lib/meibo/factory_bot/role.rb +3 -3
- data/lib/meibo/factory_bot/roster.rb +2 -2
- data/lib/meibo/factory_bot/user.rb +6 -6
- data/lib/meibo/factory_bot/user_profile.rb +7 -7
- data/lib/meibo/japan_profile/academic_session.rb +4 -2
- data/lib/meibo/japan_profile/classroom.rb +1 -1
- data/lib/meibo/japan_profile/course.rb +2 -2
- data/lib/meibo/japan_profile/enrollment.rb +9 -8
- data/lib/meibo/japan_profile/organization.rb +2 -2
- data/lib/meibo/japan_profile/role.rb +3 -3
- data/lib/meibo/japan_profile/user.rb +6 -5
- data/lib/meibo/japan_profile/user_set.rb +1 -3
- data/lib/meibo/japan_profile.rb +2 -2
- data/lib/meibo/manifest/processing_mode.rb +6 -5
- data/lib/meibo/manifest.rb +47 -41
- data/lib/meibo/organization.rb +16 -15
- data/lib/meibo/profile.rb +3 -3
- data/lib/meibo/reader.rb +11 -7
- data/lib/meibo/role.rb +28 -27
- data/lib/meibo/role_set.rb +1 -3
- data/lib/meibo/roster.rb +64 -41
- data/lib/meibo/user.rb +29 -28
- data/lib/meibo/user_profile.rb +14 -13
- data/lib/meibo/user_set.rb +1 -3
- data/lib/meibo/version.rb +1 -1
- data/lib/meibo.rb +2 -2
- data/meibo.gemspec +2 -0
- metadata +19 -3
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "factory_bot"
|
4
|
+
require "securerandom"
|
5
5
|
|
6
6
|
FactoryBot.define do
|
7
|
-
factory :meibo_role, class:
|
7
|
+
factory :meibo_role, class: "Meibo::Role" do
|
8
8
|
initialize_with { new(**attributes) }
|
9
9
|
|
10
10
|
transient do
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "factory_bot"
|
4
|
+
require "securerandom"
|
5
5
|
|
6
6
|
FactoryBot.define do
|
7
|
-
factory :meibo_user, class:
|
7
|
+
factory :meibo_user, class: "Meibo::User" do
|
8
8
|
initialize_with { new(**attributes) }
|
9
9
|
|
10
10
|
transient do
|
@@ -13,9 +13,9 @@ FactoryBot.define do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
sourced_id { SecureRandom.uuid }
|
16
|
-
sequence(:username) {|n| "user#{n}@example.com" }
|
17
|
-
sequence(:given_name) {|n| "John#{n}" }
|
18
|
-
sequence(:family_name) {|n| "Doe#{n}" }
|
16
|
+
sequence(:username) { |n| "user#{n}@example.com" }
|
17
|
+
sequence(:given_name) { |n| "John#{n}" }
|
18
|
+
sequence(:family_name) { |n| "Doe#{n}" }
|
19
19
|
agent_sourced_ids { agents&.map(&:sourced_id) }
|
20
20
|
primary_org_sourced_id { primary_organization&.sourced_id }
|
21
21
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "factory_bot"
|
4
|
+
require "securerandom"
|
5
5
|
|
6
6
|
FactoryBot.define do
|
7
|
-
factory :meibo_user_profile, class:
|
7
|
+
factory :meibo_user_profile, class: "Meibo::UserProfile" do
|
8
8
|
initialize_with { new(**attributes) }
|
9
9
|
|
10
10
|
transient do
|
@@ -13,10 +13,10 @@ FactoryBot.define do
|
|
13
13
|
|
14
14
|
sourced_id { SecureRandom.uuid }
|
15
15
|
user_sourced_id { user&.sourced_id }
|
16
|
-
profile_type {
|
17
|
-
vendor_id {
|
18
|
-
credential_type {
|
19
|
-
sequence(:username) {|n| "user#{n}"}
|
16
|
+
profile_type { "meibo test" }
|
17
|
+
vendor_id { "meibo" }
|
18
|
+
credential_type { "plain" }
|
19
|
+
sequence(:username) { |n| "user#{n}" }
|
20
20
|
|
21
21
|
trait :jp do
|
22
22
|
initialize_with { Meibo::JapanProfile::UserProfile.new(**attributes) }
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Meibo
|
4
4
|
class JapanProfile < ::Meibo::Profile
|
5
5
|
class AcademicSession < ::Meibo::AcademicSession
|
6
|
-
TYPES = { school_year:
|
6
|
+
TYPES = { school_year: "schoolYear" }.freeze
|
7
7
|
|
8
8
|
DataModel.define(
|
9
9
|
self,
|
@@ -18,7 +18,9 @@ module Meibo
|
|
18
18
|
# - typeはschoolYear固定
|
19
19
|
# - start_dateは対象年度の開始日固定
|
20
20
|
# - end_dateは対象年度の終了日固定
|
21
|
-
def initialize(school_year:, title: "#{school_year}年度", type: TYPES[:school_year],
|
21
|
+
def initialize(school_year:, title: "#{school_year}年度", type: TYPES[:school_year],
|
22
|
+
start_date: Date.new(school_year, 4,
|
23
|
+
1), end_date: Date.new(school_year + 1, 3, 31), **other_fields)
|
22
24
|
super(school_year: school_year, title: title, type: type, start_date: start_date, end_date: end_date, **other_fields)
|
23
25
|
end
|
24
26
|
end
|
@@ -6,7 +6,7 @@ module Meibo
|
|
6
6
|
DataModel.define(
|
7
7
|
self,
|
8
8
|
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map.merge(
|
9
|
-
special_needs:
|
9
|
+
special_needs: "metadata.jp.specialNeeds"
|
10
10
|
).freeze,
|
11
11
|
converters: superclass.converters.merge(
|
12
12
|
boolean: [:special_needs].freeze,
|
@@ -6,11 +6,11 @@ module Meibo
|
|
6
6
|
DataModel.define(
|
7
7
|
self,
|
8
8
|
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
|
9
|
-
converters: superclass.converters.merge(enum: { course_code: [
|
9
|
+
converters: superclass.converters.merge(enum: { course_code: [""].freeze }.freeze)
|
10
10
|
)
|
11
11
|
|
12
12
|
# NOTE: courseCodeは空文字固定
|
13
|
-
def initialize(course_code:
|
13
|
+
def initialize(course_code: "", **other_fields)
|
14
14
|
super(course_code: course_code, **other_fields)
|
15
15
|
end
|
16
16
|
end
|
@@ -4,17 +4,17 @@ module Meibo
|
|
4
4
|
class JapanProfile < ::Meibo::Profile
|
5
5
|
class Enrollment < ::Meibo::Enrollment
|
6
6
|
ROLES = {
|
7
|
-
student:
|
8
|
-
teacher:
|
9
|
-
administrator:
|
10
|
-
guardian:
|
7
|
+
student: "student",
|
8
|
+
teacher: "teacher",
|
9
|
+
administrator: "administrator",
|
10
|
+
guardian: "guardian"
|
11
11
|
}.freeze
|
12
12
|
|
13
13
|
DataModel.define(
|
14
14
|
self,
|
15
|
-
|
16
|
-
shusseki_no:
|
17
|
-
public_flg:
|
15
|
+
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map.merge(
|
16
|
+
shusseki_no: "metadata.jp.ShussekiNo",
|
17
|
+
public_flg: "metadata.jp.PublicFlg"
|
18
18
|
).freeze,
|
19
19
|
converters: superclass.converters.merge(
|
20
20
|
boolean: [*superclass.converters[:boolean], :public_flg].freeze,
|
@@ -25,7 +25,8 @@ module Meibo
|
|
25
25
|
|
26
26
|
# NOTE: 児童生徒の場合primaryはfalse固定
|
27
27
|
# MEMO: 保護者の場合もそうでは?
|
28
|
-
def initialize(shusseki_no: nil, public_flg: nil,
|
28
|
+
def initialize(role:, shusseki_no: nil, public_flg: nil, primary: (role == ROLES[:student] ? false : nil),
|
29
|
+
**other_fields)
|
29
30
|
super(role: role, primary: primary, **other_fields)
|
30
31
|
@shusseki_no = shusseki_no
|
31
32
|
@public_flg = public_flg
|
@@ -9,9 +9,9 @@ module Meibo
|
|
9
9
|
# - 保護者の場合guardian
|
10
10
|
# MEMO: enrollments.csvの方ではadministratorとguardianも許可されているがズレてないか
|
11
11
|
ROLES = {
|
12
|
-
teacher:
|
13
|
-
student:
|
14
|
-
guardian:
|
12
|
+
teacher: "teacher",
|
13
|
+
student: "student",
|
14
|
+
guardian: "guardian"
|
15
15
|
}.freeze
|
16
16
|
|
17
17
|
DataModel.define(
|
@@ -6,16 +6,17 @@ module Meibo
|
|
6
6
|
DataModel.define(
|
7
7
|
self,
|
8
8
|
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map.merge(
|
9
|
-
kana_given_name:
|
10
|
-
kana_family_name:
|
11
|
-
kana_middle_name:
|
12
|
-
home_class:
|
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
13
|
).freeze,
|
14
14
|
converters: superclass.converters
|
15
15
|
)
|
16
16
|
|
17
17
|
# NOTE: enabled_userは必須ではないが固定
|
18
|
-
def initialize(enabled_user: true, kana_given_name: nil, kana_family_name: nil, kana_middle_name: nil,
|
18
|
+
def initialize(enabled_user: true, kana_given_name: nil, kana_family_name: nil, kana_middle_name: nil,
|
19
|
+
home_class: nil, **other_fields)
|
19
20
|
super(enabled_user: enabled_user, **other_fields)
|
20
21
|
@kana_given_name = kana_given_name
|
21
22
|
@kana_family_name = kana_family_name
|
data/lib/meibo/japan_profile.rb
CHANGED
@@ -12,7 +12,7 @@ module Meibo
|
|
12
12
|
role: Builder::RoleBuilder.create(Role),
|
13
13
|
user: Builder::UserBuilder.create(User),
|
14
14
|
user_profile: Builder::UserProfileBuilder.create(UserProfile)
|
15
|
-
}
|
15
|
+
}.freeze
|
16
16
|
|
17
17
|
DATA_MODELS = {
|
18
18
|
file_academic_sessions: AcademicSession,
|
@@ -24,7 +24,7 @@ module Meibo
|
|
24
24
|
file_roles: Role,
|
25
25
|
file_user_profiles: UserProfile,
|
26
26
|
file_users: User
|
27
|
-
}
|
27
|
+
}.freeze
|
28
28
|
|
29
29
|
DATA_SET = ::Meibo::Profile::DATA_SET.merge(
|
30
30
|
users: UserSet
|
@@ -11,21 +11,22 @@ module Meibo
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def absent?
|
14
|
-
@mode ==
|
14
|
+
@mode == "absent"
|
15
15
|
end
|
16
16
|
|
17
17
|
def bulk?
|
18
|
-
@mode ==
|
18
|
+
@mode == "bulk"
|
19
19
|
end
|
20
20
|
|
21
21
|
def delta?
|
22
|
-
@mode ==
|
22
|
+
@mode == "delta"
|
23
23
|
end
|
24
24
|
|
25
25
|
def ==(other)
|
26
|
-
|
26
|
+
case other
|
27
|
+
when ProcessingMode
|
27
28
|
@mode == other.mode
|
28
|
-
|
29
|
+
when String
|
29
30
|
to_s == other
|
30
31
|
else
|
31
32
|
false
|
data/lib/meibo/manifest.rb
CHANGED
@@ -2,43 +2,45 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class Manifest
|
5
|
-
MANIFEST_VERSION =
|
6
|
-
ONEROSTER_VERSION =
|
5
|
+
MANIFEST_VERSION = "1.0"
|
6
|
+
ONEROSTER_VERSION = "1.2"
|
7
7
|
|
8
8
|
PROCESSING_MODES = {
|
9
|
-
absent: ProcessingMode.new(
|
10
|
-
bulk: ProcessingMode.new(
|
11
|
-
delta: ProcessingMode.new(
|
9
|
+
absent: ProcessingMode.new("absent"),
|
10
|
+
bulk: ProcessingMode.new("bulk"),
|
11
|
+
delta: ProcessingMode.new("delta")
|
12
12
|
}.freeze
|
13
13
|
|
14
14
|
PROPERTY_NAME_TO_ATTRIBUTE_MAP = {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
15
|
+
"manifest.version" => :manifest_version,
|
16
|
+
"oneroster.version" => :oneroster_version,
|
17
|
+
"file.academicSessions" => :file_academic_sessions,
|
18
|
+
"file.categories" => :file_categories,
|
19
|
+
"file.classes" => :file_classes,
|
20
|
+
"file.classResources" => :file_class_resources,
|
21
|
+
"file.courses" => :file_courses,
|
22
|
+
"file.courseResources" => :file_course_resources,
|
23
|
+
"file.demographics" => :file_demographics,
|
24
|
+
"file.enrollments" => :file_enrollments,
|
25
|
+
"file.lineItemLearningObjectiveIds" => :file_line_item_learning_objective_ids,
|
26
|
+
"file.lineItems" => :file_line_items,
|
27
|
+
"file.lineItemScoreScales" => :file_line_item_score_scales,
|
28
|
+
"file.orgs" => :file_orgs,
|
29
|
+
"file.resources" => :file_resources,
|
30
|
+
"file.resultLearningObjectiveIds" => :file_result_learning_objective_ids,
|
31
|
+
"file.results" => :file_results,
|
32
|
+
"file.resultScoreScales" => :file_result_score_scales,
|
33
|
+
"file.roles" => :file_roles,
|
34
|
+
"file.scoreScales" => :file_score_scales,
|
35
|
+
"file.userProfiles" => :file_user_profiles,
|
36
|
+
"file.userResources" => :file_user_resources,
|
37
|
+
"file.users" => :file_users,
|
38
|
+
"source.systemName" => :source_system_name,
|
39
|
+
"source.systemCode" => :source_system_code
|
40
40
|
}.freeze
|
41
|
-
ATTRIBUTE_TO_PROPERTY_NAME_MAP = PROPERTY_NAME_TO_ATTRIBUTE_MAP.to_h
|
41
|
+
ATTRIBUTE_TO_PROPERTY_NAME_MAP = PROPERTY_NAME_TO_ATTRIBUTE_MAP.to_h do |property_name, attribute|
|
42
|
+
[attribute, property_name]
|
43
|
+
end.freeze
|
42
44
|
|
43
45
|
# NOTE: 想定値
|
44
46
|
DEFAULT_VALUES = {
|
@@ -67,19 +69,20 @@ module Meibo
|
|
67
69
|
file_users: PROCESSING_MODES[:bulk]
|
68
70
|
}.freeze
|
69
71
|
|
70
|
-
attr_reader :manifest_version, :oneroster_version, :file_academic_sessions, :file_categories, :file_classes,
|
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
|
71
74
|
|
72
75
|
def self.build_from_default(**custom_properties)
|
73
76
|
new(**Manifest::DEFAULT_VALUES.merge(custom_properties))
|
74
77
|
end
|
75
78
|
|
76
79
|
def self.filename
|
77
|
-
|
80
|
+
"manifest.csv"
|
78
81
|
end
|
79
82
|
|
80
83
|
attribute_name_to_header_field_map = {
|
81
|
-
property_name:
|
82
|
-
value:
|
84
|
+
property_name: "propertyName",
|
85
|
+
value: "value"
|
83
86
|
}
|
84
87
|
header_fields = attribute_name_to_header_field_map.values
|
85
88
|
define_singleton_method(:header_fields) { header_fields }
|
@@ -92,17 +95,20 @@ module Meibo
|
|
92
95
|
def self.filename_for(attribute)
|
93
96
|
property_name = attribute_to_property_name(attribute)
|
94
97
|
|
95
|
-
raise Meibo::Error, "#{property_name}はファイルのプロパティではありません" unless property_name.start_with?(
|
98
|
+
raise Meibo::Error, "#{property_name}はファイルのプロパティではありません" unless property_name.start_with?("file.")
|
96
99
|
|
97
|
-
property_name.split(
|
100
|
+
"#{property_name.split("file.", 2).last}.csv"
|
98
101
|
end
|
99
102
|
|
100
103
|
def self.parse(csv)
|
101
104
|
properties = CSV.parse(csv, encoding: Meibo::CSV_ENCODING, headers: true, header_converters: header_converters)
|
102
|
-
new(**properties.to_h
|
105
|
+
new(**properties.to_h do |property|
|
106
|
+
[PROPERTY_NAME_TO_ATTRIBUTE_MAP.fetch(property[:property_name]), property[:value]]
|
107
|
+
end)
|
103
108
|
end
|
104
109
|
|
105
|
-
def initialize(manifest_version:, oneroster_version:, file_academic_sessions:, file_categories:, file_classes:,
|
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)
|
106
112
|
@manifest_version = manifest_version
|
107
113
|
@oneroster_version = oneroster_version
|
108
114
|
@file_academic_sessions = file_academic_sessions
|
@@ -138,7 +144,7 @@ module Meibo
|
|
138
144
|
|
139
145
|
def file_attributes(processing_mode:)
|
140
146
|
PROPERTY_NAME_TO_ATTRIBUTE_MAP.values.filter_map do |attribute|
|
141
|
-
attribute.start_with?(
|
147
|
+
attribute.start_with?("file_") && public_send(attribute) == processing_mode.to_s && attribute
|
142
148
|
end
|
143
149
|
end
|
144
150
|
|
@@ -157,7 +163,7 @@ module Meibo
|
|
157
163
|
end
|
158
164
|
|
159
165
|
def to_h
|
160
|
-
PROPERTY_NAME_TO_ATTRIBUTE_MAP.values.to_h {|attribute| [attribute, public_send(attribute)] }
|
166
|
+
PROPERTY_NAME_TO_ATTRIBUTE_MAP.values.to_h { |attribute| [attribute, public_send(attribute)] }
|
161
167
|
end
|
162
168
|
end
|
163
169
|
end
|
data/lib/meibo/organization.rb
CHANGED
@@ -3,34 +3,35 @@
|
|
3
3
|
module Meibo
|
4
4
|
class Organization
|
5
5
|
TYPES = {
|
6
|
-
department:
|
7
|
-
school:
|
8
|
-
district:
|
9
|
-
local:
|
10
|
-
state:
|
11
|
-
national:
|
6
|
+
department: "department",
|
7
|
+
school: "school",
|
8
|
+
district: "district",
|
9
|
+
local: "local",
|
10
|
+
state: "state",
|
11
|
+
national: "national"
|
12
12
|
}.freeze
|
13
13
|
|
14
14
|
DataModel.define(
|
15
15
|
self,
|
16
16
|
attribute_name_to_header_field_map: {
|
17
|
-
sourced_id:
|
18
|
-
status:
|
19
|
-
date_last_modified:
|
20
|
-
name:
|
21
|
-
type:
|
22
|
-
identifier:
|
23
|
-
parent_sourced_id:
|
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
24
|
},
|
25
25
|
converters: {
|
26
26
|
datetime: [:date_last_modified],
|
27
27
|
enum: { type: [*TYPES.values, ENUM_EXT_PATTERN].freeze },
|
28
|
-
required: [
|
28
|
+
required: %i[sourced_id name type],
|
29
29
|
status: [:status]
|
30
30
|
}
|
31
31
|
)
|
32
32
|
|
33
|
-
def initialize(sourced_id:,
|
33
|
+
def initialize(sourced_id:, name:, type:, status: nil, date_last_modified: nil, identifier: nil,
|
34
|
+
parent_sourced_id: (type == TYPES[:district] ? "NULL" : nil), **extension_fields)
|
34
35
|
@sourced_id = sourced_id
|
35
36
|
@status = status
|
36
37
|
@date_last_modified = date_last_modified
|
data/lib/meibo/profile.rb
CHANGED
@@ -12,7 +12,7 @@ module Meibo
|
|
12
12
|
role: Builder::RoleBuilder.create(Role),
|
13
13
|
user: Builder::UserBuilder.create(User),
|
14
14
|
user_profile: Builder::UserProfileBuilder.create(UserProfile)
|
15
|
-
}
|
15
|
+
}.freeze
|
16
16
|
|
17
17
|
DATA_MODELS = {
|
18
18
|
file_academic_sessions: Meibo::AcademicSession,
|
@@ -24,7 +24,7 @@ module Meibo
|
|
24
24
|
file_roles: Meibo::Role,
|
25
25
|
file_user_profiles: Meibo::UserProfile,
|
26
26
|
file_users: Meibo::User
|
27
|
-
}
|
27
|
+
}.freeze
|
28
28
|
|
29
29
|
DATA_SET = {
|
30
30
|
academic_sessions: Meibo::AcademicSessionSet,
|
@@ -36,7 +36,7 @@ module Meibo
|
|
36
36
|
roles: Meibo::RoleSet,
|
37
37
|
user_profiles: Meibo::UserProfileSet,
|
38
38
|
users: Meibo::UserSet
|
39
|
-
}
|
39
|
+
}.freeze
|
40
40
|
|
41
41
|
attr_reader :builders, :data_models, :data_set
|
42
42
|
|
data/lib/meibo/reader.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "csv"
|
4
|
+
require "zip"
|
5
5
|
|
6
6
|
module Meibo
|
7
7
|
class Reader
|
@@ -11,6 +11,12 @@ module Meibo
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.open_buffer(io, profile: Meibo.default_profile)
|
15
|
+
Zip::File.open_buffer(io) do |zipfile|
|
16
|
+
yield new(zipfile: zipfile, profile: profile)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
14
20
|
attr_reader :profile, :zipfile
|
15
21
|
|
16
22
|
def initialize(zipfile:, profile:)
|
@@ -112,11 +118,9 @@ module Meibo
|
|
112
118
|
file_roles: :roles,
|
113
119
|
file_users: :users,
|
114
120
|
file_user_profiles: :user_profiles
|
115
|
-
}.filter_map
|
116
|
-
if bulk_file_attributes.include?(file_attribute)
|
117
|
-
|
118
|
-
end
|
119
|
-
}.to_h
|
121
|
+
}.filter_map do |file_attribute, data_method|
|
122
|
+
[data_method, public_send(data_method).to_a] if bulk_file_attributes.include?(file_attribute)
|
123
|
+
end.to_h
|
120
124
|
end
|
121
125
|
|
122
126
|
def file_entry?(filename)
|
data/lib/meibo/role.rb
CHANGED
@@ -3,43 +3,43 @@
|
|
3
3
|
module Meibo
|
4
4
|
class Role
|
5
5
|
TYPES = {
|
6
|
-
primary:
|
7
|
-
secondary:
|
6
|
+
primary: "primary",
|
7
|
+
secondary: "secondary"
|
8
8
|
}.freeze
|
9
9
|
|
10
10
|
ROLES = {
|
11
|
-
aide:
|
12
|
-
counselor:
|
13
|
-
district_administrator:
|
14
|
-
guardian:
|
15
|
-
parent:
|
16
|
-
principal:
|
17
|
-
proctor:
|
18
|
-
relative:
|
19
|
-
site_administrator:
|
20
|
-
student:
|
21
|
-
system_administrator:
|
22
|
-
teacher:
|
11
|
+
aide: "aide",
|
12
|
+
counselor: "counselor",
|
13
|
+
district_administrator: "districtAdministrator",
|
14
|
+
guardian: "guardian",
|
15
|
+
parent: "parent",
|
16
|
+
principal: "principal",
|
17
|
+
proctor: "proctor",
|
18
|
+
relative: "relative",
|
19
|
+
site_administrator: "siteAdministrator",
|
20
|
+
student: "student",
|
21
|
+
system_administrator: "systemAdministrator",
|
22
|
+
teacher: "teacher"
|
23
23
|
}.freeze
|
24
24
|
|
25
25
|
DataModel.define(
|
26
26
|
self,
|
27
27
|
attribute_name_to_header_field_map: {
|
28
|
-
sourced_id:
|
29
|
-
status:
|
30
|
-
date_last_modified:
|
31
|
-
user_sourced_id:
|
32
|
-
role_type:
|
33
|
-
role:
|
34
|
-
begin_date:
|
35
|
-
end_date:
|
36
|
-
org_sourced_id:
|
37
|
-
user_profile_sourced_id:
|
28
|
+
sourced_id: "sourcedId",
|
29
|
+
status: "status",
|
30
|
+
date_last_modified: "dateLastModified",
|
31
|
+
user_sourced_id: "userSourcedId",
|
32
|
+
role_type: "roleType",
|
33
|
+
role: "role",
|
34
|
+
begin_date: "beginDate",
|
35
|
+
end_date: "endDate",
|
36
|
+
org_sourced_id: "orgSourcedId",
|
37
|
+
user_profile_sourced_id: "userProfileSourcedId"
|
38
38
|
}.freeze,
|
39
39
|
converters: {
|
40
|
-
date: [
|
40
|
+
date: %i[begin_date end_date].freeze,
|
41
41
|
datetime: [:date_last_modified].freeze,
|
42
|
-
required: [
|
42
|
+
required: %i[sourced_id user_sourced_id role_type role org_sourced_id].freeze,
|
43
43
|
enum: {
|
44
44
|
role: [*ROLES.values, ENUM_EXT_PATTERN].freeze,
|
45
45
|
role_type: TYPES.values.freeze
|
@@ -48,7 +48,8 @@ module Meibo
|
|
48
48
|
}.freeze
|
49
49
|
)
|
50
50
|
|
51
|
-
def initialize(sourced_id:,
|
51
|
+
def initialize(sourced_id:, user_sourced_id:, role_type:, role:, org_sourced_id:, status: nil, date_last_modified: nil,
|
52
|
+
begin_date: nil, end_date: nil, user_profile_sourced_id: nil, **extension_fields)
|
52
53
|
@sourced_id = sourced_id
|
53
54
|
@status = status
|
54
55
|
@date_last_modified = date_last_modified
|
data/lib/meibo/role_set.rb
CHANGED
@@ -9,9 +9,7 @@ module Meibo
|
|
9
9
|
roster.organizations.find(role.org_sourced_id)
|
10
10
|
roster.users.find(role.user_sourced_id)
|
11
11
|
|
12
|
-
if role.user_profile_sourced_id
|
13
|
-
roster.user_profiles.find(role.user_profile_sourced_id)
|
14
|
-
end
|
12
|
+
roster.user_profiles.find(role.user_profile_sourced_id) if role.user_profile_sourced_id
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|