apical 0.1.4

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.
Files changed (44) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +70 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +94 -0
  7. data/Rakefile +55 -0
  8. data/VERSION +1 -0
  9. data/apical.gemspec +122 -0
  10. data/bin/apical +7 -0
  11. data/examples/taco_truck/Gemfile +7 -0
  12. data/examples/taco_truck/Gemfile.lock +50 -0
  13. data/examples/taco_truck/app.rb +13 -0
  14. data/examples/taco_truck/taco_truck.apical +18 -0
  15. data/lib/apical.rb +30 -0
  16. data/lib/apical/adapter.rb +21 -0
  17. data/lib/apical/adapters/http_adapter.rb +30 -0
  18. data/lib/apical/adapters/rack_adapter.rb +16 -0
  19. data/lib/apical/cli.rb +36 -0
  20. data/lib/apical/content_types.rb +62 -0
  21. data/lib/apical/resource.rb +138 -0
  22. data/lib/apical/resource_types.rb +36 -0
  23. data/lib/apical/runner.rb +104 -0
  24. data/lib/apical/writers/console_writer.rb +26 -0
  25. data/lib/apical/writers/html_writer.rb +37 -0
  26. data/spec/apical/adapters/http_adapter_spec.rb +24 -0
  27. data/spec/apical/cli_spec.rb +81 -0
  28. data/spec/apical/content_types_spec.rb +9 -0
  29. data/spec/apical/rack_adapter_spec.rb +12 -0
  30. data/spec/apical_spec.rb +360 -0
  31. data/spec/before_and_after_spec.rb +211 -0
  32. data/spec/fixtures/cli_example_1.rb +7 -0
  33. data/spec/fixtures/cli_example_2.rb +8 -0
  34. data/spec/fixtures/example_require.rb +3 -0
  35. data/spec/fixtures/load_paths_example.apical +1 -0
  36. data/spec/html_writer_spec.rb +117 -0
  37. data/spec/http_apical_spec.rb +23 -0
  38. data/spec/load_paths_spec.rb +12 -0
  39. data/spec/spec_helper.rb +19 -0
  40. data/spec/support/test_apps.rb +34 -0
  41. data/templates/apical_helper.rb +11 -0
  42. data/templates/layout.mustache +180 -0
  43. data/templates/resource.mustache +14 -0
  44. metadata +248 -0
@@ -0,0 +1,211 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "before and after blocks" do
4
+
5
+ describe "when specifying a global before block" do
6
+ before do
7
+ $var = 0
8
+ @doc = Apical.new do
9
+ adapter :rack, app: TestApp
10
+ before do
11
+ $var += 1
12
+ end
13
+
14
+ get '/tacos.json' do
15
+ desc "Get all tacos as JSON"
16
+ end
17
+
18
+ get '/tacos.xml' do
19
+ desc "Get all tacos as XML"
20
+ end
21
+ end
22
+
23
+ @doc.run
24
+ end
25
+
26
+ it "should have run the before block twice, once for each resource" do
27
+ $var.should == 2
28
+ end
29
+ end
30
+
31
+ describe "when specifying a global before each block" do
32
+ before do
33
+ $var = 0
34
+ @doc = Apical.new do
35
+ adapter :rack, app: TestApp
36
+ before :each do
37
+ $var += 1
38
+ end
39
+
40
+ get '/tacos.json' do
41
+ desc "Get all tacos as JSON"
42
+ end
43
+
44
+ get '/tacos.xml' do
45
+ desc "Get all tacos as XML"
46
+ end
47
+ end
48
+
49
+ @doc.run
50
+ end
51
+
52
+ it "should have run the before block twice, once for each resource" do
53
+ $var.should == 2
54
+ end
55
+ end
56
+
57
+ describe "when specifying a global before all block" do
58
+ before do
59
+ $var = 0
60
+ @doc = Apical.new do
61
+ adapter :rack, app: TestApp
62
+ before :all do
63
+ $var += 1
64
+ end
65
+
66
+ get '/tacos.json' do
67
+ desc "Get all tacos as JSON"
68
+ end
69
+
70
+ get '/tacos.xml' do
71
+ desc "Get all tacos as XML"
72
+ end
73
+ end
74
+
75
+ @doc.run
76
+ end
77
+
78
+ it "should have run the before block once and only once" do
79
+ $var.should == 1
80
+ end
81
+ end
82
+
83
+ describe "when specifying a global after block" do
84
+ before do
85
+ $var = 0
86
+ @doc = Apical.new do
87
+ adapter :rack, app: TestApp
88
+ after do
89
+ $var += 1
90
+ end
91
+
92
+ get '/tacos.json' do
93
+ desc "Get all tacos as JSON"
94
+ end
95
+
96
+ get '/tacos.xml' do
97
+ desc "Get all tacos as XML"
98
+ end
99
+ end
100
+
101
+ @doc.run
102
+ end
103
+
104
+ it "should have run the after block twice, once for each resource" do
105
+ $var.should == 2
106
+ end
107
+ end
108
+
109
+ describe "when specifying a global after each block" do
110
+ before do
111
+ $var = 0
112
+ @doc = Apical.new do
113
+ adapter :rack, app: TestApp
114
+ after :each do
115
+ $var += 1
116
+ end
117
+
118
+ get '/tacos.json' do
119
+ desc "Get all tacos as JSON"
120
+ end
121
+
122
+ get '/tacos.xml' do
123
+ desc "Get all tacos as XML"
124
+ end
125
+ end
126
+
127
+ @doc.run
128
+ end
129
+
130
+ it "should have run the after block twice, once for each resource" do
131
+ $var.should == 2
132
+ end
133
+ end
134
+
135
+ describe "when specifying a global after all block" do
136
+ before do
137
+ $var = 0
138
+ @doc = Apical.new do
139
+ adapter :rack, app: TestApp
140
+ after :all do
141
+ $var += 1
142
+ end
143
+
144
+ get '/tacos.json' do
145
+ desc "Get all tacos as JSON"
146
+ end
147
+
148
+ get '/tacos.xml' do
149
+ desc "Get all tacos as XML"
150
+ end
151
+ end
152
+
153
+ @doc.run
154
+ end
155
+
156
+ it "should have run the after block once and only once" do
157
+ $var.should == 1
158
+ end
159
+ end
160
+
161
+ describe "when specifying a resource-specific before block" do
162
+ before do
163
+ $var = 0
164
+ @doc = Apical.new do
165
+ adapter :rack, app: TestApp
166
+ get '/tacos.json' do
167
+ desc "Get all tacos as JSON"
168
+ before do
169
+ $var += 1
170
+ end
171
+ end
172
+
173
+ get '/tacos.xml' do
174
+ desc "Get all tacos as XML"
175
+ end
176
+ end
177
+
178
+ @doc.run
179
+ end
180
+
181
+ it "should only run the before block for its resource" do
182
+ $var.should == 1
183
+ end
184
+ end
185
+
186
+ describe "when specifying a resource-specific after block" do
187
+ before do
188
+ $var = 0
189
+ @doc = Apical.new do
190
+ adapter :rack, app: TestApp
191
+ get '/tacos.json' do
192
+ desc "Get all tacos as JSON"
193
+ after do
194
+ $var += 1
195
+ end
196
+ end
197
+
198
+ get '/tacos.xml' do
199
+ desc "Get all tacos as XML"
200
+ end
201
+ end
202
+
203
+ @doc.run
204
+ end
205
+
206
+ it "should only run the before block for its resource" do
207
+ $var.should == 1
208
+ end
209
+ end
210
+
211
+ end
@@ -0,0 +1,7 @@
1
+ adapter :rack, app: ExampleApp
2
+ name "CLI Example API"
3
+ desc "This is an example. So don't tread on me, foo."
4
+
5
+ get "/example.json" do
6
+ desc "An example get resource"
7
+ end
@@ -0,0 +1,8 @@
1
+ name "CLI Example API"
2
+ desc "This is an example. So don't tread on me, foo."
3
+
4
+ adapter :rack, app: ExampleApp
5
+
6
+ get "/example.json" do
7
+ desc "An example get resource"
8
+ end
@@ -0,0 +1,3 @@
1
+
2
+ $required = true
3
+
@@ -0,0 +1 @@
1
+ require 'example_require'
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Apical::HtmlWriter do
4
+ before do
5
+ @doc = Apical.new do
6
+ adapter :rack, app: TestApp
7
+ get '/tacos.json' do
8
+ desc "Get all tacos"
9
+ end
10
+ end
11
+ end
12
+
13
+ describe "when writing to HTML" do
14
+ subject do
15
+ stream = StringIO.new
16
+ Apical::HtmlWriter.new(@doc).write(stream)
17
+ stream.read
18
+ end
19
+
20
+ it "should write the request method" do
21
+ subject.should include('GET')
22
+ end
23
+
24
+ it "should write the request path" do
25
+ subject.should include("/tacos.json")
26
+ end
27
+
28
+ it "should write the response body" do
29
+ subject.should include('meat')
30
+ end
31
+
32
+ describe "when accepting JSON as input" do
33
+ before do
34
+ @doc = Apical.new do
35
+ adapter :rack, app: TestApp
36
+ post '/tacos.json' do
37
+ desc "Make a new delicious taco"
38
+ accept :json
39
+ params do
40
+ { meat: 'beef', lettuce: true }
41
+ end
42
+ end
43
+ end
44
+
45
+ @doc.run
46
+ end
47
+
48
+ subject do
49
+ stream = StringIO.new
50
+ Apical::HtmlWriter.new(@doc).write(stream)
51
+ stream.read
52
+ end
53
+
54
+ it "should pretty-print the JSON data in the IN section" do
55
+ subject.should include("{\n "meat": "beef",\n "lettuce": true\n}")
56
+ end
57
+ end
58
+
59
+ describe "when setting the default accept and content type" do
60
+ before do
61
+ @doc = Apical.new do
62
+ adapter :rack, app: TestApp
63
+ accept :json
64
+ content_type :json
65
+
66
+ post '/tacos.json' do
67
+ desc "Make a new delicious taco"
68
+ params do
69
+ { meat: 'beef', lettuce: true }
70
+ end
71
+ end
72
+ end
73
+
74
+ @doc.run
75
+ end
76
+
77
+ subject { @doc }
78
+
79
+ it "should propagate the accept type to its resources" do
80
+ @doc.resources.first.accept.should be_a(Apical::JsonContentType)
81
+ end
82
+
83
+ it "should propagate the content type to its resources" do
84
+ @doc.resources.first.content_type.should be_a(Apical::JsonContentType)
85
+ end
86
+ end
87
+
88
+ describe "when providing JSON as output" do
89
+ before do
90
+ @doc = Apical.new do
91
+ adapter :rack, app: TestApp
92
+ post '/tacos.json' do
93
+ desc "Make a new delicious taco"
94
+ accept :json
95
+ content_type :json
96
+ params do
97
+ { meat: 'beef', lettuce: true }
98
+ end
99
+ end
100
+ end
101
+
102
+ @doc.run
103
+ end
104
+
105
+ subject do
106
+ stream = StringIO.new
107
+ Apical::HtmlWriter.new(@doc).write(stream)
108
+ stream.read
109
+ end
110
+
111
+ it "should pretty-print the JSON data in the OUT section" do
112
+ subject.should include("{\n "meat": "beef",\n "lettuce": true\n}")
113
+ end
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe "creating an apical from a real running HTTP server" do
4
+ before do
5
+ stub_request(:get, "http://mocksite.com/resource.json").
6
+ to_return(:status => 200, :body => "this is a resource", :headers => {})
7
+
8
+ @doc = Apical.new do
9
+ adapter :http, base_uri: "http://mocksite.com"
10
+
11
+ get "/resource.json" do
12
+ desc "A test GET resource"
13
+ end
14
+ end
15
+ end
16
+
17
+ subject { @doc.run }
18
+
19
+ it "should have run the request" do
20
+ subject.resources.first.response_body.should == "this is a resource"
21
+ end
22
+ end
23
+
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe "an apical file with a relative require line" do
4
+ before do
5
+ @cli = Apical::CLI.new
6
+ @cli.compile File.dirname(__FILE__) + '/fixtures/load_paths_example.apical'
7
+ end
8
+
9
+ it "should load the file from within the same directory as the apical file" do
10
+ $required.should == true
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'apical'
5
+
6
+ require 'webmock/rspec'
7
+
8
+ # Requires supporting files with custom matchers and macros, etc,
9
+ # in ./support/ and its subdirectories.
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
+
12
+ ROOT = Pathname.new(File.dirname(__FILE__) + '/../')
13
+
14
+ RSpec.configure do |config|
15
+
16
+ config.before(:all) do
17
+ end
18
+
19
+ end
@@ -0,0 +1,34 @@
1
+ require 'sinatra/base'
2
+
3
+ class TestApp < Sinatra::Base
4
+ get '/tacos.json' do
5
+ JSON.generate [ { meat: 'beef' }, { meat: 'chicken' } ]
6
+ end
7
+
8
+ post '/tacos.json' do
9
+ JSON.generate( { body: request.body.read } )
10
+ end
11
+
12
+ get '/tacos/:id.json' do
13
+ JSON.generate({ meat: 'beef', id: params['id'] })
14
+ end
15
+ end
16
+
17
+ class RequestMethodsApp < Sinatra::Base
18
+ get '/get.json' do
19
+ JSON.generate({ method: 'GET' })
20
+ end
21
+ post '/post.json' do
22
+ JSON.generate({ method: 'POST' })
23
+ end
24
+ put '/put.json' do
25
+ JSON.generate({ method: 'PUT' })
26
+ end
27
+ delete '/delete.json' do
28
+ JSON.generate({ method: 'DELETE' })
29
+ end
30
+ options '/options.json' do
31
+ JSON.generate({ method: 'OPTIONS' })
32
+ end
33
+ end
34
+