oreflect 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,3 @@
1
+ coverage
2
+ rdoc
3
+ pkg
@@ -0,0 +1,7 @@
1
+ # OReflect
2
+
3
+ Build reflections for your REST web services so that they may easily be consumed.
4
+
5
+ ## Synopsis
6
+
7
+ Check out /examples to see how it works.
@@ -0,0 +1,49 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = 'oreflect'
7
+ gem.summary = 'A library for building reflection endpoints to REST services and consuming them.'
8
+ gem.description = 'A library for building reflection endpoints to REST services and consuming them.'
9
+ gem.email = 'heycarsten@gmail.com'
10
+ gem.homepage = 'http://oreflect.org'
11
+ gem.author = 'Carsten Nielsen'
12
+ gem.add_development_dependency 'shoulda', '>= 0'
13
+ end
14
+ Jeweler::GemcutterTasks.new
15
+ rescue LoadError
16
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
17
+ end
18
+
19
+ require 'rake/testtask'
20
+ Rake::TestTask.new(:test) do |test|
21
+ test.libs << 'lib' << 'test'
22
+ test.pattern = 'test/**/test_*.rb'
23
+ test.verbose = true
24
+ end
25
+
26
+ begin
27
+ require 'rcov/rcovtask'
28
+ Rcov::RcovTask.new do |test|
29
+ test.libs << 'test'
30
+ test.pattern = 'test/**/test_*.rb'
31
+ test.verbose = true
32
+ end
33
+ rescue LoadError
34
+ task :rcov do
35
+ abort 'RCov is not available. In order to run rcov, you must: sudo gem install rcov'
36
+ end
37
+ end
38
+
39
+ task :test => :check_dependencies
40
+ task :default => :test
41
+
42
+ require 'rake/rdoctask'
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ''
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "oreflect #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.7.0
@@ -0,0 +1,10 @@
1
+ service do
2
+ name 'Test'
3
+
4
+ resource '/tests' do
5
+ action :get
6
+ action :post do
7
+ is_authenticated!
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,73 @@
1
+ service do
2
+ version 2
3
+ name 'REST Blog'
4
+ desc 'A blog system that conforms to the ideals of REST architecture'
5
+ base_uri 'http://restblog.example.com'
6
+
7
+ resource '/articles.:format' do
8
+ arg :format do
9
+ desc 'The input format'
10
+ accepted_values 'xml', 'json'
11
+ end
12
+
13
+ action :get do
14
+ name 'Show Articles'
15
+ desc 'Get all Articles matching criteria'
16
+
17
+ query :before_date do
18
+ desc 'Shows articles before this date or time'
19
+ examples '2009-09-26'
20
+ end
21
+
22
+ query :after_date do
23
+ desc 'Show articles after this date'
24
+ examples '2009-09-26'
25
+ end
26
+
27
+ query :tag do
28
+ is_multiparam!
29
+ desc 'Show articles that contain this tag or tags if many are provided.'
30
+ examples 'heycarsten', 'unspace', 'leftist', 'top100'
31
+ end
32
+
33
+ query :page do
34
+ desc 'Show this page of articles'
35
+ examples '1', '2', '3'
36
+ end
37
+
38
+ example do
39
+ path '/articles.json'
40
+ desc 'View the latest articles'
41
+ end
42
+
43
+ example do
44
+ path '/articles.json?page=2'
45
+ desc 'View page two of the latest articles'
46
+ end
47
+ end
48
+
49
+ action :post do
50
+ is_authenticated!
51
+ name 'Create Article'
52
+ desc 'Creates a new article'
53
+ body 'article[title]'
54
+ body 'article[author_name]'
55
+ body 'article[author_email]'
56
+ body 'article[publish_on]'
57
+ body 'article[body]'
58
+
59
+ example do
60
+ path '/articles.json'
61
+ body 'article[title]', 'Test Article'
62
+ body 'article[author_name]', 'Carsten Nielsen'
63
+ body 'article[author_email]', 'heycarsten@example.com'
64
+ body 'article[publish_on]', '2010-02-22 00:00:00 -0500'
65
+ body 'article[:body]', "# Title\n\nThis is a test.\n"
66
+ end
67
+ end
68
+ end
69
+
70
+ resource '/articles/:id.:format'
71
+ resource '/articles/:article_id/comments.:format'
72
+ resource '/articles/:article_id/comments/:id.:format'
73
+ end
@@ -0,0 +1,22 @@
1
+ require 'oreflect/accessors'
2
+ require 'oreflect/action'
3
+ require 'oreflect/endpoint'
4
+ require 'oreflect/error'
5
+ require 'oreflect/example'
6
+ require 'oreflect/param'
7
+ require 'oreflect/service'
8
+
9
+
10
+ module OReflect
11
+
12
+ def service(&block)
13
+ Service.new(&block)
14
+ end
15
+
16
+ def load_file(filepath)
17
+ class_eval File.read(filepath)
18
+ end
19
+
20
+ module_function :service, :load_file
21
+
22
+ end
@@ -0,0 +1,50 @@
1
+ module OReflect
2
+ module Accessors
3
+
4
+ def self.included(mod)
5
+ mod.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ def boolean_accessor(*names)
10
+ names.each do |attr_name|
11
+ dynamic_accessor attr_name
12
+
13
+ define_method "#{attr_name}?" do
14
+ instance_variable_get("@#{attr_name}") ? true : false
15
+ end
16
+
17
+ define_method "#{attr_name}!" do
18
+ instance_variable_set "@#{attr_name}", true
19
+ end
20
+ end
21
+ end
22
+
23
+ def splat_accessor(*names)
24
+ names.each do |attr_name|
25
+ define_method attr_name do |*values|
26
+ instance_variable_set("@#{attr_name}", []) unless instance_variable_get("@#{attr_name}")
27
+ if values.empty?
28
+ instance_variable_get "@#{attr_name}"
29
+ else
30
+ instance_variable_get("@#{attr_name}").concat(values)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def dynamic_accessor(*names)
37
+ names.each do |attr_name|
38
+ define_method attr_name do |*args|
39
+ if args[0]
40
+ instance_variable_set "@#{attr_name}", args[0]
41
+ else
42
+ instance_variable_get "@#{attr_name}"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,50 @@
1
+ module OReflect
2
+ class Action
3
+
4
+ include Accessors
5
+
6
+ attr_reader :form_params, :query_params, :examples, :endpoint
7
+ dynamic_accessor :method, :name, :description, :identifier
8
+ boolean_accessor :is_authenticated
9
+ alias_method :desc, :description
10
+ alias_method :id, :identifier
11
+
12
+ def initialize(method, identifier = nil, endpoint = nil, &block)
13
+ @method = method
14
+ @identifier = identifier
15
+ @endpoint = endpoint
16
+ @query_params = []
17
+ @form_params = []
18
+ @examples = []
19
+ instance_eval(&block) if block_given?
20
+ end
21
+
22
+ def example(&block)
23
+ @examples << Example.new(&block)
24
+ end
25
+
26
+ def query(key, &block)
27
+ @query_params << Param.new(key, &block)
28
+ end
29
+
30
+ def body(key, &block)
31
+ @form_params << Param.new(key, &block)
32
+ end
33
+
34
+ def as_hash
35
+ h = {}
36
+ h[:name] = name
37
+ h[:identifier] = identifier
38
+ h[:method] = method
39
+ h[:is_authenticated] = is_authenticated?
40
+ h[:description] = description
41
+ h[:examples] = examples.map { |example| example.as_hash }
42
+ h[:query_params] = query_params.inject({}) { |hsh, param|
43
+ hsh.merge(param.key => param.as_hash) }
44
+ h[:form_params] = form_params.inject({}) { |hsh, param|
45
+ hsh.merge(param.key => param.as_hash) }
46
+ h
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ module OReflect
2
+ class Endpoint
3
+
4
+ include Accessors
5
+
6
+ attr_reader :actions, :arguments
7
+ dynamic_accessor :name, :description, :template
8
+ alias_method :desc, :description
9
+
10
+ def initialize(template, is_collection = false, &block)
11
+ @template = template
12
+ @is_collection = is_collection
13
+ @actions = []
14
+ @arguments = []
15
+ instance_eval(&block) if block_given?
16
+ end
17
+
18
+ def is_collection?
19
+ @is_collection ? true : false
20
+ end
21
+
22
+ def arg(key, &block)
23
+ @arguments << Param.new(key, &block)
24
+ end
25
+
26
+ def action(method, id = nil, &block)
27
+ @actions << Action.new(method, id, self, &block)
28
+ end
29
+
30
+ def as_hash
31
+ h = {}
32
+ h[:name] = name
33
+ h[:description] = description
34
+ h[:template] = template
35
+ h[:is_collection] = is_collection?
36
+ h[:arguments] = arguments.inject({}) do |hsh, arg|
37
+ hsh.merge(arg.key => arg.as_hash(:is_required))
38
+ end
39
+ h[:actions] = actions.map { |action| action.as_hash }
40
+ h
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,50 @@
1
+ module OReflect
2
+ class Error
3
+
4
+ include Accessors
5
+
6
+ DEFAULT_ERRORS = lambda do
7
+ error 500 do
8
+ title 'Application Error'
9
+ desc 'An error occurred on the server'
10
+ end
11
+
12
+ error 503 do
13
+ title 'Down For Maintenance'
14
+ desc 'The service is temporarily unavailable due to maintenance'
15
+ end
16
+
17
+ error 404 do
18
+ title 'Resource Not Found'
19
+ desc 'The resource you identified does not exist on the server'
20
+ end
21
+
22
+ error 403 do
23
+ title 'Authorization Required'
24
+ desc 'You need to authenticate to access the resource'
25
+ end
26
+
27
+ error 400 do
28
+ title 'Invalid Request'
29
+ desc 'One or more params were malformed and the server has rejected the request'
30
+ end
31
+ end
32
+
33
+ dynamic_accessor :code, :desc, :title
34
+ alias_method :description, :desc
35
+
36
+ def initialize(code, &block)
37
+ @code = code
38
+ instance_eval(&block) if block_given?
39
+ end
40
+
41
+ def as_hash
42
+ h = {}
43
+ h[:code] = code
44
+ h[:description] = description
45
+ h[:title] = title
46
+ h
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,30 @@
1
+ module OReflect
2
+ class Example
3
+
4
+ include Accessors
5
+
6
+ attr_reader :form_values
7
+ dynamic_accessor :path, :description, :title, :response
8
+ alias_method :desc, :description
9
+
10
+ def initialize(&block)
11
+ @form_values = {}
12
+ instance_eval(&block) if block_given?
13
+ end
14
+
15
+ def body(key, value)
16
+ @form_values[key] = value
17
+ end
18
+
19
+ def as_hash
20
+ h = {}
21
+ h[:title] = title
22
+ h[:path] = path
23
+ h[:description] = description
24
+ h[:response] = response
25
+ h[:form_values] = form_values
26
+ h
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module OReflect
2
+ class Param
3
+
4
+ include Accessors
5
+
6
+ dynamic_accessor :key, :description
7
+ boolean_accessor :is_required, :is_multiparam
8
+ splat_accessor :excluded_params, :required_params, :accepted_values, :examples
9
+ alias_method :desc, :description
10
+
11
+ def initialize(key, &block)
12
+ @key = key
13
+ instance_eval(&block) if block_given?
14
+ end
15
+
16
+ def as_hash(*exclusions)
17
+ h = {}
18
+ h[:is_required] = is_required?
19
+ h[:is_multiparam] = is_multiparam?
20
+ h[:key] = key
21
+ h[:description] = description
22
+ h[:examples] = examples
23
+ h[:accepted_values] = accepted_values
24
+ h[:required_params] = required_params
25
+ h[:excluded_params] = excluded_params
26
+ exclusions.each { |key| h.delete(key) }
27
+ h
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,63 @@
1
+ module OReflect
2
+ class Service
3
+
4
+ include Accessors
5
+
6
+ DEFAULT_VERSION = 1
7
+
8
+ attr_reader :errors, :endpoints
9
+ dynamic_accessor :base_uri, :name, :description
10
+ alias_method :desc, :description
11
+
12
+ def initialize(&block)
13
+ @version = DEFAULT_VERSION
14
+ @endpoints = []
15
+ @errors = {}
16
+ instance_eval(&Error::DEFAULT_ERRORS)
17
+ instance_eval(&block) if block_given?
18
+ end
19
+
20
+ def actions
21
+ endpoints.map { |endpoint| endpoint.actions }.flatten
22
+ end
23
+
24
+ def action_by_id(action_id)
25
+ actions.detect { |a| a.id.to_s == action_id.to_s }
26
+ end
27
+
28
+ def action_by_dashed_id(dashed_action_id)
29
+ action_by_id dashed_action_id.gsub('-', '_')
30
+ end
31
+
32
+ def version(value = nil)
33
+ return @version unless value
34
+ raise ArgumentError, 'value must be an integer' unless value.is_a?(Fixnum)
35
+ @version = value
36
+ end
37
+
38
+ def resource(template, &block)
39
+ @endpoints << Endpoint.new(template, &block)
40
+ end
41
+
42
+ def resources(template, &block)
43
+ @endpoints << Endpoint.new(template, true, &block)
44
+ end
45
+
46
+ def error(code, &block)
47
+ @errors[code] = Error.new(code, &block)
48
+ end
49
+
50
+ def as_hash
51
+ h = {}
52
+ h[:version] = version
53
+ h[:name] = name
54
+ h[:description] = description
55
+ h[:base_uri] = base_uri
56
+ h[:errors] = errors.values.inject({}) { |hsh, err|
57
+ hsh.merge(err.code => err.as_hash) }
58
+ h[:endpoints] = endpoints.map { |endpoint| endpoint.as_hash }
59
+ h
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,75 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{oreflect}
8
+ s.version = "0.7.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Carsten Nielsen"]
12
+ s.date = %q{2010-05-26}
13
+ s.description = %q{A library for building reflection endpoints to REST services and consuming them.}
14
+ s.email = %q{heycarsten@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "examples/basic.rb",
25
+ "examples/rest_blog.rb",
26
+ "lib/oreflect.rb",
27
+ "lib/oreflect/accessors.rb",
28
+ "lib/oreflect/action.rb",
29
+ "lib/oreflect/endpoint.rb",
30
+ "lib/oreflect/error.rb",
31
+ "lib/oreflect/example.rb",
32
+ "lib/oreflect/param.rb",
33
+ "lib/oreflect/service.rb",
34
+ "oreflect.gemspec",
35
+ "test/helper.rb",
36
+ "test/test_action.rb",
37
+ "test/test_endpoint.rb",
38
+ "test/test_error.rb",
39
+ "test/test_example.rb",
40
+ "test/test_oreflect.rb",
41
+ "test/test_param.rb",
42
+ "test/test_service.rb"
43
+ ]
44
+ s.homepage = %q{http://oreflect.org}
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_paths = ["lib"]
47
+ s.rubygems_version = %q{1.3.6}
48
+ s.summary = %q{A library for building reflection endpoints to REST services and consuming them.}
49
+ s.test_files = [
50
+ "test/helper.rb",
51
+ "test/test_action.rb",
52
+ "test/test_endpoint.rb",
53
+ "test/test_error.rb",
54
+ "test/test_example.rb",
55
+ "test/test_oreflect.rb",
56
+ "test/test_param.rb",
57
+ "test/test_service.rb",
58
+ "examples/basic.rb",
59
+ "examples/rest_blog.rb"
60
+ ]
61
+
62
+ if s.respond_to? :specification_version then
63
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
64
+ s.specification_version = 3
65
+
66
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
67
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
68
+ else
69
+ s.add_dependency(%q<shoulda>, [">= 0"])
70
+ end
71
+ else
72
+ s.add_dependency(%q<shoulda>, [">= 0"])
73
+ end
74
+ end
75
+
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $:.unshift(File.dirname(__FILE__))
7
+
8
+ require 'oreflect'
9
+
10
+ class Test::Unit::TestCase
11
+
12
+ end
@@ -0,0 +1,66 @@
1
+ require 'helper'
2
+
3
+ class TestAction < Test::Unit::TestCase
4
+
5
+ context 'An instance of Action' do
6
+ setup do
7
+ @action = OReflect::Action.new(:get, :get_test) do
8
+ is_authenticated!
9
+ name 'Test'
10
+ desc 'test desc'
11
+
12
+ body :test_param do
13
+ is_multiparam!
14
+ desc 'test desc'
15
+ examples 'example1', 'example2'
16
+ accepted_values 'test1'
17
+ required_params 'testfest'
18
+ excluded_params 'testnest'
19
+ end
20
+
21
+ query :q do
22
+ is_required!
23
+ desc 'test'
24
+ examples 'test1', 'test2'
25
+ end
26
+
27
+ example do
28
+ title 'test'
29
+ path '/test'
30
+ desc 'test desc'
31
+ response '{}'
32
+ body :key1, 'value1'
33
+ body :key2, 'value2'
34
+ end
35
+ end
36
+ end
37
+
38
+ should 'provide required accessors' do
39
+ assert_respond_to @action, :identifier
40
+ assert_respond_to @action, :form_params
41
+ assert_respond_to @action, :query_params
42
+ assert_respond_to @action, :description
43
+ assert_respond_to @action, :method
44
+ assert_respond_to @action, :examples
45
+ assert_respond_to @action, :name
46
+ assert_respond_to @action, :is_authenticated?
47
+ end
48
+
49
+ context '#as_hash' do
50
+ setup { @h = @action.as_hash }
51
+
52
+ should 'return a hash with correct keys and values' do
53
+ assert_equal true, @h[:is_authenticated]
54
+ assert_equal :get, @h[:method]
55
+ assert_equal :get_test, @h[:identifier]
56
+ assert_equal 'Test', @h[:name]
57
+ assert_equal 'test desc', @h[:description]
58
+ assert_instance_of Hash, @h[:form_params][:test_param]
59
+ assert_instance_of Hash, @h[:query_params][:q]
60
+ assert_instance_of Array, @h[:examples]
61
+ assert_equal '{}', @h[:examples][0][:response]
62
+ end
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,43 @@
1
+ require 'helper'
2
+
3
+ class TestEndpoint < Test::Unit::TestCase
4
+
5
+ context 'An instance of Endpoint' do
6
+ setup do
7
+ @endpoint = OReflect::Endpoint.new('/tests/:arg/items', true) do
8
+ name 'Test'
9
+ desc 'test desc'
10
+ arg :arg
11
+ action :get, :get_test
12
+ action :post
13
+ end
14
+ end
15
+
16
+ should 'provide reqired accessors' do
17
+ assert_respond_to @endpoint, :is_collection?
18
+ assert_respond_to @endpoint, :template
19
+ assert_respond_to @endpoint, :name
20
+ assert_respond_to @endpoint, :description
21
+ assert_respond_to @endpoint, :arguments
22
+ assert_respond_to @endpoint, :actions
23
+ end
24
+
25
+ context '#as_hash' do
26
+ setup { @h = @endpoint.as_hash }
27
+
28
+ should 'return a hash with correct keys and values' do
29
+ assert_equal true, @h[:is_collection]
30
+ assert_equal '/tests/:arg/items', @h[:template]
31
+ assert_equal 'Test', @h[:name]
32
+ assert_equal 'test desc', @h[:description]
33
+ assert_instance_of Hash, @h[:arguments]
34
+ assert_instance_of Array, @h[:actions]
35
+ end
36
+
37
+ should 'not have an is_required field in argument params' do
38
+ assert_nil @h[:arguments][:arg][:is_required]
39
+ end
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,30 @@
1
+ require 'helper'
2
+
3
+ class TestError < Test::Unit::TestCase
4
+
5
+ context 'An instance of Error' do
6
+ setup do
7
+ @error = OReflect::Error.new(500) do
8
+ title 'test'
9
+ desc 'test desc'
10
+ end
11
+ end
12
+
13
+ should 'provide required accessors' do
14
+ assert_respond_to @error, :code
15
+ assert_respond_to @error, :title
16
+ assert_respond_to @error, :description
17
+ end
18
+
19
+ context '#as_hash' do
20
+ setup { @h = @error.as_hash }
21
+
22
+ should 'return appropriate values' do
23
+ assert_equal 500, @h[:code]
24
+ assert_equal 'test', @h[:title]
25
+ assert_equal 'test desc', @h[:description]
26
+ end
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,39 @@
1
+ require 'helper'
2
+
3
+ class TestExample < Test::Unit::TestCase
4
+
5
+ context 'An instance of Example' do
6
+ setup do
7
+ @example = OReflect::Example.new do
8
+ title 'test'
9
+ path '/test'
10
+ desc 'test desc'
11
+ response '{}'
12
+ body :key1, 'value1'
13
+ body :key2, 'value2'
14
+ end
15
+ end
16
+
17
+ should 'provide required accessors' do
18
+ assert_respond_to @example, :title
19
+ assert_respond_to @example, :path
20
+ assert_respond_to @example, :description
21
+ assert_respond_to @example, :response
22
+ assert_respond_to @example, :form_values
23
+ end
24
+
25
+ context '#as_hash' do
26
+ setup { @h = @example.as_hash }
27
+
28
+ should 'return proper values' do
29
+ assert_equal 'test', @h[:title]
30
+ assert_equal '/test', @h[:path]
31
+ assert_equal 'test desc', @h[:description]
32
+ assert_equal '{}', @h[:response]
33
+ assert_equal 'value1', @h[:form_values][:key1]
34
+ assert_equal 'value2', @h[:form_values][:key2]
35
+ end
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class TestReflector < Test::Unit::TestCase
4
+
5
+ context 'OReflect' do
6
+ %w[examples/rest_blog.rb examples/basic.rb].each do |file|
7
+ context "#load_file('#{file}')" do
8
+ setup { @service = OReflect.load_file(file) }
9
+
10
+ should 'be a valid instance of Service' do
11
+ assert_instance_of OReflect::Service, @service
12
+ end
13
+
14
+ should 'be able to provide a Hash representation' do
15
+ assert_instance_of Hash, @service.as_hash
16
+ assert !@service.as_hash.empty?
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ class TestParam < Test::Unit::TestCase
4
+
5
+ context 'An instance of Param' do
6
+ setup do
7
+ @param = OReflect::Param.new(:test) do
8
+ is_multiparam!
9
+ is_required!
10
+ desc 'test desc'
11
+ examples 'example1', 'example2'
12
+ accepted_values 'test1'
13
+ required_params 'testfest'
14
+ excluded_params 'testnest'
15
+ end
16
+ end
17
+
18
+ should 'provide required accessors' do
19
+ assert_respond_to @param, :is_multiparam?
20
+ assert_respond_to @param, :is_required?
21
+ assert_respond_to @param, :key
22
+ assert_respond_to @param, :description
23
+ assert_respond_to @param, :examples
24
+ assert_respond_to @param, :accepted_values
25
+ assert_respond_to @param, :required_params
26
+ assert_respond_to @param, :excluded_params
27
+ end
28
+
29
+ context '#as_hash' do
30
+ setup { @h = @param.as_hash }
31
+
32
+ should 'return the correct values' do
33
+ assert_equal true, @h[:is_multiparam]
34
+ assert_equal true, @h[:is_required]
35
+ assert_equal :test, @h[:key]
36
+ assert_equal 'test desc', @h[:description]
37
+ assert_equal 2, @h[:examples].size
38
+ assert_equal 1, @h[:accepted_values].size
39
+ assert_equal 1, @h[:required_params].size
40
+ assert_equal 1, @h[:excluded_params].size
41
+ end
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,116 @@
1
+ require 'helper'
2
+
3
+ class TestService < Test::Unit::TestCase
4
+
5
+ context 'Service' do
6
+ should 'only accept integers as version' do
7
+ assert_raise(ArgumentError) { OReflect::Service.new.version(1.0) }
8
+ assert_raise(ArgumentError) { OReflect::Service.new.version('1') }
9
+ end
10
+
11
+ should 'have a default version' do
12
+ assert_equal 1, OReflect::Service.new.version
13
+ end
14
+
15
+ should 'have a number of default errors' do
16
+ assert !OReflect::Service.new.errors.empty?
17
+ end
18
+ end
19
+
20
+ context 'An instance of Service' do
21
+ setup do
22
+ @service = OReflect::Service.new do
23
+ version 3
24
+ name 'Test'
25
+ desc 'test desc'
26
+ base_uri 'http://example.com'
27
+ error 900 do
28
+ desc 'test error'
29
+ end
30
+ resource :test do
31
+ action :get, :test_action
32
+ end
33
+ resources :tests do
34
+ action :get
35
+ action :put
36
+ action :post
37
+ end
38
+ end
39
+ end
40
+
41
+ should 'provide required accessors' do
42
+ assert_respond_to @service, :version
43
+ assert_respond_to @service, :name
44
+ assert_respond_to @service, :description
45
+ assert_respond_to @service, :base_uri
46
+ assert_respond_to @service, :errors
47
+ assert_respond_to @service, :endpoints
48
+ end
49
+
50
+ context 'adding an error' do
51
+ setup { @service.error(500) { title 'Crash Bang Boom' } }
52
+
53
+ should 'replace the default error' do
54
+ assert_equal 'Crash Bang Boom', @service.errors[500].title
55
+ end
56
+ end
57
+
58
+ context '#action_by_id' do
59
+ should 'return the action when given a symbol' do
60
+ assert_equal :test_action, @service.action_by_id('test_action').id
61
+ end
62
+
63
+ should 'return the action when given a string' do
64
+ assert_equal :test_action, @service.action_by_id(:test_action).id
65
+ end
66
+ end
67
+
68
+ context '#action_by_dashed_id' do
69
+ setup { @action = @service.action_by_dashed_id('test-action') }
70
+
71
+ should 'return the proper action' do
72
+ assert_equal :test_action, @action.id
73
+ end
74
+ end
75
+
76
+ context '#actions' do
77
+ setup { @actions = @service.actions }
78
+
79
+ should 'return all actions in all endpoints' do
80
+ assert_equal 4, @actions.size
81
+ end
82
+ end
83
+
84
+ context '#version' do
85
+ should 'return the current version' do
86
+ assert_equal 3, @service.version
87
+ end
88
+ end
89
+
90
+ context '#endpoints' do
91
+ should 'return available endpoints' do
92
+ assert_equal 2, @service.endpoints.size
93
+ end
94
+ end
95
+
96
+ context '#errors' do
97
+ should 'return a list of errors' do
98
+ assert @service.errors.values.any?
99
+ end
100
+ end
101
+
102
+ context '#as_hash' do
103
+ setup { @h = @service.as_hash }
104
+
105
+ should 'return the correct values' do
106
+ assert_equal 3, @h[:version]
107
+ assert_equal 'Test', @h[:name]
108
+ assert_equal 'test desc', @h[:description]
109
+ assert_equal 'http://example.com', @h[:base_uri]
110
+ assert_instance_of Hash, @h[:errors]
111
+ assert_instance_of Array, @h[:endpoints]
112
+ end
113
+ end
114
+ end
115
+
116
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oreflect
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 7
8
+ - 0
9
+ version: 0.7.0
10
+ platform: ruby
11
+ authors:
12
+ - Carsten Nielsen
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-26 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: shoulda
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :development
31
+ version_requirements: *id001
32
+ description: A library for building reflection endpoints to REST services and consuming them.
33
+ email: heycarsten@gmail.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files:
39
+ - README.md
40
+ files:
41
+ - .document
42
+ - .gitignore
43
+ - README.md
44
+ - Rakefile
45
+ - VERSION
46
+ - examples/basic.rb
47
+ - examples/rest_blog.rb
48
+ - lib/oreflect.rb
49
+ - lib/oreflect/accessors.rb
50
+ - lib/oreflect/action.rb
51
+ - lib/oreflect/endpoint.rb
52
+ - lib/oreflect/error.rb
53
+ - lib/oreflect/example.rb
54
+ - lib/oreflect/param.rb
55
+ - lib/oreflect/service.rb
56
+ - oreflect.gemspec
57
+ - test/helper.rb
58
+ - test/test_action.rb
59
+ - test/test_endpoint.rb
60
+ - test/test_error.rb
61
+ - test/test_example.rb
62
+ - test/test_oreflect.rb
63
+ - test/test_param.rb
64
+ - test/test_service.rb
65
+ has_rdoc: true
66
+ homepage: http://oreflect.org
67
+ licenses: []
68
+
69
+ post_install_message:
70
+ rdoc_options:
71
+ - --charset=UTF-8
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project:
91
+ rubygems_version: 1.3.6
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: A library for building reflection endpoints to REST services and consuming them.
95
+ test_files:
96
+ - test/helper.rb
97
+ - test/test_action.rb
98
+ - test/test_endpoint.rb
99
+ - test/test_error.rb
100
+ - test/test_example.rb
101
+ - test/test_oreflect.rb
102
+ - test/test_param.rb
103
+ - test/test_service.rb
104
+ - examples/basic.rb
105
+ - examples/rest_blog.rb