apipierails3 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +17 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +27 -0
  5. data/APACHE-LICENSE-2.0 +202 -0
  6. data/CHANGELOG.md +469 -0
  7. data/Gemfile +1 -0
  8. data/Gemfile.rails32 +6 -0
  9. data/Gemfile.rails41 +6 -0
  10. data/Gemfile.rails42 +11 -0
  11. data/Gemfile.rails50 +6 -0
  12. data/Gemfile.rails51 +7 -0
  13. data/MIT-LICENSE +20 -0
  14. data/NOTICE +4 -0
  15. data/PROPOSAL_FOR_RESPONSE_DESCRIPTIONS.md +244 -0
  16. data/README.rst +1874 -0
  17. data/Rakefile +13 -0
  18. data/apipierails3.gemspec +27 -0
  19. data/app/controllers/apipie/apipies_controller.rb +199 -0
  20. data/app/helpers/apipie_helper.rb +10 -0
  21. data/app/public/apipie/javascripts/apipie.js +6 -0
  22. data/app/public/apipie/javascripts/bundled/bootstrap-collapse.js +138 -0
  23. data/app/public/apipie/javascripts/bundled/bootstrap.js +1726 -0
  24. data/app/public/apipie/javascripts/bundled/jquery.js +5 -0
  25. data/app/public/apipie/javascripts/bundled/prettify.js +28 -0
  26. data/app/public/apipie/stylesheets/application.css +7 -0
  27. data/app/public/apipie/stylesheets/bundled/bootstrap-responsive.min.css +12 -0
  28. data/app/public/apipie/stylesheets/bundled/bootstrap.min.css +689 -0
  29. data/app/public/apipie/stylesheets/bundled/prettify.css +30 -0
  30. data/app/views/apipie/apipies/_disqus.html.erb +13 -0
  31. data/app/views/apipie/apipies/_errors.html.erb +23 -0
  32. data/app/views/apipie/apipies/_headers.html.erb +26 -0
  33. data/app/views/apipie/apipies/_languages.erb +6 -0
  34. data/app/views/apipie/apipies/_metadata.erb +1 -0
  35. data/app/views/apipie/apipies/_method_detail.erb +61 -0
  36. data/app/views/apipie/apipies/_params.html.erb +42 -0
  37. data/app/views/apipie/apipies/_params_plain.html.erb +20 -0
  38. data/app/views/apipie/apipies/apipie_404.html.erb +17 -0
  39. data/app/views/apipie/apipies/apipie_checksum.json.erb +1 -0
  40. data/app/views/apipie/apipies/getting_started.html.erb +6 -0
  41. data/app/views/apipie/apipies/index.html.erb +56 -0
  42. data/app/views/apipie/apipies/method.html.erb +41 -0
  43. data/app/views/apipie/apipies/plain.html.erb +77 -0
  44. data/app/views/apipie/apipies/resource.html.erb +80 -0
  45. data/app/views/apipie/apipies/static.html.erb +103 -0
  46. data/app/views/layouts/apipie/apipie.html.erb +27 -0
  47. data/config/locales/de.yml +28 -0
  48. data/config/locales/en.yml +32 -0
  49. data/config/locales/es.yml +28 -0
  50. data/config/locales/fr.yml +31 -0
  51. data/config/locales/it.yml +31 -0
  52. data/config/locales/ja.yml +31 -0
  53. data/config/locales/pl.yml +28 -0
  54. data/config/locales/pt-BR.yml +28 -0
  55. data/config/locales/ru.yml +28 -0
  56. data/config/locales/tr.yml +28 -0
  57. data/config/locales/zh-CN.yml +28 -0
  58. data/config/locales/zh-TW.yml +28 -0
  59. data/images/screenshot-1.png +0 -0
  60. data/images/screenshot-2.png +0 -0
  61. data/lib/apipie/apipie_module.rb +83 -0
  62. data/lib/apipie/application.rb +462 -0
  63. data/lib/apipie/configuration.rb +186 -0
  64. data/lib/apipie/dsl_definition.rb +607 -0
  65. data/lib/apipie/error_description.rb +44 -0
  66. data/lib/apipie/errors.rb +86 -0
  67. data/lib/apipie/extractor.rb +177 -0
  68. data/lib/apipie/extractor/collector.rb +117 -0
  69. data/lib/apipie/extractor/recorder.rb +166 -0
  70. data/lib/apipie/extractor/writer.rb +454 -0
  71. data/lib/apipie/helpers.rb +73 -0
  72. data/lib/apipie/markup.rb +48 -0
  73. data/lib/apipie/method_description.rb +273 -0
  74. data/lib/apipie/middleware/checksum_in_headers.rb +35 -0
  75. data/lib/apipie/param_description.rb +280 -0
  76. data/lib/apipie/railtie.rb +9 -0
  77. data/lib/apipie/resource_description.rb +124 -0
  78. data/lib/apipie/response_description.rb +131 -0
  79. data/lib/apipie/response_description_adapter.rb +200 -0
  80. data/lib/apipie/routes_formatter.rb +33 -0
  81. data/lib/apipie/routing.rb +16 -0
  82. data/lib/apipie/rspec/response_validation_helper.rb +192 -0
  83. data/lib/apipie/see_description.rb +39 -0
  84. data/lib/apipie/static_dispatcher.rb +69 -0
  85. data/lib/apipie/swagger_generator.rb +707 -0
  86. data/lib/apipie/tag_list_description.rb +11 -0
  87. data/lib/apipie/validator.rb +526 -0
  88. data/lib/apipie/version.rb +3 -0
  89. data/lib/apipierails3.rb +25 -0
  90. data/lib/generators/apipie/install/README +6 -0
  91. data/lib/generators/apipie/install/install_generator.rb +25 -0
  92. data/lib/generators/apipie/install/templates/initializer.rb.erb +7 -0
  93. data/lib/generators/apipie/views_generator.rb +11 -0
  94. data/lib/tasks/apipie.rake +345 -0
  95. data/rel-eng/packages/.readme +3 -0
  96. data/rel-eng/packages/rubygem-apipie-rails +1 -0
  97. data/rel-eng/tito.props +5 -0
  98. data/spec/controllers/api/v1/architectures_controller_spec.rb +29 -0
  99. data/spec/controllers/api/v2/architectures_controller_spec.rb +12 -0
  100. data/spec/controllers/api/v2/nested/resources_controller_spec.rb +11 -0
  101. data/spec/controllers/apipies_controller_spec.rb +273 -0
  102. data/spec/controllers/concerns_controller_spec.rb +42 -0
  103. data/spec/controllers/extended_controller_spec.rb +11 -0
  104. data/spec/controllers/users_controller_spec.rb +740 -0
  105. data/spec/dummy/Rakefile +7 -0
  106. data/spec/dummy/app/controllers/api/base_controller.rb +4 -0
  107. data/spec/dummy/app/controllers/api/v1/architectures_controller.rb +43 -0
  108. data/spec/dummy/app/controllers/api/v1/base_controller.rb +11 -0
  109. data/spec/dummy/app/controllers/api/v2/architectures_controller.rb +30 -0
  110. data/spec/dummy/app/controllers/api/v2/base_controller.rb +11 -0
  111. data/spec/dummy/app/controllers/api/v2/nested/architectures_controller.rb +32 -0
  112. data/spec/dummy/app/controllers/api/v2/nested/resources_controller.rb +33 -0
  113. data/spec/dummy/app/controllers/application_controller.rb +18 -0
  114. data/spec/dummy/app/controllers/concerns/extending_concern.rb +11 -0
  115. data/spec/dummy/app/controllers/concerns/sample_controller.rb +41 -0
  116. data/spec/dummy/app/controllers/concerns_controller.rb +8 -0
  117. data/spec/dummy/app/controllers/extended_controller.rb +14 -0
  118. data/spec/dummy/app/controllers/files_controller.rb +5 -0
  119. data/spec/dummy/app/controllers/overridden_concerns_controller.rb +31 -0
  120. data/spec/dummy/app/controllers/pets_controller.rb +408 -0
  121. data/spec/dummy/app/controllers/pets_using_auto_views_controller.rb +73 -0
  122. data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +95 -0
  123. data/spec/dummy/app/controllers/tagged_cats_controller.rb +32 -0
  124. data/spec/dummy/app/controllers/tagged_dogs_controller.rb +15 -0
  125. data/spec/dummy/app/controllers/twitter_example_controller.rb +307 -0
  126. data/spec/dummy/app/controllers/users_controller.rb +297 -0
  127. data/spec/dummy/app/views/layouts/application.html.erb +21 -0
  128. data/spec/dummy/config.ru +4 -0
  129. data/spec/dummy/config/application.rb +49 -0
  130. data/spec/dummy/config/boot.rb +10 -0
  131. data/spec/dummy/config/database.yml +21 -0
  132. data/spec/dummy/config/environment.rb +8 -0
  133. data/spec/dummy/config/environments/development.rb +28 -0
  134. data/spec/dummy/config/environments/production.rb +52 -0
  135. data/spec/dummy/config/environments/test.rb +38 -0
  136. data/spec/dummy/config/initializers/apipie.rb +110 -0
  137. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  138. data/spec/dummy/config/initializers/inflections.rb +10 -0
  139. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  140. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  141. data/spec/dummy/config/initializers/session_store.rb +8 -0
  142. data/spec/dummy/config/locales/en.yml +5 -0
  143. data/spec/dummy/config/routes.rb +51 -0
  144. data/spec/dummy/db/.gitkeep +0 -0
  145. data/spec/dummy/doc/apipie_examples.json +1 -0
  146. data/spec/dummy/doc/users/desc_from_file.md +1 -0
  147. data/spec/dummy/public/404.html +26 -0
  148. data/spec/dummy/public/422.html +26 -0
  149. data/spec/dummy/public/500.html +26 -0
  150. data/spec/dummy/public/favicon.ico +0 -0
  151. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  152. data/spec/dummy/script/rails +6 -0
  153. data/spec/lib/application_spec.rb +49 -0
  154. data/spec/lib/extractor/extractor_spec.rb +9 -0
  155. data/spec/lib/extractor/middleware_spec.rb +44 -0
  156. data/spec/lib/extractor/writer_spec.rb +110 -0
  157. data/spec/lib/file_handler_spec.rb +18 -0
  158. data/spec/lib/method_description_spec.rb +98 -0
  159. data/spec/lib/param_description_spec.rb +345 -0
  160. data/spec/lib/param_group_spec.rb +60 -0
  161. data/spec/lib/rake_spec.rb +71 -0
  162. data/spec/lib/resource_description_spec.rb +48 -0
  163. data/spec/lib/swagger/openapi_2_0_schema.json +1607 -0
  164. data/spec/lib/swagger/rake_swagger_spec.rb +139 -0
  165. data/spec/lib/swagger/response_validation_spec.rb +104 -0
  166. data/spec/lib/swagger/swagger_dsl_spec.rb +658 -0
  167. data/spec/lib/validator_spec.rb +113 -0
  168. data/spec/lib/validators/array_validator_spec.rb +85 -0
  169. data/spec/spec_helper.rb +109 -0
  170. data/spec/support/rake.rb +21 -0
  171. metadata +415 -0
@@ -0,0 +1,3 @@
1
+ module Apipie
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,25 @@
1
+ require 'i18n'
2
+ require 'json'
3
+ require 'active_support/hash_with_indifferent_access'
4
+
5
+ require "apipie/routing"
6
+ require "apipie/markup"
7
+ require "apipie/apipie_module"
8
+ require "apipie/dsl_definition"
9
+ require "apipie/configuration"
10
+ require "apipie/method_description"
11
+ require "apipie/resource_description"
12
+ require "apipie/param_description"
13
+ require "apipie/errors"
14
+ require "apipie/error_description"
15
+ require "apipie/response_description"
16
+ require "apipie/response_description_adapter"
17
+ require "apipie/see_description"
18
+ require "apipie/tag_list_description"
19
+ require "apipie/validator"
20
+ require "apipie/railtie"
21
+ require 'apipie/extractor'
22
+ require "apipie/version"
23
+ require "apipie/swagger_generator"
24
+
25
+
@@ -0,0 +1,6 @@
1
+ Description:
2
+ Sets up Apipie-rails in your project.
3
+ Examples:
4
+ `rails generate apipie:install`
5
+
6
+ `rails generate apipie:install --help`
@@ -0,0 +1,25 @@
1
+ module Apipie
2
+ class InstallGenerator < ::Rails::Generators::Base
3
+ source_root File.expand_path("../templates", __FILE__)
4
+
5
+ class_option(:route,
6
+ :aliases => "-r",
7
+ :type => :string,
8
+ :desc => "What path should be the doc available on",
9
+ :default => "/apipie")
10
+
11
+ class_option(:api_path,
12
+ :alias => "-a",
13
+ :type => :string,
14
+ :desc => "What path are API requests on",
15
+ :default => "/api")
16
+
17
+ def create_initializer
18
+ template 'initializer.rb.erb', 'config/initializers/apipie.rb'
19
+ end
20
+
21
+ def add_route
22
+ route("apipie")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ Apipie.configure do |config|
2
+ config.app_name = "<%= Rails.application.class.name[/^\w+/] %>"
3
+ config.api_base_url = "<%= options.api_path %>"
4
+ config.doc_base_url = "<%= options.route %>"
5
+ # where is your API defined?
6
+ config.api_controllers_matcher = "#{Rails.root}/app/controllers/**/*.rb"
7
+ end
@@ -0,0 +1,11 @@
1
+ module Apipie
2
+ class ViewsGenerator < ::Rails::Generators::Base
3
+ source_root File.expand_path("../../../../app/views", __FILE__)
4
+ desc 'Copy Apipie views to your application'
5
+
6
+ def copy_views
7
+ directory 'apipie', 'app/views/apipie'
8
+ directory 'layouts/apipie', 'app/views/layouts/apipie'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,345 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'fileutils'
3
+
4
+ namespace :apipie do
5
+
6
+ desc "Generate static documentation"
7
+ # You can specify OUT=output_base_file to have the following structure:
8
+ #
9
+ # output_base_file.html
10
+ # output_base_file-onepage.html
11
+ # output_base_file
12
+ # | - resource1.html
13
+ # | - resource1
14
+ # | - | - method1.html
15
+ # | - | - method2.html
16
+ # | - resource2.html
17
+ #
18
+ # By default OUT="#{Rails.root}/doc/apidoc"
19
+ task :static, [:version] => :environment do |t, args|
20
+ with_loaded_documentation do
21
+ args.with_defaults(:version => Apipie.configuration.default_version)
22
+ out = ENV["OUT"] || File.join(::Rails.root, Apipie.configuration.doc_path, 'apidoc')
23
+ subdir = File.basename(out)
24
+ copy_jscss(out)
25
+ Apipie.configuration.version_in_url = false
26
+ ([nil] + Apipie.configuration.languages).each do |lang|
27
+ I18n.locale = lang || Apipie.configuration.default_locale
28
+ Apipie.url_prefix = "./#{subdir}"
29
+ doc = Apipie.to_json(args[:version], nil, nil, lang)
30
+ doc[:docs][:link_extension] = "#{lang_ext(lang)}.html"
31
+ generate_one_page(out, doc, lang)
32
+ generate_plain_page(out, doc, lang)
33
+ generate_index_page(out, doc, false, false, lang)
34
+ Apipie.url_prefix = "../#{subdir}"
35
+ generate_resource_pages(args[:version], out, doc, false, lang)
36
+ Apipie.url_prefix = "../../#{subdir}"
37
+ generate_method_pages(args[:version], out, doc, false, lang)
38
+ end
39
+ end
40
+ end
41
+
42
+ desc "Generate static documentation json"
43
+ task :static_json, [:version] => :environment do |t, args|
44
+ with_loaded_documentation do
45
+ args.with_defaults(:version => Apipie.configuration.default_version)
46
+ out = ENV["OUT"] || File.join(::Rails.root, Apipie.configuration.doc_path, 'apidoc')
47
+ ([nil] + Apipie.configuration.languages).each do |lang|
48
+ doc = Apipie.to_json(args[:version], nil, nil, lang)
49
+ generate_json_page(out, doc, lang)
50
+ end
51
+ end
52
+ end
53
+
54
+ desc "Generate static swagger json"
55
+ task :static_swagger_json, [:version, :swagger_content_type_input, :filename_suffix] => :environment do |t, args|
56
+ with_loaded_documentation do
57
+ out = ENV["OUT"] || File.join(::Rails.root, Apipie.configuration.doc_path, 'apidoc')
58
+ generate_swagger_using_args(args, out)
59
+ end
60
+ end
61
+
62
+ # The following task compares the currently-generated swagger output to a reference copy generated
63
+ # by the previous execution of this task.
64
+ # if a difference is detected, the current output will be stored as a reference.
65
+ # reference files have the
66
+ # if more than 3 references are detected, the older ones will be purged
67
+ desc "Did swagger output change since the last execution of this task?"
68
+ task :did_swagger_change, [:version, :swagger_content_type_input, :filename_suffix] => :environment do |t, args|
69
+ with_loaded_documentation do
70
+ out = ENV["OUT_REF"] || File.join(::Rails.root, Apipie.configuration.doc_path, 'apidoc_ref')
71
+ paths = generate_swagger_using_args(args, out)
72
+ paths.each {|path|
73
+ existing_files_in_dir = Pathname(out).children(true)
74
+
75
+ make_reference = false
76
+
77
+ # reference filenames have the format <basename>.<counter>.swagger_ref
78
+ reference_files = existing_files_in_dir.select{|f|
79
+ f.extname == '.swagger_ref' &&
80
+ f.basename.sub_ext("").extname.delete('.').to_i > 0 &&
81
+ f.basename.sub_ext("").sub_ext("") == path.basename.sub_ext("")
82
+ }
83
+ if reference_files.empty?
84
+ print "Reference file does not exist for [#{path}]\n"
85
+ counter = 1
86
+ make_reference = true
87
+ else
88
+ reference_files.sort_by! {|f| f.ctime }
89
+ last_ref = reference_files[-1]
90
+ print "Comparing [#{path}] to reference file: [#{last_ref.basename}]: "
91
+ if !FileUtils.compare_file(path, last_ref)
92
+ print("\n ---> Differences detected\n")
93
+ counter = last_ref.sub_ext("").extname.delete('.').to_i + 1
94
+ make_reference = true
95
+ else
96
+ print("identical\n")
97
+ end
98
+ end
99
+
100
+ if make_reference
101
+ new_path = path.sub_ext(".#{counter}.swagger_ref")
102
+ print " ---> Keeping current output as [#{new_path}]\n"
103
+ path.rename(new_path)
104
+ reference_files << new_path
105
+ else
106
+ path.delete
107
+ end
108
+
109
+ num_refs_to_keep = 3
110
+ if reference_files.length > num_refs_to_keep
111
+ (reference_files - reference_files[-num_refs_to_keep..-1]).each{|f| f.delete}
112
+ end
113
+ }
114
+ end
115
+ end
116
+
117
+
118
+
119
+ # By default the full cache is built.
120
+ # It is possible to generate index resp. resources only with
121
+ # rake apipie:cache cache_part=index (resources resp.)
122
+ # Default output dir ('public/apipie_cache') can be changed with OUT=/some/dir
123
+ desc "Generate cache to avoid production dependencies on markup languages"
124
+ task :cache => :environment do
125
+ puts "#{Time.now} | Started"
126
+ cache_part = ENV['cache_part']
127
+ generate_index = (cache_part == 'resources' ? false : true)
128
+ generate_resources = (cache_part == 'index' ? false : true)
129
+ with_loaded_documentation do
130
+ puts "#{Time.now} | Documents loaded..."
131
+ ([nil] + Apipie.configuration.languages).each do |lang|
132
+ I18n.locale = lang || Apipie.configuration.default_locale
133
+ puts "#{Time.now} | Processing docs for #{lang}"
134
+ cache_dir = ENV["OUT"] || Apipie.configuration.cache_dir
135
+ subdir = Apipie.configuration.doc_base_url.sub(/\A\//,"")
136
+ subdir_levels = subdir.split('/').length
137
+ subdir_traversal_prefix = '../' * subdir_levels
138
+ file_base = File.join(cache_dir, Apipie.configuration.doc_base_url)
139
+
140
+ if generate_index
141
+ Apipie.url_prefix = "./#{subdir}"
142
+ doc = Apipie.to_json(Apipie.configuration.default_version, nil, nil, lang)
143
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
144
+ generate_index_page(file_base, doc, true, false, lang)
145
+ end
146
+ Apipie.available_versions.each do |version|
147
+ file_base_version = File.join(file_base, version)
148
+ Apipie.url_prefix = "#{subdir_traversal_prefix}#{subdir}"
149
+ doc = Apipie.to_json(version, nil, nil, lang)
150
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
151
+
152
+ generate_index_page(file_base_version, doc, true, true, lang) if generate_index
153
+ if generate_resources
154
+ Apipie.url_prefix = "../#{subdir_traversal_prefix}#{subdir}"
155
+ generate_resource_pages(version, file_base_version, doc, true, lang)
156
+ Apipie.url_prefix = "../../#{subdir_traversal_prefix}#{subdir}"
157
+ generate_method_pages(version, file_base_version, doc, true, lang)
158
+ end
159
+ end
160
+ end
161
+ end
162
+ puts "#{Time.now} | Finished"
163
+ end
164
+
165
+ # Attempt to use the Rails application views, otherwise default to built in views
166
+ def renderer
167
+ return @apipie_renderer if @apipie_renderer
168
+
169
+ base_paths = [File.expand_path("../../../app/views/apipie/apipies", __FILE__)]
170
+ base_paths.unshift("#{Rails.root}/app/views/apipie/apipies") if File.directory?("#{Rails.root}/app/views/apipie/apipies")
171
+
172
+ layouts_paths = [File.expand_path("../../../app/views/layouts", __FILE__)]
173
+ layouts_paths.unshift("#{Rails.root}/app/views/layouts") if File.directory?("#{Rails.root}/app/views/layouts/apipie")
174
+
175
+ @apipie_renderer = ActionView::Base.new(base_paths + layouts_paths)
176
+ @apipie_renderer.singleton_class.send(:include, ApipieHelper)
177
+ return @apipie_renderer
178
+ end
179
+
180
+ def render_page(file_name, template, variables, layout = 'apipie')
181
+ av = renderer
182
+ File.open(file_name, "w") do |f|
183
+ variables.each do |var, val|
184
+ av.instance_variable_set("@#{var}", val)
185
+ end
186
+ f.write av.render(
187
+ :template => "#{template}",
188
+ :layout => (layout && "apipie/#{layout}"))
189
+ end
190
+ end
191
+
192
+ def generate_swagger_using_args(args, out)
193
+ args.with_defaults(:version => Apipie.configuration.default_version,
194
+ :swagger_content_type_input => Apipie.configuration.swagger_content_type_input || :form_data,
195
+ :filename_suffix => nil)
196
+ Apipie.configuration.swagger_content_type_input = args[:swagger_content_type_input].to_sym
197
+ count = 0
198
+
199
+ sfx = args[:filename_suffix] || "_#{args[:swagger_content_type_input]}"
200
+
201
+ paths = []
202
+
203
+ ([nil] + Apipie.configuration.languages).each do |lang|
204
+ doc = Apipie.to_swagger_json(args[:version], nil, nil, lang, count==0)
205
+ paths << generate_swagger_json_page(out, doc, sfx, lang)
206
+ count+=1
207
+ end
208
+
209
+ paths
210
+ end
211
+
212
+ def generate_json_page(file_base, doc, lang = nil)
213
+ FileUtils.mkdir_p(file_base) unless File.exists?(file_base)
214
+
215
+ filename = "schema_apipie#{lang_ext(lang)}.json"
216
+ File.open("#{file_base}/#{filename}", 'w') { |file| file.write(JSON.pretty_generate(doc)) }
217
+ end
218
+
219
+ def generate_swagger_json_page(file_base, doc, sfx="", lang = nil)
220
+ FileUtils.mkdir_p(file_base) unless File.exists?(file_base)
221
+
222
+ path = Pathname.new("#{file_base}/schema_swagger#{sfx}#{lang_ext(lang)}.json")
223
+ File.open(path, 'w') { |file| file.write(JSON.pretty_generate(doc)) }
224
+
225
+ path
226
+ end
227
+
228
+ def generate_one_page(file_base, doc, lang = nil)
229
+ FileUtils.mkdir_p(File.dirname(file_base)) unless File.exists?(File.dirname(file_base))
230
+
231
+ render_page("#{file_base}-onepage#{lang_ext(lang)}.html", "static", {:doc => doc[:docs],
232
+ :language => lang, :languages => Apipie.configuration.languages})
233
+ end
234
+
235
+ def generate_plain_page(file_base, doc, lang = nil)
236
+ FileUtils.mkdir_p(File.dirname(file_base)) unless File.exists?(File.dirname(file_base))
237
+
238
+ render_page("#{file_base}-plain#{lang_ext(lang)}.html", "plain", {:doc => doc[:docs],
239
+ :language => lang, :languages => Apipie.configuration.languages}, nil)
240
+ end
241
+
242
+ def generate_index_page(file_base, doc, include_json = false, show_versions = false, lang = nil)
243
+ FileUtils.mkdir_p(File.dirname(file_base)) unless File.exists?(File.dirname(file_base))
244
+ versions = show_versions && Apipie.available_versions
245
+ render_page("#{file_base}#{lang_ext(lang)}.html", "index", {:doc => doc[:docs],
246
+ :versions => versions, :language => lang, :languages => Apipie.configuration.languages})
247
+
248
+ File.open("#{file_base}#{lang_ext(lang)}.json", "w") { |f| f << doc.to_json } if include_json
249
+ end
250
+
251
+ def generate_resource_pages(version, file_base, doc, include_json = false, lang = nil)
252
+ doc[:docs][:resources].each do |resource_name, _|
253
+ resource_file_base = File.join(file_base, resource_name.to_s)
254
+ FileUtils.mkdir_p(File.dirname(resource_file_base)) unless File.exists?(File.dirname(resource_file_base))
255
+
256
+ doc = Apipie.to_json(version, resource_name, nil, lang)
257
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
258
+ render_page("#{resource_file_base}#{lang_ext(lang)}.html", "resource", {:doc => doc[:docs],
259
+ :resource => doc[:docs][:resources].first, :language => lang, :languages => Apipie.configuration.languages})
260
+ File.open("#{resource_file_base}#{lang_ext(lang)}.json", "w") { |f| f << doc.to_json } if include_json
261
+ end
262
+ end
263
+
264
+ def generate_method_pages(version, file_base, doc, include_json = false, lang = nil)
265
+ doc[:docs][:resources].each do |resource_name, resource_params|
266
+ resource_params[:methods].each do |method|
267
+ method_file_base = File.join(file_base, resource_name.to_s, method[:name].to_s)
268
+ FileUtils.mkdir_p(File.dirname(method_file_base)) unless File.exists?(File.dirname(method_file_base))
269
+
270
+ doc = Apipie.to_json(version, resource_name, method[:name], lang)
271
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
272
+ render_page("#{method_file_base}#{lang_ext(lang)}.html", "method", {:doc => doc[:docs],
273
+ :resource => doc[:docs][:resources].first,
274
+ :method => doc[:docs][:resources].first[:methods].first,
275
+ :language => lang,
276
+ :languages => Apipie.configuration.languages})
277
+
278
+ File.open("#{method_file_base}#{lang_ext(lang)}.json", "w") { |f| f << doc.to_json } if include_json
279
+ end
280
+ end
281
+ end
282
+
283
+ def with_loaded_documentation
284
+ Apipie.configuration.use_cache = false # we don't want to skip DSL evaluation
285
+ Apipie.reload_documentation
286
+ yield
287
+ end
288
+
289
+
290
+ def copy_jscss(dest)
291
+ src = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'app', 'public', 'apipie'))
292
+ FileUtils.mkdir_p dest
293
+ FileUtils.cp_r "#{src}/.", dest
294
+ end
295
+
296
+ def lang_ext(lang = nil)
297
+ lang ? ".#{lang}" : ""
298
+ end
299
+
300
+ desc "Generate CLI client for API documented with apipie gem. (deprecated)"
301
+ task :client do
302
+ puts <<MESSAGE
303
+ The apipie gem itself doesn't provide client code generator. See
304
+ https://github.com/Pajk/apipie-rails/wiki/CLI-client for more information on
305
+ how to write your own generator.
306
+ MESSAGE
307
+ end
308
+
309
+ def plaintext(text)
310
+ text.gsub(/<.*?>/, '').gsub("\n",' ').strip
311
+ end
312
+
313
+ desc "Update api description in controllers base on routes"
314
+ task :update_from_routes => [:environment] do
315
+ Apipie.configuration.force_dsl = true
316
+ ignored = Apipie.configuration.ignored_by_recorder
317
+ with_loaded_documentation do
318
+ apis_from_routes = Apipie::Extractor.apis_from_routes
319
+ apis_from_routes.each do |(controller, action), apis|
320
+ next if ignored.include?(controller)
321
+ next if ignored.include?("#{controller}##{action}")
322
+ Apipie::Extractor::Writer.update_action_description((controller.safe_constantize || next), action) do |u|
323
+ u.update_apis(apis)
324
+ end
325
+ end
326
+ end
327
+ end
328
+
329
+ desc "Convert your examples from the old yaml into the new json format"
330
+ task :convert_examples => :environment do
331
+ yaml_examples_file = File.join(Rails.root, Apipie.configuration.doc_path, "apipie_examples.yml")
332
+ if File.exists?(yaml_examples_file)
333
+ #if SafeYAML gem is enabled, it will load examples as an array of Hash, instead of hash
334
+ if defined? SafeYAML
335
+ examples = YAML.load_file(yaml_examples_file, :safe=>false)
336
+ else
337
+ examples = YAML.load_file(yaml_examples_file)
338
+ end
339
+ else
340
+ examples = {}
341
+ end
342
+ Apipie::Extractor::Writer.write_recorded_examples(examples)
343
+ end
344
+
345
+ end
@@ -0,0 +1,3 @@
1
+ the rel-eng/packages directory contains metadata files
2
+ named after their packages. Each file has the latest tagged
3
+ version and the project's relative directory.
@@ -0,0 +1 @@
1
+ 0.0.7-1 /
@@ -0,0 +1,5 @@
1
+ [globalconfig]
2
+ default_builder = tito.builder.Builder
3
+ default_tagger = tito.tagger.VersionTagger
4
+ changelog_do_not_remove_cherrypick = 0
5
+ changelog_format = %s (%ae)
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Api::V1::ArchitecturesController do
4
+ describe "resource description" do
5
+ subject { Apipie.get_resource_description(Api::V1::ArchitecturesController, "1.0") }
6
+
7
+ it "should be version 1.0" do
8
+ expect(subject._version).to eq('1.0')
9
+
10
+ expect(Apipie.resource_descriptions['1.0'].size).to eq(2)
11
+ expect(Apipie.resource_descriptions['1.0'].keys).to include('architectures', 'base')
12
+ end
13
+
14
+ context "there is another version" do
15
+ let(:v2) { archv2 = Apipie.get_resource_description(Api::V2::ArchitecturesController, "2.0") }
16
+
17
+ it "should have unique doc url" do
18
+ expect(subject.doc_url).not_to eq(v2.doc_url)
19
+ end
20
+
21
+ it "should have unique methods" do
22
+ expect(subject._methods.keys).to include(:index)
23
+ expect(v2._methods.keys).to include(:index)
24
+ expect(subject._methods[:index]).not_to eq(v2._methods[:index])
25
+ end
26
+
27
+ end
28
+ end
29
+ end