buttless 0.0.1

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.
@@ -0,0 +1,122 @@
1
+ h1. My Buttless API
2
+
3
+ Congratulations, you've just started using Buttless to design, document and develop against your API.
4
+
5
+ Buttless lets you design an API, generate docs, and develop against it in minutes. No need to have a real back-end in place.
6
+
7
+ See the "Buttless home page":https://github.com/tobinharris/buttless for more info.
8
+
9
+
10
+ h2. About
11
+
12
+ Buttless is pretty simple. It's structured like this:
13
+
14
+ * You define your API end points, parameters and descriptions in the @database.yml@ file
15
+ * You add example responses in the @/json_examples@ folder
16
+ * You add tests for the API, if you want to, in the @/test@ folder.
17
+
18
+ Creating and modifying your API's design takes seconds or minutes once you get the hang of it.
19
+
20
+ After that, you can:
21
+
22
+ * Run a web server which will serve up your designed API with example data to develop against
23
+ * Generate pretty PDF's documenting your API to give to developers to build the real deal against
24
+ * Generate pretty HTML documenting for your API
25
+ * Run tests the real API, to make sure it's being developed according to your design
26
+
27
+ h2. Getting Started
28
+
29
+ h3. Install Gems
30
+
31
+ Install necessary gems.
32
+
33
+ <pre>
34
+ bundle install
35
+ </pre>
36
+
37
+ h3. Add an API definition to the database.yml file
38
+
39
+ <pre>
40
+ ---
41
+ - resource: Funky Thing
42
+ methods:
43
+ - path: /api/funky/thing
44
+ resolves_to: /api/funky/thing/info.json
45
+ method: GET
46
+ precis: |
47
+ Returns information about the thing.
48
+ description: |
49
+ parameters:
50
+ example_response: funky_thing
51
+ </pre>
52
+
53
+ h3. Add an example JSON response file
54
+
55
+ <pre>
56
+ # /json_examples/funky_thing.json
57
+
58
+ {"id": 2, "name": "Funky Thing"}
59
+ </pre>
60
+
61
+ h3. Generate the HTML or PDF docs
62
+
63
+ Your API is defined, now generate the HTML docs using:
64
+
65
+ <pre>
66
+ rake html
67
+ open api-doc/index.html
68
+ </pre>
69
+
70
+ Here's a sample:
71
+
72
+ !http://puu.sh/nobh!
73
+
74
+ Note it includes the curl statement, API index, descriptions and parameters.
75
+
76
+ Or, you can generate a similar PDF using
77
+
78
+ <pre>
79
+ rake pdf
80
+ open api-doc/funky-thing.pdf
81
+ </pre>
82
+
83
+
84
+
85
+ h3. Run a fake API in a web server
86
+
87
+ <pre>
88
+ cd server
89
+ thin start
90
+ </pre>
91
+
92
+ You're API is now available as a web server. So, without a line of code, you can now do:
93
+
94
+ <pre>
95
+ curl http://localhost:3000/api/funky/stuff
96
+ </pre>
97
+
98
+ Which outputs
99
+
100
+ <pre>
101
+ [
102
+ {"id": 1, "name": "Funky 1"},
103
+ {"id": 2, "name": "Funky 2"}
104
+ ]
105
+ </pre>
106
+
107
+ That response was the example JSON file referenced in your documentation.
108
+
109
+ This is handy if your an iPhone developer, cause you can define your own API, develop against it, and then once you're ready, ask a server-side developer to build the real API!
110
+
111
+ h5. Define some tests for the API
112
+
113
+ It's easier to write API's if you have test cases setup to cover what is needed by the client. Simply add these to the ./test/ folder and then:
114
+
115
+ <pre>
116
+ rake test
117
+ </pre>
118
+
119
+
120
+
121
+
122
+
@@ -0,0 +1,47 @@
1
+ require 'sinatra/base'
2
+
3
+ @home_dir = File.dirname(__FILE__) + '/../'
4
+
5
+
6
+
7
+ # Create new Sinatra controller
8
+ controller = Sinatra.new do
9
+ enable :logging
10
+ set :root, '../api-doc/'
11
+ configure do
12
+ set :views, ''
13
+ end
14
+
15
+ end
16
+
17
+ # Loop through our API database
18
+ # setting up the sinatra app dynamically
19
+ map('/') do
20
+ run Sinatra.new(controller){
21
+ @db = YAML::load( File.open( "../database.yaml" ) )
22
+ @db.each do |resource|
23
+ resource["methods"].each do |method|
24
+ #next if method["path"] =~ /comfort_/
25
+ puts "Configuring #{method["path"]}"
26
+
27
+ # map the path of the API method
28
+
29
+
30
+ # if it's a POST method
31
+ if method["method"] == "POST"
32
+ post(method["path"]){
33
+ content_type :json
34
+ File.open("../json_examples/#{method["example_response"]}.json".downcase,'r').read
35
+ }
36
+ else
37
+ get(method["path"]){
38
+ content_type :json
39
+ File.open("../json_examples/#{method['example_response']}.json".downcase,'r').read
40
+ }
41
+ end
42
+ end
43
+ end
44
+ }
45
+ end
46
+
47
+
@@ -0,0 +1,33 @@
1
+ require 'minitest/autorun'
2
+ require 'webmock/minitest'
3
+ require 'minitest/pride'
4
+ require 'minitest/reporters'
5
+ require 'rest-client'
6
+ require 'json'
7
+
8
+
9
+ module MiniTest
10
+ module Reporters
11
+ class SpecReporter
12
+ private
13
+ def print_test_with_time(test)
14
+ total_time = Time.now - runner.test_start_time
15
+ print(" %s (%.2fs)" % [test.gsub(/test_|[0-9]{4,4}|_/,' ').strip, total_time])
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+
22
+ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
23
+ MiniTest::Unit.runner.reporters << MiniTest::Reporters::SpecReporter.new
24
+
25
+ def prepare
26
+ @examples_dir = File.dirname(__FILE__) + "/../json_examples/"
27
+ @localhost = "http://192.168.1.3/api"
28
+ end
29
+
30
+ def json(data)
31
+ JSON.parse(data)
32
+ end
33
+
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + "/test_helper.rb"
2
+
3
+ describe "When accessing THe Funky" do
4
+ describe "using resource Funky" do
5
+
6
+ it "should allow reading of thing" do
7
+ skip
8
+ end
9
+
10
+ it "should allow reading of stuff" do
11
+ skip
12
+ end
13
+
14
+ end
15
+ end
data/readme.textile ADDED
@@ -0,0 +1,50 @@
1
+ h1. Buttless
2
+
3
+ h2. Design, document and develop against API's in minutes without a back-end.
4
+
5
+ I wrote Buttless because "Engine Room Apps":http://engineroomapps.com often have to develop an iPhone app or web site without having the backend API or in place yet. This is pretty common when you're back-end developers are not in the office, or if you're waiting for your client's team to get on to it!
6
+
7
+ With Buttless, you can do the following pretty quickly:
8
+
9
+ # Define an API (resources, methods, parameters) using a simple YAML file
10
+ # Define example JSON results that the API would send back
11
+ # Generate pretty HTML and PDF documents for that defined API, which include usage instructions with CURL
12
+ # Run a web server which creates a pretend backend for your API, so if you're an iPhone developer you have something to code against instantly
13
+
14
+ h2. Getting Started
15
+
16
+ Install the gem
17
+
18
+ <pre>
19
+ gem install buttless
20
+ </pre>
21
+
22
+ Then go to your usual code folder and type
23
+
24
+ <pre>
25
+ buttless my-first-api
26
+ </pre>
27
+
28
+ Congrats, you've just started defining your API, and will be soon able to generate docs and develop against it.
29
+
30
+ Now to "learn how to work with your API":https://github.com/tobinharris/buttless/blob/master/lib/template/readme.textile.
31
+
32
+
33
+ h2. Contributing to buttless
34
+
35
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
36
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
37
+ * Fork the project.
38
+ * Start a feature/bugfix branch.
39
+ * Commit and push until you are happy with your contribution.
40
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
41
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
42
+
43
+ h2. Copyright
44
+
45
+ Copyright (c) 2012 Tobin Harris. See LICENSE.txt for
46
+ further details.
47
+
48
+
49
+
50
+
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'buttless'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestButtless < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,287 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buttless
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tobin Harris
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-01 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: &70116055586520 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70116055586520
25
+ - !ruby/object:Gem::Dependency
26
+ name: json
27
+ requirement: &70116055585380 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70116055585380
36
+ - !ruby/object:Gem::Dependency
37
+ name: pdfkit
38
+ requirement: &70116055584240 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70116055584240
47
+ - !ruby/object:Gem::Dependency
48
+ name: activesupport
49
+ requirement: &70116055583200 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70116055583200
58
+ - !ruby/object:Gem::Dependency
59
+ name: minitest
60
+ requirement: &70116055581980 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70116055581980
69
+ - !ruby/object:Gem::Dependency
70
+ name: googlecharts
71
+ requirement: &70116055580500 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70116055580500
80
+ - !ruby/object:Gem::Dependency
81
+ name: array_stats
82
+ requirement: &70116055573340 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70116055573340
91
+ - !ruby/object:Gem::Dependency
92
+ name: redcarpet
93
+ requirement: &70116055572220 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70116055572220
102
+ - !ruby/object:Gem::Dependency
103
+ name: webmock
104
+ requirement: &70116055570620 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *70116055570620
113
+ - !ruby/object:Gem::Dependency
114
+ name: rake
115
+ requirement: &70116055569540 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: *70116055569540
124
+ - !ruby/object:Gem::Dependency
125
+ name: tilt
126
+ requirement: &70116055567060 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: *70116055567060
135
+ - !ruby/object:Gem::Dependency
136
+ name: minitest-reporters
137
+ requirement: &70116055559540 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: *70116055559540
146
+ - !ruby/object:Gem::Dependency
147
+ name: sinatra
148
+ requirement: &70116055558580 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: *70116055558580
157
+ - !ruby/object:Gem::Dependency
158
+ name: shoulda
159
+ requirement: &70116055557600 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *70116055557600
168
+ - !ruby/object:Gem::Dependency
169
+ name: rdoc
170
+ requirement: &70116055556580 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: '3.12'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *70116055556580
179
+ - !ruby/object:Gem::Dependency
180
+ name: bundler
181
+ requirement: &70116055555460 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ~>
185
+ - !ruby/object:Gem::Version
186
+ version: 1.0.0
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *70116055555460
190
+ - !ruby/object:Gem::Dependency
191
+ name: jeweler
192
+ requirement: &70116055554460 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 1.8.3
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *70116055554460
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov
203
+ requirement: &70116055553020 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *70116055553020
212
+ description: Buttless gives you a way to quickly flesh out an API in detail. It generates
213
+ sexy documentation. And, you can quickly run the API and simulate various scenarios
214
+ without neededing a backend.
215
+ email: tobin@tobinharris.com
216
+ executables:
217
+ - buttless
218
+ extensions: []
219
+ extra_rdoc_files:
220
+ - LICENSE.txt
221
+ - README_old.rdoc
222
+ files:
223
+ - .document
224
+ - Gemfile
225
+ - Gemfile.lock
226
+ - LICENSE.txt
227
+ - README_old.rdoc
228
+ - Rakefile
229
+ - VERSION
230
+ - bin/buttless
231
+ - buttless.gemspec
232
+ - lib/buttless.rb
233
+ - lib/template/.DS_Store
234
+ - lib/template/Gemfile
235
+ - lib/template/Gemfile.lock
236
+ - lib/template/Rakefile
237
+ - lib/template/api-doc/.DS_Store
238
+ - lib/template/api-doc/images/logo.png
239
+ - lib/template/api-doc/index.html
240
+ - lib/template/api-doc/index.md.erb
241
+ - lib/template/api-doc/report.css
242
+ - lib/template/api-doc/screen.css
243
+ - lib/template/api-doc/template.html.erb
244
+ - lib/template/code_samples/prthw.md.erb
245
+ - lib/template/config.yaml
246
+ - lib/template/database.yaml
247
+ - lib/template/install
248
+ - lib/template/json_examples/funky_stuff.json
249
+ - lib/template/json_examples/funky_stuff_info.json
250
+ - lib/template/json_examples/funky_thing.json
251
+ - lib/template/json_examples/post_ok.json
252
+ - lib/template/readme.textile
253
+ - lib/template/server/config.ru
254
+ - lib/template/test/test_helper.rb
255
+ - lib/template/test/test_stuff.rb
256
+ - readme.textile
257
+ - test/helper.rb
258
+ - test/test_buttless.rb
259
+ homepage: http://github.com/tobinharris/buttless
260
+ licenses:
261
+ - MIT
262
+ post_install_message:
263
+ rdoc_options: []
264
+ require_paths:
265
+ - lib
266
+ required_ruby_version: !ruby/object:Gem::Requirement
267
+ none: false
268
+ requirements:
269
+ - - ! '>='
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ segments:
273
+ - 0
274
+ hash: -4276506953416819614
275
+ required_rubygems_version: !ruby/object:Gem::Requirement
276
+ none: false
277
+ requirements:
278
+ - - ! '>='
279
+ - !ruby/object:Gem::Version
280
+ version: '0'
281
+ requirements: []
282
+ rubyforge_project:
283
+ rubygems_version: 1.8.11
284
+ signing_key:
285
+ specification_version: 3
286
+ summary: Design, document and develop against an API without having a backend.
287
+ test_files: []