Add NodeInfo 2.1
This commit is contained in:
parent
e984fa7d91
commit
49ba740b45
6 changed files with 251 additions and 8 deletions
|
|
@ -30,6 +30,8 @@ class NodeInfoPresenter
|
|||
|
||||
def add_static_data(doc)
|
||||
doc.software.name = "diaspora"
|
||||
doc.software.repository = "https://github.com/diaspora/diaspora"
|
||||
doc.software.homepage = "https://diasporafoundation.org/"
|
||||
doc.protocols.protocols << "diaspora"
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -4,13 +4,13 @@ require "pathname"
|
|||
require "json-schema"
|
||||
|
||||
module NodeInfo
|
||||
VERSIONS = %w(1.0 2.0).freeze
|
||||
SCHEMAS = {}
|
||||
VERSIONS = %w[1.0 2.0 2.1].freeze
|
||||
SCHEMAS = {} # rubocop:disable Style/MutableConstant
|
||||
private_constant :VERSIONS, :SCHEMAS
|
||||
|
||||
# rubocop:disable Metrics/BlockLength
|
||||
Document = Struct.new(:version, :software, :protocols, :services, :open_registrations, :usage, :metadata) do
|
||||
Software = Struct.new(:name, :version) do
|
||||
# rubocop:disable Lint/ConstantDefinitionInBlock
|
||||
Software = Struct.new(:name, :version, :repository, :homepage) do
|
||||
def initialize(name=nil, version=nil)
|
||||
super(name, version)
|
||||
end
|
||||
|
|
@ -21,6 +21,13 @@ module NodeInfo
|
|||
"version" => version
|
||||
}
|
||||
end
|
||||
|
||||
def version_21_hash
|
||||
version_10_hash.merge(
|
||||
"repository" => repository,
|
||||
"homepage" => homepage
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Protocols = Struct.new(:protocols) do
|
||||
|
|
@ -80,6 +87,7 @@ module NodeInfo
|
|||
}
|
||||
end
|
||||
end
|
||||
# rubocop:enable Lint/ConstantDefinitionInBlock
|
||||
|
||||
def self.build
|
||||
new.tap do |doc|
|
||||
|
|
@ -98,6 +106,8 @@ module NodeInfo
|
|||
version_10_hash
|
||||
when "2.0"
|
||||
version_20_hash
|
||||
when "2.1"
|
||||
version_21_hash
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -144,6 +154,18 @@ module NodeInfo
|
|||
)
|
||||
end
|
||||
|
||||
def version_21_hash
|
||||
deep_compact(
|
||||
"version" => "2.1",
|
||||
"software" => software.version_21_hash,
|
||||
"protocols" => protocols.version_20_array,
|
||||
"services" => services.version_10_hash,
|
||||
"openRegistrations" => open_registrations,
|
||||
"usage" => usage.version_10_hash,
|
||||
"metadata" => metadata
|
||||
)
|
||||
end
|
||||
|
||||
def deep_compact(hash)
|
||||
hash.tap do |hash|
|
||||
hash.reject! {|_, value|
|
||||
|
|
@ -153,7 +175,6 @@ module NodeInfo
|
|||
end
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/BlockLength
|
||||
|
||||
def self.schema(version)
|
||||
SCHEMAS[version] ||= JSON.parse(
|
||||
|
|
|
|||
|
|
@ -20,6 +20,9 @@ describe NodeInfoController do
|
|||
}, {
|
||||
"rel" => "http://nodeinfo.diaspora.software/ns/schema/2.0",
|
||||
"href" => node_info_url("2.0")
|
||||
}, {
|
||||
"rel" => "http://nodeinfo.diaspora.software/ns/schema/2.1",
|
||||
"href" => node_info_url("2.1")
|
||||
}]
|
||||
end
|
||||
end
|
||||
|
|
@ -33,7 +36,7 @@ describe NodeInfoController do
|
|||
end
|
||||
end
|
||||
|
||||
%w(1.0 2.0).each do |version|
|
||||
%w[1.0 2.0 2.1].each do |version|
|
||||
context "version #{version}" do
|
||||
it "responds to JSON" do
|
||||
get :document, params: {version: version}, format: :json
|
||||
|
|
|
|||
|
|
@ -183,5 +183,36 @@ describe NodeInfoPresenter do
|
|||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "version 2.1" do
|
||||
it "provides generic pod data in json" do
|
||||
expect(NodeInfoPresenter.new("2.1").as_json.as_json).to eq(
|
||||
"version" => "2.1",
|
||||
"software" => {
|
||||
"name" => "diaspora",
|
||||
"version" => AppConfig.version_string,
|
||||
"repository" => "https://github.com/diaspora/diaspora",
|
||||
"homepage" => "https://diasporafoundation.org/"
|
||||
},
|
||||
"protocols" => ["diaspora"],
|
||||
"services" => {
|
||||
"inbound" => [],
|
||||
"outbound" => AppConfig.configured_services.map(&:to_s)
|
||||
},
|
||||
"openRegistrations" => AppConfig.settings.enable_registrations?,
|
||||
"usage" => {
|
||||
"users" => {}
|
||||
},
|
||||
"metadata" => {
|
||||
"nodeName" => AppConfig.settings.pod_name,
|
||||
"camo" => {
|
||||
"markdown" => AppConfig.privacy.camo.proxy_markdown_images?,
|
||||
"opengraph" => AppConfig.privacy.camo.proxy_opengraph_thumbnails?,
|
||||
"remotePods" => AppConfig.privacy.camo.proxy_remote_pod_images?
|
||||
}
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
2
vendor/nodeinfo/schemas/2.0.json
vendored
2
vendor/nodeinfo/schemas/2.0.json
vendored
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"id": "http://nodeinfo.diaspora.software/ns/schema/2.0#",
|
||||
|
|
|
|||
188
vendor/nodeinfo/schemas/2.1.json
vendored
Normal file
188
vendor/nodeinfo/schemas/2.1.json
vendored
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"id": "http://nodeinfo.diaspora.software/ns/schema/2.1#",
|
||||
"description": "NodeInfo schema version 2.1.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"version",
|
||||
"software",
|
||||
"protocols",
|
||||
"services",
|
||||
"openRegistrations",
|
||||
"usage",
|
||||
"metadata"
|
||||
],
|
||||
"properties": {
|
||||
"version": {
|
||||
"description": "The schema version, must be 2.1.",
|
||||
"enum": [
|
||||
"2.1"
|
||||
]
|
||||
},
|
||||
"software": {
|
||||
"description": "Metadata about server software in use.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"name",
|
||||
"version"
|
||||
],
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "The canonical name of this server software.",
|
||||
"type": "string",
|
||||
"pattern": "^[a-z0-9-]+$"
|
||||
},
|
||||
"version": {
|
||||
"description": "The version of this server software.",
|
||||
"type": "string"
|
||||
},
|
||||
"repository": {
|
||||
"description": "The url of the source code repository of this server software.",
|
||||
"type": "string"
|
||||
},
|
||||
"homepage": {
|
||||
"description": "The url of the homepage of this server software.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"protocols": {
|
||||
"description": "The protocols supported on this server.",
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"enum": [
|
||||
"activitypub",
|
||||
"buddycloud",
|
||||
"dfrn",
|
||||
"diaspora",
|
||||
"libertree",
|
||||
"ostatus",
|
||||
"pumpio",
|
||||
"tent",
|
||||
"xmpp",
|
||||
"zot"
|
||||
]
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"description": "The third party sites this server can connect to via their application API.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"inbound",
|
||||
"outbound"
|
||||
],
|
||||
"properties": {
|
||||
"inbound": {
|
||||
"description": "The third party sites this server can retrieve messages from for combined display with regular traffic.",
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"items": {
|
||||
"enum": [
|
||||
"atom1.0",
|
||||
"gnusocial",
|
||||
"imap",
|
||||
"pnut",
|
||||
"pop3",
|
||||
"pumpio",
|
||||
"rss2.0",
|
||||
"twitter"
|
||||
]
|
||||
}
|
||||
},
|
||||
"outbound": {
|
||||
"description": "The third party sites this server can publish messages to on the behalf of a user.",
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"items": {
|
||||
"enum": [
|
||||
"atom1.0",
|
||||
"blogger",
|
||||
"buddycloud",
|
||||
"diaspora",
|
||||
"dreamwidth",
|
||||
"drupal",
|
||||
"facebook",
|
||||
"friendica",
|
||||
"gnusocial",
|
||||
"google",
|
||||
"insanejournal",
|
||||
"libertree",
|
||||
"linkedin",
|
||||
"livejournal",
|
||||
"mediagoblin",
|
||||
"myspace",
|
||||
"pinterest",
|
||||
"pnut",
|
||||
"posterous",
|
||||
"pumpio",
|
||||
"redmatrix",
|
||||
"rss2.0",
|
||||
"smtp",
|
||||
"tent",
|
||||
"tumblr",
|
||||
"twitter",
|
||||
"wordpress",
|
||||
"xmpp"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"openRegistrations": {
|
||||
"description": "Whether this server allows open self-registration.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"usage": {
|
||||
"description": "Usage statistics for this server.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"users"
|
||||
],
|
||||
"properties": {
|
||||
"users": {
|
||||
"description": "statistics about the users of this server.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"total": {
|
||||
"description": "The total amount of on this server registered users.",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"activeHalfyear": {
|
||||
"description": "The amount of users that signed in at least once in the last 180 days.",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"activeMonth": {
|
||||
"description": "The amount of users that signed in at least once in the last 30 days.",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"localPosts": {
|
||||
"description": "The amount of posts that were made by users that are registered on this server.",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"localComments": {
|
||||
"description": "The amount of comments that were made by users that are registered on this server.",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"description": "Free form key value pairs for software specific values. Clients should not rely on any specific key present.",
|
||||
"type": "object",
|
||||
"minProperties": 0,
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue