meibo 0.25.3 → 0.26.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b4170bea30498f0091ba982247d4f9a97cac8f740ae5c6080bb9e5c04c2bc70
4
- data.tar.gz: a9035c251da1ccb1aff600c8c21c91860b543e7c852934e0aac8027b3442b86c
3
+ metadata.gz: eba37b50b98d947b9bdc5912ae9f25ea71f57e81797f8b08756f031935cc62bd
4
+ data.tar.gz: d97317ead377eba9e18eb7df2876e7f132cdf09f1bae4a931047dd980b9ce6f0
5
5
  SHA512:
6
- metadata.gz: 1cb4cf9b78b825a4fc626e8bd69035435a3d7c1228745cc562676b44de8294f3b3934008360697278539709f78843a1da9d2fdbe97162a5bbb5028c6d57e14ba
7
- data.tar.gz: 7fe4f4a9dd50597f75544c69b2c15e67c3c71111669e5c15df4c47f6d96990c816fc57ddd70fc9cf86c094cdb08e90fbf3f0f9970ab18d394703c6b303805987
6
+ metadata.gz: 721e920151cf6ad03d369f77320abd9ba98822cc1e614259432422a323fd3af59104f0e9b20f9162f9cbe525a1f95d1d3efe75383294013ed7fcdad16a34ed33
7
+ data.tar.gz: 46e733cf816e857a8fe8804801d7253f84c9bc9a8d4d59d876ec9fb216989712ff430a0d2995d8eacf1b83206fc8a4fab4d6d043f4c8fbb1aaac44ba6ee18399
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.26.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
@@ -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
@@ -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.26.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
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.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seiei Miyagi
@@ -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.26.0/CHANGELOG.md
146
153
  rubygems_mfa_required: 'true'
147
154
  post_install_message:
148
155
  rdoc_options: []