apress-documentation 0.4.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 +7 -0
- data/.drone.yml +28 -0
- data/.gitignore +10 -0
- data/Appraisals +30 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +4 -0
- data/README.md +101 -0
- data/Rakefile +6 -0
- data/app/assets/javascripts/package/documentation.js +18 -0
- data/app/assets/javascripts/shared/dependency_switcher.js +10 -0
- data/app/assets/javascripts/swagger_binder.js +19 -0
- data/app/assets/javascripts/swagger_ui.js +24 -0
- data/app/assets/javascripts/templates/document.hamlbars +25 -0
- data/app/assets/stylesheets/document/base.scss +112 -0
- data/app/assets/stylesheets/document/document.scss +19 -0
- data/app/assets/stylesheets/document/layout.scss +9 -0
- data/app/assets/stylesheets/document/sidebar.scss +19 -0
- data/app/assets/stylesheets/document/swagger.scss +3 -0
- data/app/assets/stylesheets/document/switch.scss +46 -0
- data/app/assets/stylesheets/document/variables.scss +26 -0
- data/app/assets/stylesheets/package/documentation.css +9 -0
- data/app/assets/stylesheets/package/swagger_print.css +4 -0
- data/app/assets/stylesheets/package/swagger_screen.css +4 -0
- data/app/controllers/apress/documentation/documents_controller.rb +14 -0
- data/app/controllers/apress/documentation/swagger_controller.rb +22 -0
- data/app/controllers/apress/documentation/swagger_ui_controller.rb +11 -0
- data/app/controllers/concerns/apress/documentation/preload_docs.rb +20 -0
- data/app/helpers/apress/documentation/documents_helper.rb +14 -0
- data/app/presenters/apress/documentation/dependency_presenter.rb +75 -0
- data/app/services/apress/documentation/swagger_json_builder.rb +22 -0
- data/app/views/apress/documentation/documents/_document.html.haml +32 -0
- data/app/views/apress/documentation/documents/_swagger.html.haml +10 -0
- data/app/views/apress/documentation/documents/show.html.haml +13 -0
- data/app/views/apress/documentation/presenters/dependency_presenter/_dependencies.html.haml +21 -0
- data/app/views/apress/documentation/presenters/dependency_presenter/_links.html.haml +17 -0
- data/app/views/apress/documentation/swagger_ui/show.html.haml +26 -0
- data/app/views/layouts/apress/documentation/_menu.html.haml +6 -0
- data/app/views/layouts/apress/documentation/_menu_item.html.haml +7 -0
- data/app/views/layouts/apress/documentation/_sidebar.html.haml +2 -0
- data/app/views/layouts/documentation.html.haml +17 -0
- data/apress-documentation.gemspec +35 -0
- data/config/routes.rb +16 -0
- data/dip.yml +48 -0
- data/docker-compose.development.yml +18 -0
- data/docker-compose.drone.yml +7 -0
- data/docker-compose.yml +10 -0
- data/lib/apress/documentation.rb +48 -0
- data/lib/apress/documentation/dsl/compilers/base_compiler.rb +32 -0
- data/lib/apress/documentation/dsl/compilers/document_compiler.rb +111 -0
- data/lib/apress/documentation/dsl/compilers/mixins/dependable.rb +31 -0
- data/lib/apress/documentation/dsl/compilers/mixins/publicity.rb +34 -0
- data/lib/apress/documentation/dsl/compilers/swagger_compiler.rb +25 -0
- data/lib/apress/documentation/dsl/document.rb +14 -0
- data/lib/apress/documentation/dsl/modules.rb +40 -0
- data/lib/apress/documentation/dsl/swagger_document.rb +14 -0
- data/lib/apress/documentation/dsl/utils/swagger_bind_point_extractor.rb +37 -0
- data/lib/apress/documentation/engine.rb +16 -0
- data/lib/apress/documentation/extensions/rgl/adjacency.rb +18 -0
- data/lib/apress/documentation/storage/base_storage.rb +88 -0
- data/lib/apress/documentation/storage/dependency_graph.rb +96 -0
- data/lib/apress/documentation/storage/document.rb +52 -0
- data/lib/apress/documentation/storage/modules.rb +83 -0
- data/lib/apress/documentation/storage/swagger_document.rb +62 -0
- data/lib/apress/documentation/swagger/schema.rb +39 -0
- data/lib/apress/documentation/version.rb +5 -0
- data/spec/app/controllers/documents_controller_spec.rb +42 -0
- data/spec/app/controllers/swagger_controller_spec.rb +46 -0
- data/spec/app/controllers/swagger_ui_controller_spec.rb +11 -0
- data/spec/app/services/swagger_json_builder_spec.rb +41 -0
- data/spec/apress/documentation_spec.rb +342 -0
- data/spec/helpers/apress/documentation/documents_helper_spec.rb +17 -0
- data/spec/internal/app/docs/swagger/root.rb +7 -0
- data/spec/internal/config/database.yml +7 -0
- data/spec/internal/config/environments/test.rb +1 -0
- data/spec/internal/config/hosts.rb +1 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/lib/stub_docs/module.rb +3 -0
- data/spec/internal/lib/stub_docs/module/document/child_document.rb +7 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/presenters/apress/documentation/dependency_presenter_spec.rb +139 -0
- data/spec/spec_helper.rb +27 -0
- metadata +335 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
= stylesheet_link_tag 'package/swagger_screen', media: :screen
|
5
|
+
= stylesheet_link_tag 'package/swagger_print', media: :print
|
6
|
+
= stylesheet_link_tag 'package/documentation', media: 'all'
|
7
|
+
= javascript_include_tag 'package/documentation', defer: true
|
8
|
+
:javascript
|
9
|
+
var app = {};
|
10
|
+
|
11
|
+
%body
|
12
|
+
%main
|
13
|
+
- cache 'sidebar' do
|
14
|
+
= render 'layouts/apress/documentation/sidebar'
|
15
|
+
|
16
|
+
%section.content
|
17
|
+
= yield
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'apress/documentation/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'apress-documentation'
|
8
|
+
spec.version = Apress::Documentation::VERSION
|
9
|
+
spec.authors = ['Korobicyn Denis']
|
10
|
+
spec.email = ['deniskorobitcin@gmail.com']
|
11
|
+
spec.summary = 'apress-documentation'
|
12
|
+
spec.description = 'apress-documentation'
|
13
|
+
spec.homepage = 'https://github.com/abak-press/apress-documentation'
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'rails', '>= 3.2'
|
21
|
+
spec.add_runtime_dependency 'haml-rails', '>= 0.4'
|
22
|
+
spec.add_runtime_dependency 'swagger-blocks', '>= 1.3'
|
23
|
+
spec.add_runtime_dependency 'rgl'
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", ">= 1.14"
|
26
|
+
spec.add_development_dependency "rake", ">= 10.0"
|
27
|
+
spec.add_development_dependency "rspec", ">= 3.0"
|
28
|
+
spec.add_development_dependency 'rspec-rails', '>= 3.2'
|
29
|
+
spec.add_development_dependency 'combustion', '>= 0.5.4'
|
30
|
+
spec.add_development_dependency 'appraisal'
|
31
|
+
spec.add_development_dependency 'simplecov', '>= 0.9'
|
32
|
+
spec.add_development_dependency "sqlite3"
|
33
|
+
spec.add_development_dependency 'test-unit'
|
34
|
+
spec.add_development_dependency 'pry-byebug'
|
35
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
scope path: Apress::Documentation[:path_scope] do
|
3
|
+
scope module: :apress, constraints: Apress::Documentation[:routes_constraints] do
|
4
|
+
scope module: :documentation do
|
5
|
+
get "/documentation/(*path)", to: 'documents#show', as: :documentation
|
6
|
+
end
|
7
|
+
|
8
|
+
scope path: :api do
|
9
|
+
scope module: :documentation do
|
10
|
+
resource :swagger, controller: :swagger_ui, only: :show
|
11
|
+
resource :docs, controller: :swagger, only: :show
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/dip.yml
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
version: '1'
|
2
|
+
|
3
|
+
environment:
|
4
|
+
DOCKER_RUBY_VERSION: 2.2
|
5
|
+
RUBY_IMAGE_TAG: 2.2-latest
|
6
|
+
COMPOSE_FILE_EXT: development
|
7
|
+
RAILS_ENV: test
|
8
|
+
APRESS_GEMS_CREDENTIALS: ""
|
9
|
+
|
10
|
+
compose:
|
11
|
+
files:
|
12
|
+
- docker-compose.yml
|
13
|
+
- docker-compose.${COMPOSE_FILE_EXT}.yml
|
14
|
+
|
15
|
+
interaction:
|
16
|
+
sh:
|
17
|
+
service: app
|
18
|
+
|
19
|
+
irb:
|
20
|
+
service: app
|
21
|
+
command: bundle exec irb
|
22
|
+
|
23
|
+
bundle:
|
24
|
+
service: app
|
25
|
+
command: bundle
|
26
|
+
|
27
|
+
rake:
|
28
|
+
service: app
|
29
|
+
command: bundle exec rake
|
30
|
+
|
31
|
+
appraisal:
|
32
|
+
service: app
|
33
|
+
command: bundle exec appraisal
|
34
|
+
|
35
|
+
rspec:
|
36
|
+
service: app
|
37
|
+
command: bundle exec appraisal bundle exec rspec
|
38
|
+
|
39
|
+
clean:
|
40
|
+
service: app
|
41
|
+
command: rm -f Gemfile.lock gemfiles/*.gemfile.*
|
42
|
+
|
43
|
+
provision:
|
44
|
+
- docker volume create --name bundler_data
|
45
|
+
- dip bundle config --local https://gems.railsc.ru/ ${APRESS_GEMS_CREDENTIALS}
|
46
|
+
- dip clean
|
47
|
+
- dip bundle install
|
48
|
+
- dip appraisal install
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rails/all'
|
2
|
+
require 'haml-rails'
|
3
|
+
require 'swagger/blocks'
|
4
|
+
require 'rgl/adjacency'
|
5
|
+
require 'rgl/dot'
|
6
|
+
require 'apress/documentation/extensions/rgl/adjacency'
|
7
|
+
require 'apress/documentation/swagger/schema'
|
8
|
+
require 'apress/documentation/storage/dependency_graph'
|
9
|
+
require 'apress/documentation/storage/swagger_document'
|
10
|
+
require 'apress/documentation/storage/document'
|
11
|
+
require 'apress/documentation/storage/modules'
|
12
|
+
require 'apress/documentation/engine'
|
13
|
+
require "apress/documentation/version"
|
14
|
+
|
15
|
+
# Public: Основной модуль для использования
|
16
|
+
#
|
17
|
+
# Содержит методы построения и получения динамически определяемых документов
|
18
|
+
module Apress
|
19
|
+
module Documentation
|
20
|
+
def self.modules
|
21
|
+
Apress::Documentation::Storage::Modules.instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.add_load_path(path)
|
25
|
+
ActiveSupport.on_load(:documentation) do
|
26
|
+
Dir[File.join(path, '/**/*.rb')].each { |file| require file }
|
27
|
+
|
28
|
+
yield if block_given?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.reset!
|
33
|
+
Apress::Documentation::Storage::DependencyGraph.instance.reset!
|
34
|
+
modules.reset!
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.validate_dependencies!
|
38
|
+
Apress::Documentation::Storage::DependencyGraph.instance.validate!
|
39
|
+
end
|
40
|
+
|
41
|
+
class << self
|
42
|
+
extend Forwardable
|
43
|
+
|
44
|
+
def_delegators :modules, :data, :fetch_document, :build
|
45
|
+
def_delegators 'Rails.application.config.documentation', :[], :[]=, :fetch
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Apress
|
2
|
+
module Documentation
|
3
|
+
module Dsl
|
4
|
+
# Private: AbstractClass Базовы класс компилятора DSL
|
5
|
+
#
|
6
|
+
# задает DSL для настройки DSL (Xzibit style)
|
7
|
+
class BaseCompiler
|
8
|
+
# Public: Объект в который будут заполняться поля чере DSL
|
9
|
+
attr_reader :target
|
10
|
+
|
11
|
+
def initialize(target)
|
12
|
+
@target = target
|
13
|
+
end
|
14
|
+
|
15
|
+
# Public: Основной метод, задает какие поля объект DSL-класса будет записивать в target
|
16
|
+
def self.setters(*method_names)
|
17
|
+
method_names.each do |name|
|
18
|
+
send :define_method, name do |value|
|
19
|
+
@target.send("#{name}=", value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Public: Осуществляет исполнение DSL и заполняет нужные поля в target
|
25
|
+
def compile(fields, &block)
|
26
|
+
@target.assign(fields)
|
27
|
+
instance_eval(&block) if block_given?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative 'base_compiler'
|
2
|
+
require_relative '../utils/swagger_bind_point_extractor'
|
3
|
+
require_relative './mixins/dependable'
|
4
|
+
require_relative './mixins/publicity'
|
5
|
+
|
6
|
+
module Apress
|
7
|
+
module Documentation
|
8
|
+
module Dsl
|
9
|
+
module Compilers
|
10
|
+
# Private: "Компилирует" блок для объекта класса Document заполняя в нем нужные аттрибуты
|
11
|
+
class DocumentCompiler < BaseCompiler
|
12
|
+
include Apress::Documentation::Dsl::Mixins::Dependable
|
13
|
+
include Apress::Documentation::Dsl::Mixins::Publicity
|
14
|
+
setters :title,
|
15
|
+
:description,
|
16
|
+
:business_desc,
|
17
|
+
:tests
|
18
|
+
|
19
|
+
# Public: метод DSL, Создает документ, осуществляет вложеность документов
|
20
|
+
#
|
21
|
+
# slug - (required), String or Symbol - слаг документа
|
22
|
+
# fields - Hash - позволяет задавать поля через хеш
|
23
|
+
# block - Proc - DSL для настройки полей документа
|
24
|
+
#
|
25
|
+
# Examples
|
26
|
+
#
|
27
|
+
# Apress::Documentation.build(:module) do
|
28
|
+
# document(:html) do
|
29
|
+
# description 'Описывает все HTMl старницы'
|
30
|
+
# document(:page) do
|
31
|
+
# description 'Тут описание только одной'
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# Можно вызывать без блока
|
37
|
+
# Apress::Documentation.build(:module) do
|
38
|
+
# document :name, title: :test, description: 'some description'
|
39
|
+
# end
|
40
|
+
def document(slug, fields = {}, &block)
|
41
|
+
slug = slug.to_s
|
42
|
+
doc = target.documents[slug]
|
43
|
+
doc ||= Apress::Documentation::Storage::Document.new(target.slug + '/' + slug)
|
44
|
+
Storage::DependencyGraph.instance.add_document(doc)
|
45
|
+
|
46
|
+
target.documents[slug] = doc
|
47
|
+
doc.compile(fields, &block)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Public: метод DSL, Создает swagger-описание внутри документа.
|
51
|
+
#
|
52
|
+
# slug - (required), String or Symbol - слаг документа
|
53
|
+
# fields - Hash - позволяет задавать поля через хеш
|
54
|
+
# block - Proc - DSL для настройки полей документа
|
55
|
+
#
|
56
|
+
# Examples
|
57
|
+
#
|
58
|
+
# Apress::Documentation.build(:module) do
|
59
|
+
# document(:http_api) do
|
60
|
+
# description 'Описывает все API модуля'
|
61
|
+
# swagger_bind('tag_operationId_content') do
|
62
|
+
# description 'Тут описание только одной'
|
63
|
+
# swagger_path('api/docs') do
|
64
|
+
# # Тут вызовы методов Swagger::Blocks
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# Можно вызывать без указания html_id,
|
71
|
+
# тогда он будет "распознан" из блока автоматически, если это возможно.
|
72
|
+
# В случае если html_id не был передан и "распознать" html_id невозможно, будет кинуто исключение.
|
73
|
+
#
|
74
|
+
# Детали "распознования" см. в Apress::Documentation::Dsl::Utils::SwaggerBindPointExtractor
|
75
|
+
#
|
76
|
+
# Apress::Documentation.build(:module) do
|
77
|
+
# document(:http_api) do
|
78
|
+
# description 'Описывает все API модуля'
|
79
|
+
# swagger_bind do # -> будет tag_operationId_content
|
80
|
+
# description 'Тут описание только одной'
|
81
|
+
# swagger_path('api/docs') do
|
82
|
+
# operation :get do
|
83
|
+
# key :operationId, 'operationId' # -> обязательный вызов для распознавания
|
84
|
+
# key :tags, ['tag'] # -> обязательный вызов для распознавания
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
def swagger_bind(html_id = nil, fields = {}, &block)
|
91
|
+
html_id = recognize_html_id(html_id, &block)
|
92
|
+
doc = target.swagger_documents[html_id]
|
93
|
+
doc ||= Apress::Documentation::Storage::SwaggerDocument.new(target, html_id)
|
94
|
+
Storage::DependencyGraph.instance.add_document(doc)
|
95
|
+
|
96
|
+
target.swagger_documents[html_id] = doc
|
97
|
+
doc.compile(fields, &block)
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def recognize_html_id(html_id, &block)
|
103
|
+
html_id ||= Apress::Documentation::Dsl::Utils::SwaggerBindPointExtractor.new.extract(&block)
|
104
|
+
raise "Could not recognize html_id from block" unless html_id
|
105
|
+
html_id.to_s
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Apress
|
2
|
+
module Documentation
|
3
|
+
module Dsl
|
4
|
+
module Mixins
|
5
|
+
module Dependable
|
6
|
+
# Public: создает зависимости между документами, является частью DSL
|
7
|
+
#
|
8
|
+
# Arguments:
|
9
|
+
# documents_slugs - Массив полных слагов для документом от которых зависит текущий документ.
|
10
|
+
# Examples:
|
11
|
+
# Apress::Documentation.build(:module) do
|
12
|
+
# document(:doc2) do
|
13
|
+
# depends_on('module/doc1', 'other_model/other_document')
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# document(:doc1)
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
def depends_on(*documents_slugs)
|
20
|
+
documents_slugs.each do |document_slug|
|
21
|
+
document = Apress::Documentation::Storage::Modules.instance.fetch_document(document_slug)
|
22
|
+
document ||= document_slug
|
23
|
+
Apress::Documentation::Storage::DependencyGraph.instance.add_document(document)
|
24
|
+
Apress::Documentation::Storage::DependencyGraph.instance.add_dependency(@target, document)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Apress
|
2
|
+
module Documentation
|
3
|
+
module Dsl
|
4
|
+
module Mixins
|
5
|
+
module Publicity
|
6
|
+
ACCESS_MAPPING = {
|
7
|
+
public: 'Публичный',
|
8
|
+
private: 'Приватный',
|
9
|
+
protected: 'Защищеный'
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
# Public: указывает уровень доступа документа, является частью DSL
|
13
|
+
#
|
14
|
+
# Arguments:
|
15
|
+
# level - Symbol, valid values - :public, :private, :protected
|
16
|
+
# Examples:
|
17
|
+
# Apress::Documentation.build(:module) do
|
18
|
+
# document(:doc1) do
|
19
|
+
# publicity :public
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
def publicity(level)
|
24
|
+
unless ACCESS_MAPPING.keys.include?(level)
|
25
|
+
raise "Неизвестный уровень доступа - #{level}, объявлен в документе #{@target.slug}"
|
26
|
+
end
|
27
|
+
|
28
|
+
@target.publicity = ACCESS_MAPPING[level]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base_compiler'
|
2
|
+
require_relative './mixins/dependable'
|
3
|
+
require_relative './mixins/publicity'
|
4
|
+
|
5
|
+
module Apress
|
6
|
+
module Documentation
|
7
|
+
module Dsl
|
8
|
+
module Compilers
|
9
|
+
# Private: "Компилирует" блок для объекта класса SwaggerDocument заполняя в нем нужные аттрибуты
|
10
|
+
class SwaggerCompiler < BaseCompiler
|
11
|
+
include Apress::Documentation::Dsl::Mixins::Dependable
|
12
|
+
include Apress::Documentation::Dsl::Mixins::Publicity
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
alias_method :swagger_document, :target
|
16
|
+
setters :business_desc,
|
17
|
+
:tests
|
18
|
+
|
19
|
+
def_delegators :swagger_document, :swagger_class
|
20
|
+
def_delegators :swagger_class, :swagger_path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|