続き。
前回 MicrosoftGraph クラスから OData::Service クラスを初期化しているところまで読みました。
OData::Service#initialize
コンストラクタは以下のようになっています。
def initialize(options = {}, &block)
@api_version = {
'api-version': options[:api_version]
} if options[:api_version]
@auth_callback = options[:auth_callback] || block
@base_url = options[:base_url]
@metadata_file = options[:metadata_file]
@type_name_map = {}
@metadata = fetch_metadata
populate_types_from_metadata
end
前提条件として OData::Service クラスには base_url と metadata が attr_reader として定義されています。
初期化の内容をざっくり書くと以下のようなことをしています。
@api_version: microsoft_graph としての API バージョン(クライアントバージョン?)を設定しています@auth_callback:Usage example を見てもらうと分かるのですが、Microsoft Graph に渡すトークンを Bearer として Proc で設定しています@base_url: Microsoft Graph API エンドポイントの共通 URI を設定しています@metadata_file:OData Protocol Schema が定義されている XML ファイルを設定します@type_name_map:空ハッシュ値で初期化しています(今のところ用途不明)@metadata:@metada_fileを nokogiri でパースしてremove_namespaces!したものを設定していますpopulate_types_from_metadata:@type_name_mapを初期化しています(具体的な意味は理解していない)
OData::Service#fetch_metadata
@metadata に代入される値は fetch_metadata メソッドの返り値です。
def fetch_metadata
response = if @metadata_file
File.read(@metadata_file)
else # From a URL
uri = URI("#{base_url}$metadata?detailed=true")
Net::HTTP
.new(uri.hostname, uri.port)
.tap { |h| h.use_ssl = uri.scheme == "https" }
.get(uri).body
end
::Nokogiri::XML(response).remove_namespaces!
end
private メソッドとして定義されていて、@metadata_file に何か値が入っていればそれを使用し、そうでなければ Microsoft Graph に存在する OData Protocol Schema のメタデータファイルを取得して使用します。
あとは渡されたメタデータフ(XML)の namespace を削除した XML を返します。
OData::Service#populate_primitive_types
これが今のところ何のために必要なのか理解できていません。
def populate_primitive_types
@type_name_map.merge!(
"Edm.Binary" => OData::BinaryType.new,
"Edm.Date" => OData::DateType.new,
"Edm.Double" => OData::DoubleType.new,
"Edm.Guid" => OData::GuidType.new,
"Edm.Int16" => OData::Int16Type.new,
"Edm.Int32" => OData::Int32Type.new,
"Edm.Int64" => OData::Int64Type.new,
"Edm.Stream" => OData::StreamType.new,
"Edm.String" => OData::StringType.new,
"Edm.Boolean" => OData::BooleanType.new,
"Edm.DateTimeOffset" => OData::DateTimeOffsetType.new
)
end
lib/odata/types/ 配下に定義されている型を司るクラス群をインスタンス化しているのは分かるのですが、これらが何のためにあるのか理解していません。
まとめ
ここから OData Protocol の仕様書をちゃんと読まないとダメなんだと思います。
もう心は折れています。
(続く?)