meibo 0.25.3 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b4170bea30498f0091ba982247d4f9a97cac8f740ae5c6080bb9e5c04c2bc70
4
- data.tar.gz: a9035c251da1ccb1aff600c8c21c91860b543e7c852934e0aac8027b3442b86c
3
+ metadata.gz: 9e6a1efd516a5593328e8a5b9beb0438794d55df3a66d029538ee059b32b8892
4
+ data.tar.gz: 2f81785880efec33097a4cce9c8dcfb0c04f98c8f63234f14d2164e5cbc85fec
5
5
  SHA512:
6
- metadata.gz: 1cb4cf9b78b825a4fc626e8bd69035435a3d7c1228745cc562676b44de8294f3b3934008360697278539709f78843a1da9d2fdbe97162a5bbb5028c6d57e14ba
7
- data.tar.gz: 7fe4f4a9dd50597f75544c69b2c15e67c3c71111669e5c15df4c47f6d96990c816fc57ddd70fc9cf86c094cdb08e90fbf3f0f9970ab18d394703c6b303805987
6
+ metadata.gz: 532c9411284f883ac7ef34904dc0f5ea70a1c4387acae9096a7f21bf6dda554afc1d2b0550e4eff39b470aef914e7ac471d40c424cb69fa5cec239886d774cbc
7
+ data.tar.gz: 3b2c00f2d54bf96563840321e24a463baae82bf27ca97ef18323993d55e2a8cc8d111fdef282952e9c4088e8a0cebf8dd2107c675a0a6b06fc1b8e8d456e93ba
data/.rubocop_todo.yml CHANGED
@@ -50,7 +50,7 @@ Metrics/MethodLength:
50
50
  # Offense count: 1
51
51
  # Configuration parameters: CountComments, CountAsOne.
52
52
  Metrics/ModuleLength:
53
- Max: 237
53
+ Max: 255
54
54
 
55
55
  # Offense count: 16
56
56
  # Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- meibo (0.25.3)
4
+ meibo (0.27.0)
5
5
  csv (>= 3.1.4)
6
6
  rubyzip
7
7
  zeitwerk
@@ -6,7 +6,9 @@ module Meibo
6
6
  super
7
7
 
8
8
  each do |classroom|
9
- roster.organizations.find(classroom.school_sourced_id)
9
+ school = roster.organizations.find(classroom.school_sourced_id)
10
+ raise InvalidDataTypeError unless school.school?
11
+
10
12
  roster.courses.find(classroom.course_sourced_id)
11
13
 
12
14
  raise DataNotFoundError, "termSourcedIdは1つ以上指定してください" if classroom.term_sourced_ids.empty?
@@ -13,6 +13,8 @@ module Meibo
13
13
  date
14
14
  datetime
15
15
  enum
16
+ format
17
+ fullwidth
16
18
  mext_grade_code
17
19
  integer
18
20
  status
@@ -43,9 +45,9 @@ module Meibo
43
45
  fields_to_be_converted = converters[converter_type]
44
46
  method_name = "build_#{converter_type}_field_#{write_or_parser}_converter"
45
47
  if fields_to_be_converted && respond_to?(method_name, true)
46
- if converter_type == :enum
47
- enum_definition = fields_to_be_converted.transform_keys { |field| fields.index(field) }
48
- send(method_name, enum_definition)
48
+ if %i[enum format].include?(converter_type)
49
+ definition = fields_to_be_converted.transform_keys { |field| fields.index(field) }
50
+ send(method_name, definition)
49
51
  else
50
52
  indexes = fields_to_be_converted.map { |field| fields.index(field) }
51
53
  send(method_name, indexes)
@@ -146,7 +148,28 @@ module Meibo
146
148
  return field unless field
147
149
 
148
150
  enum = enum_definition[field_info.index]
149
- raise InvalidDataTypeError if enum&.none? { |pat| field.match?(pat) }
151
+ raise InvalidDataTypeError if enum&.none? { |pat| pat.is_a?(String) ? field == pat : field.match?(pat) }
152
+
153
+ field
154
+ end
155
+ end
156
+
157
+ def build_format_field_parser_converter(format_definition)
158
+ format_definition = format_definition.dup.freeze
159
+ lambda do |field, field_info|
160
+ return field unless field
161
+
162
+ format = format_definition[field_info.index]
163
+ raise InvalidDataTypeError if format && !field.match?(format)
164
+
165
+ field
166
+ end
167
+ end
168
+
169
+ def build_fullwidth_field_parser_converter(fullwidth_field_indexes)
170
+ fullwidth_field_indexes = fullwidth_field_indexes.dup.freeze
171
+ lambda do |field, field_info|
172
+ raise InvalidDataTypeError if field && fullwidth_field_indexes.include?(field_info.index) && field.match?(/[\p{In_Halfwidth_and_Fullwidth_Forms}&&\p{Katakana}]/)
150
173
 
151
174
  field
152
175
  end
@@ -6,7 +6,11 @@ module Meibo
6
6
  super
7
7
 
8
8
  each do |course|
9
- roster.academic_sessions.find(course.school_year_sourced_id) if course.school_year_sourced_id
9
+ if course.school_year_sourced_id
10
+ school_year = roster.academic_sessions.find(course.school_year_sourced_id)
11
+
12
+ raise InvalidDataTypeError unless school_year.school_year?
13
+ end
10
14
 
11
15
  roster.organizations.find(course.org_sourced_id)
12
16
  end
@@ -38,6 +38,7 @@ module Meibo
38
38
  @sourced_id = sourced_id
39
39
  @status = status
40
40
  @date_last_modified = date_last_modified
41
+ @primary = primary
41
42
  @class_sourced_id = class_sourced_id
42
43
  @school_sourced_id = school_sourced_id
43
44
  @user_sourced_id = user_sourced_id
@@ -7,8 +7,11 @@ module Meibo
7
7
 
8
8
  each do |enrollment|
9
9
  roster.classes.find(enrollment.class_sourced_id)
10
- roster.organizations.find(enrollment.school_sourced_id)
10
+ school = roster.organizations.find(enrollment.school_sourced_id)
11
+ raise InvalidDataTypeError unless school.school?
12
+
11
13
  roster.users.find(enrollment.user_sourced_id)
14
+ raise InvalidDataTypeError if enrollment.primary && !enrollment.teacher?
12
15
  end
13
16
  end
14
17
 
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class Classroom < ::Meibo::JapanProfile::Classroom
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ fullwidth: %i[title location].freeze
11
+ ).freeze
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class Course < ::Meibo::JapanProfile::Course
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ fullwidth: %i[title].freeze
11
+ ).freeze
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class Enrollment < ::Meibo::JapanProfile::Enrollment
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ required: [*superclass.converters[:required], :primary].freeze
11
+ ).freeze
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class Organization < ::Meibo::JapanProfile::Organization
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ fullwidth: %i[name].freeze
11
+ ).freeze
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class User < ::Meibo::JapanProfile::UserM0
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ fullwidth: %i[given_name family_name middle_name preferred_given_name preferred_middle_name preferred_family_name kana_given_name kana_family_name kana_middle_name].freeze,
11
+ required: [*superclass.converters[:required], :user_master_identifier, :preferred_given_name, :preferred_family_name, :kana_given_name, :kana_family_name].freeze
12
+ ).freeze
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module EportalV3
5
+ class UserProfile < ::Meibo::UserProfile
6
+ DataModel.define(
7
+ self,
8
+ attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
9
+ converters: superclass.converters.merge(
10
+ fullwidth: %i[description].freeze
11
+ ).freeze
12
+ )
13
+ end
14
+ end
15
+ end
@@ -49,5 +49,9 @@ FactoryBot.define do
49
49
  trait :private do
50
50
  public_flg { false }
51
51
  end
52
+
53
+ trait :eportal do
54
+ primary { false }
55
+ end
52
56
  end
53
57
  end
@@ -65,6 +65,7 @@ FactoryBot.define do
65
65
 
66
66
  trait :jp do
67
67
  initialize_with { Meibo::JapanProfile::Organization.new(**attributes) }
68
+ sequence(:name) { |n| "第#{n}教委" }
68
69
  end
69
70
  end
70
71
  end
@@ -27,6 +27,10 @@ FactoryBot.define do
27
27
  agent_sourced_ids { agents&.map(&:sourced_id) }
28
28
  primary_org_sourced_id { primary_organization&.sourced_id }
29
29
 
30
+ trait :id do
31
+ user_master_identifier { SecureRandom.uuid }
32
+ end
33
+
30
34
  trait :jp do
31
35
  initialize_with do
32
36
  case oneroster_version
@@ -43,5 +47,14 @@ FactoryBot.define do
43
47
 
44
48
  home_class { homeroom&.sourced_id }
45
49
  end
50
+
51
+ trait :eportal do
52
+ id
53
+ jp
54
+ sequence(:preferred_given_name) { |n| "山田#{n}" }
55
+ sequence(:preferred_family_name) { |n| "太郎#{n}" }
56
+ sequence(:kana_given_name) { |n| "ヤマダ#{n}" }
57
+ sequence(:kana_family_name) { |n| "タロウ#{n}" }
58
+ end
46
59
  end
47
60
  end
@@ -9,6 +9,7 @@ module Meibo
9
9
  self,
10
10
  attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map,
11
11
  converters: superclass.converters.merge(
12
+ format: { title: /\A\d+年度\z/ },
12
13
  enum: { type: TYPES.values.freeze }.freeze
13
14
  )
14
15
  )
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meibo
4
+ module JapanProfile
5
+ class OrganizationSet < ::Meibo::OrganizationSet
6
+ def check_semantically_consistent
7
+ super
8
+
9
+ each do |organization|
10
+ next unless organization.parent_sourced_id
11
+
12
+ raise InvalidDataTypeError if organization.district?
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -13,7 +13,9 @@ module Meibo
13
13
  kana_middle_name: "metadata.jp.kanaMiddleName",
14
14
  home_class: "metadata.jp.homeClass"
15
15
  ).freeze,
16
- converters: klass.superclass.converters
16
+ converters: klass.superclass.converters.merge(
17
+ mext_grade_code: [:grades].freeze
18
+ )
17
19
  )
18
20
  end
19
21
  end
@@ -68,6 +68,7 @@ module Meibo
68
68
  file_users: JapanProfile::User
69
69
  ),
70
70
  data_set: profile121.data_set.merge(
71
+ orgs: JapanProfile::OrganizationSet,
71
72
  users: JapanProfile::UserSet
72
73
  )
73
74
  )
@@ -92,10 +93,31 @@ module Meibo
92
93
  data_set: japan_profile120_v11.data_set
93
94
  )
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
+
95
116
  PROFILES = {
96
117
  "v1.2" => profile121,
97
118
  "v1.2.1" => profile121,
98
119
  "v1.2.0" => profile120,
120
+ "v1.2.0 ep v3.00" => eportal_v3,
99
121
  "v1.2.0 jp v1.0" => japan_profile120_v10,
100
122
  "v1.2.0 jp v1.1" => japan_profile120_v11,
101
123
  "v1.2.1 jp v1.1" => japan_profile121_v11
@@ -5,6 +5,8 @@ module Meibo
5
5
  def check_semantically_consistent
6
6
  super
7
7
 
8
+ raise Error, "userMasterIdentifier\u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059" if @data.filter_map(&:user_master_identifier).tally.values.any? { |v| v > 1 }
9
+
8
10
  each do |user|
9
11
  roster.organizations.find(user.primary_org_sourced_id) if user.primary_org_sourced_id
10
12
 
data/lib/meibo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Meibo
4
- VERSION = "0.25.3"
4
+ VERSION = "0.27.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meibo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.3
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seiei Miyagi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-08 00:00:00.000000000 Z
11
+ date: 2023-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: csv
@@ -94,6 +94,12 @@ files:
94
94
  - lib/meibo/demographic_set.rb
95
95
  - lib/meibo/enrollment.rb
96
96
  - lib/meibo/enrollment_set.rb
97
+ - lib/meibo/eportal_v3/classroom.rb
98
+ - lib/meibo/eportal_v3/course.rb
99
+ - lib/meibo/eportal_v3/enrollment.rb
100
+ - lib/meibo/eportal_v3/organization.rb
101
+ - lib/meibo/eportal_v3/user.rb
102
+ - lib/meibo/eportal_v3/user_profile.rb
97
103
  - lib/meibo/errors.rb
98
104
  - lib/meibo/factory_bot/academic_session.rb
99
105
  - lib/meibo/factory_bot/all.rb
@@ -113,6 +119,7 @@ files:
113
119
  - lib/meibo/japan_profile/demographic.rb
114
120
  - lib/meibo/japan_profile/enrollment.rb
115
121
  - lib/meibo/japan_profile/organization.rb
122
+ - lib/meibo/japan_profile/organization_set.rb
116
123
  - lib/meibo/japan_profile/role_jp_m0.rb
117
124
  - lib/meibo/japan_profile/user.rb
118
125
  - lib/meibo/japan_profile/user_m0.rb
@@ -142,7 +149,7 @@ metadata:
142
149
  allowed_push_host: https://rubygems.org/
143
150
  homepage_uri: https://github.com/hanachin/meibo
144
151
  source_code_uri: https://github.com/hanachin/meibo
145
- changelog_uri: https://github.com/hanachin/meibo/blob/meibo/v0.25.3/CHANGELOG.md
152
+ changelog_uri: https://github.com/hanachin/meibo/blob/meibo/v0.27.0/CHANGELOG.md
146
153
  rubygems_mfa_required: 'true'
147
154
  post_install_message:
148
155
  rdoc_options: []