modgen 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +7 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +121 -0
  5. data/Rakefile +7 -0
  6. data/lib/modgen/api/api_request.rb +35 -0
  7. data/lib/modgen/api/api_response.rb +9 -0
  8. data/lib/modgen/api/request.rb +72 -0
  9. data/lib/modgen/api/response.rb +41 -0
  10. data/lib/modgen/api.rb +59 -0
  11. data/lib/modgen/configuration.rb +47 -0
  12. data/lib/modgen/core_ext/hash.rb +41 -0
  13. data/lib/modgen/core_ext/object.rb +10 -0
  14. data/lib/modgen/core_ext/string.rb +9 -0
  15. data/lib/modgen/default_configuration.rb +29 -0
  16. data/lib/modgen/discovery/discovery.rb +71 -0
  17. data/lib/modgen/discovery/method.rb +137 -0
  18. data/lib/modgen/discovery/resource.rb +53 -0
  19. data/lib/modgen/errors.rb +21 -0
  20. data/lib/modgen/session/api_key.rb +42 -0
  21. data/lib/modgen/session/oauth2.rb +94 -0
  22. data/lib/modgen/session.rb +26 -0
  23. data/lib/modgen/version.rb +3 -0
  24. data/lib/modgen.rb +43 -0
  25. data/modgen.gemspec +29 -0
  26. data/spec/lib/01_authenticate_spec.rb +18 -0
  27. data/spec/lib/02_discovery_spec.rb +99 -0
  28. data/spec/lib/03_api_spec.rb +86 -0
  29. data/spec/spec_helper.rb +14 -0
  30. data/test_api/.gitignore +15 -0
  31. data/test_api/Gemfile +7 -0
  32. data/test_api/README.md +11 -0
  33. data/test_api/Rakefile +7 -0
  34. data/test_api/app/api/api.rb +30 -0
  35. data/test_api/app/api/dataset.rb +67 -0
  36. data/test_api/app/api/files/version_v1.json +98 -0
  37. data/test_api/app/api/files/versions.json +20 -0
  38. data/test_api/app/api/profile.rb +47 -0
  39. data/test_api/app/assets/images/rails.png +0 -0
  40. data/test_api/app/assets/javascripts/application.js +15 -0
  41. data/test_api/app/assets/stylesheets/application.css +13 -0
  42. data/test_api/app/controllers/application_controller.rb +3 -0
  43. data/test_api/app/helpers/application_helper.rb +2 -0
  44. data/test_api/app/mailers/.gitkeep +0 -0
  45. data/test_api/app/models/.gitkeep +0 -0
  46. data/test_api/app/models/user.rb +3 -0
  47. data/test_api/app/views/layouts/application.html.erb +14 -0
  48. data/test_api/config/application.rb +65 -0
  49. data/test_api/config/boot.rb +6 -0
  50. data/test_api/config/database.yml +25 -0
  51. data/test_api/config/environment.rb +5 -0
  52. data/test_api/config/environments/development.rb +37 -0
  53. data/test_api/config/environments/production.rb +67 -0
  54. data/test_api/config/environments/test.rb +37 -0
  55. data/test_api/config/initializers/backtrace_silencers.rb +7 -0
  56. data/test_api/config/initializers/inflections.rb +15 -0
  57. data/test_api/config/initializers/mime_types.rb +5 -0
  58. data/test_api/config/initializers/reload_api.rb +9 -0
  59. data/test_api/config/initializers/secret_token.rb +7 -0
  60. data/test_api/config/initializers/session_store.rb +8 -0
  61. data/test_api/config/initializers/wrap_parameters.rb +14 -0
  62. data/test_api/config/locales/en.yml +5 -0
  63. data/test_api/config/routes.rb +5 -0
  64. data/test_api/config.ru +4 -0
  65. data/test_api/db/migrate/20130510113923_create_users.rb +13 -0
  66. data/test_api/db/schema.rb +25 -0
  67. data/test_api/db/seeds.rb +7 -0
  68. data/test_api/lib/assets/.gitkeep +0 -0
  69. data/test_api/lib/tasks/.gitkeep +0 -0
  70. data/test_api/lib/tasks/test_data.rake +11 -0
  71. data/test_api/log/.gitkeep +0 -0
  72. data/test_api/model.rb +7 -0
  73. data/test_api/public/404.html +26 -0
  74. data/test_api/public/422.html +26 -0
  75. data/test_api/public/500.html +25 -0
  76. data/test_api/public/favicon.ico +0 -0
  77. data/test_api/public/index.html +241 -0
  78. data/test_api/public/robots.txt +5 -0
  79. data/test_api/script/rails +6 -0
  80. data/test_api/test/fixtures/users.yml +15 -0
  81. data/test_api/test/unit/user_test.rb +7 -0
  82. metadata +228 -0
@@ -0,0 +1,137 @@
1
+ module Modgen
2
+ module API
3
+ class Method
4
+
5
+ attr_reader :name, :path, :url, :http_method, :description, :method_parameters
6
+
7
+ def initialize(name, values)
8
+ @name = name
9
+ @values = values
10
+
11
+ @path = values['path']
12
+ @url = URI.join(Modgen.config.api.base_url, "#{Modgen::API.api.version}/", @path)
13
+ @http_method = values['http_method']
14
+ @description = values['description']
15
+ @method_parameters = values['parameters']
16
+ end
17
+
18
+ def call(params)
19
+ # if params == nil
20
+ # return self
21
+ # end
22
+
23
+ query(params)
24
+ end
25
+
26
+ # Check if value has property type(s)
27
+ #
28
+ def check_type(param, value, *types)
29
+ types.each do |type|
30
+ return(true) if value.is_a?(type)
31
+ end
32
+
33
+ raise Modgen::APIRequestError, "Parameter #{param} has invalid type. Must be #{types.join(' or ')}."
34
+ end
35
+
36
+ # Check one parameter
37
+ #
38
+ def validate_parameter(param, spec, value)
39
+ if value.nil?
40
+ if spec['required']
41
+ raise Modgen::APIRequestError, "Parameter #{param} is required."
42
+ end
43
+
44
+ return 'next'
45
+ end
46
+
47
+ case spec['type']
48
+ when 'integer'; check_type(param, value, Integer)
49
+ when 'float'; check_type(param, value, Integer, Float)
50
+ when 'string'; check_type(param, value, String)
51
+ when 'hash'
52
+ check_type(param, value, Hash)
53
+ validate_parameters(spec['attributes'], value)
54
+ when 'file'
55
+ if !File.file?(value)
56
+ raise Modgen::APIRequestError, "File #{value} doesn't exists."
57
+ end
58
+ end
59
+
60
+ if spec['format']
61
+ unless value =~ /#{spec['format']}/
62
+ raise Modgen::APIRequestError, "Parameter #{param} hasn't required format (#{spec['format']})."
63
+ end
64
+ end
65
+ end
66
+
67
+ # Check all parameters
68
+ #
69
+ def validate_parameters(attributes, params = {})
70
+ if !attributes
71
+ return nil
72
+ end
73
+
74
+ params.stringify_keys!
75
+
76
+ parameters_left = params.keys - attributes.keys
77
+ if !parameters_left.empty?
78
+ raise Modgen::APIRequestError, "Parameters: #{parameters_left} are unknow."
79
+ end
80
+
81
+ attributes.each do |param, spec|
82
+ value = params[param]
83
+
84
+ if validate_parameter(param, spec, value) == 'next'
85
+ next
86
+ end
87
+ end
88
+ end
89
+
90
+ def build_file(path)
91
+ mime = MimeMagic.by_path(path)
92
+ Faraday::UploadIO.new(path, mime)
93
+ end
94
+
95
+ # Buld request data based on discoverd API
96
+ #
97
+ def build_request_data(params = {})
98
+ result = {
99
+ 'path' => {},
100
+ 'params' => {},
101
+ 'body' => {}
102
+ }
103
+
104
+ params.each do |key, value|
105
+ case @method_parameters[key]['location']
106
+ when 'path'; result['path'][key] = value
107
+ when 'body'; result['body'][key] = value
108
+ else
109
+ if @method_parameters[key]['type'] == 'file'
110
+ result['params'][key] = build_file(value)
111
+ else
112
+ result['params'][key] = value
113
+ end
114
+ end
115
+ end
116
+
117
+ result
118
+ end
119
+
120
+ # Create request and call response on it.
121
+ #
122
+ def query(params)
123
+ request_data = {}
124
+
125
+ if !params.is_a?(Hash)
126
+ raise Modgen::TypeError, "Parameters must be Hash. #{params.class.name} inserted."
127
+ end
128
+
129
+ validate_parameters(@method_parameters, params)
130
+ request_data = build_request_data(params)
131
+
132
+ Modgen::API::APIRequest.new(self, request_data).response
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,53 @@
1
+ module Modgen
2
+ module API
3
+ class Resource
4
+
5
+ attr_reader :name
6
+
7
+ def initialize(name, values)
8
+ @name = name
9
+ @values = values
10
+ @methods = []
11
+
12
+ build_resources
13
+ end
14
+
15
+ def methods
16
+ @methods
17
+ end
18
+
19
+ private
20
+
21
+ def build_resources
22
+ @values.each do |key, value|
23
+ if key == 'methods'
24
+ build_methods(value)
25
+ else
26
+ build_resource(key, value)
27
+ end
28
+ end
29
+ end
30
+
31
+ def build_resource(name, values)
32
+ resource = Modgen::API::Resource.new(name, values)
33
+
34
+ @methods << name.to_sym
35
+
36
+ metaclass = class << self; self; end
37
+ metaclass.send(:define_method, name) { resource }
38
+ end
39
+
40
+ def build_methods(value)
41
+ value.each do |key, value|
42
+ method = Modgen::API::Method.new(key, value)
43
+
44
+ @methods << key.to_sym
45
+
46
+ metaclass = class << self; self; end
47
+ metaclass.send(:define_method, key) { |params={}| method.send(:call, params) }
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,21 @@
1
+ module Modgen
2
+
3
+ # Errors in API
4
+ #
5
+ # e.g. API was not discovered
6
+ class APIError < StandardError
7
+ end
8
+
9
+ # Error during request such as missing parameters
10
+ class APIRequestError < StandardError
11
+ end
12
+
13
+ # Type error
14
+ class TypeError < StandardError
15
+ end
16
+
17
+ # Configuration error
18
+ class ConfigurationError < StandardError
19
+ end
20
+
21
+ end
@@ -0,0 +1,42 @@
1
+ module Modgen
2
+ module Session
3
+ class APIKey
4
+
5
+ def self.config
6
+ Modgen.config
7
+ end
8
+
9
+ def self.start
10
+ if config.api_key.key == nil
11
+ raise Modgen::ConfigurationError, "API key cannot be nil."
12
+ end
13
+
14
+ client = Modgen::Session::APIKey.new
15
+
16
+ Modgen::Session.store(client)
17
+ end
18
+
19
+ def initialize
20
+ @key = Modgen.config.api_key.key
21
+ end
22
+
23
+ def execute(request)
24
+ conn = Faraday.new(url: request.url)
25
+
26
+ if request.data['body'] && request.data['body'].empty?
27
+ response = conn.send(request.http_method, "", request.data['params']) { |req|
28
+ req.headers['Api-Key'] = @key
29
+ }
30
+ else
31
+ response = conn.send(@http_method, "") { |req|
32
+ req.headers['Api-Key'] = @key
33
+ req.body = request.data['body']
34
+ }
35
+ end
36
+
37
+ response
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,94 @@
1
+ require 'oauth2'
2
+
3
+ module Modgen
4
+ module Session
5
+ class Oauth2
6
+
7
+ def self.config
8
+ Modgen.config
9
+ end
10
+
11
+ # Start session
12
+ #
13
+ #
14
+ def self.start
15
+ client = Modgen::Session::Oauth2.new
16
+
17
+ Modgen::Session.store(client)
18
+
19
+ if config.oauth2.redirect_uri == nil
20
+ get_authorize_code
21
+ else
22
+ client.authorize_url
23
+ end
24
+ end
25
+
26
+ def self.authorize(auth_code)
27
+ Modgen::Session.get.authorize(auth_code)
28
+ end
29
+
30
+ # Automaticaly open autorization url a waiting for callback.
31
+ # Launchy gem is required
32
+ #
33
+ # Steps:
34
+ # 1) create server
35
+ # 2) launch browser and redirect to google api
36
+ # 3) confirm and modgen redirect to localhost
37
+ # 4) server get code and start session
38
+ # 5) close server - you are login
39
+ def self.get_authorize_code
40
+ require "socket" # tcp server
41
+
42
+ uri = URI(Modgen::OAUTH2_REDIRECT_URI)
43
+
44
+ webserver = TCPServer.new(uri.host, 0) # start webserver
45
+ # port=0 - automatically choose free port
46
+
47
+ uri.port = webserver.addr[1] # get choosen port
48
+
49
+ Launchy.open(Modgen::Session.get.authorize_url)
50
+
51
+ session = webserver.accept
52
+
53
+ # parse header for query.
54
+ request = session.gets.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '')
55
+ request = Hash[URI.decode_www_form(URI(request).query)]
56
+
57
+ # failure login
58
+ to_return = false
59
+ message = "You have not been logged. Please try again."
60
+
61
+ if Modgen::Session.get.authorize(request['code'])
62
+ message = "You have been successfully logged. Now you can close the browser."
63
+ to_return = true
64
+ end
65
+
66
+ session.write(message)
67
+ session.close
68
+
69
+ return to_return
70
+ end
71
+
72
+
73
+
74
+ attr_reader :authorize_url
75
+
76
+ def initialize
77
+ @client = OAuth2::Client.new(client_id, client_secret, site: Modgen::SITE_URL)
78
+
79
+ @authorize_url = client.auth_code.authorize_url(redirect_uri: redirect_uri)
80
+ end
81
+
82
+ def authorize(auth_code)
83
+ @auth_code = auth_code
84
+
85
+ @token = @client.auth_code.get_token(auth_code)
86
+ end
87
+
88
+ def execute(request)
89
+
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,26 @@
1
+ module Modgen
2
+ module Session
3
+
4
+ autoload :Oauth2, 'modgen/session/oauth2'
5
+ autoload :APIKey, 'modgen/session/api_key'
6
+
7
+ @@session = nil
8
+
9
+ def self.oauth2
10
+ Modgen::Session::Oauth2
11
+ end
12
+
13
+ def self.api_key
14
+ Modgen::Session::APIKey
15
+ end
16
+
17
+ def self.store(client)
18
+ @@session = client
19
+ end
20
+
21
+ def self.get
22
+ @@session
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module Modgen
2
+ VERSION = "0.0.1"
3
+ end
data/lib/modgen.rb ADDED
@@ -0,0 +1,43 @@
1
+ require "modgen/core_ext/hash"
2
+ require "modgen/core_ext/object"
3
+ require "modgen/core_ext/string"
4
+
5
+ require "modgen/version"
6
+ require "modgen/configuration"
7
+ require "modgen/default_configuration"
8
+ require "modgen/errors"
9
+
10
+ require "faraday"
11
+ require "multi_json"
12
+ require "mimemagic"
13
+
14
+ module Modgen
15
+
16
+ autoload :Discovery, 'modgen/discovery/discovery'
17
+ autoload :API, 'modgen/api'
18
+ autoload :Session, 'modgen/session'
19
+
20
+ # Line set and get configuration
21
+ #
22
+ # *Set:* Modgen.config.key = "value"
23
+ #
24
+ # *Get:* Modgen.config.key
25
+ #
26
+ # == Returns:
27
+ # Top of Modgen::Configuration
28
+ #
29
+ def self.config
30
+ @config ||= Modgen::Configuration.new(DEFAULT_CONFIGURATION)
31
+ end
32
+
33
+ # Cofiguration with DSL
34
+ #
35
+ # Modgen.configure do
36
+ # key "value"
37
+ # end
38
+ #
39
+ def self.configure(&block)
40
+ config.instance_eval(&block)
41
+ end
42
+
43
+ end
data/modgen.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'modgen/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "modgen"
9
+ spec.version = Modgen::VERSION
10
+ spec.authors = ["Ondřej Moravčík"]
11
+ spec.email = ["moravcik.ondrej@gmail.com"]
12
+ spec.description = %q{Modgen allow discover and use modgen's API}
13
+ spec.summary = %q{Gem for using modgen's API}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "faraday"
23
+ spec.add_dependency "multi_json"
24
+ spec.add_dependency "mimemagic"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rspec"
29
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Modgen::Session do
4
+ it "should not be logged" do
5
+ Modgen::Session.get.should eql(nil)
6
+ end
7
+
8
+ it "key cannot be nil" do
9
+ lambda { Modgen::Session.api_key.start }.should raise_error(Modgen::ConfigurationError)
10
+ end
11
+
12
+ it "should use Api Key" do
13
+ Modgen.config.api_key.key = 'f0ddaaef2903e6f2ac634e7f6037c9b2'
14
+ Modgen::Session.api_key.start
15
+
16
+ lambda { Modgen::Session.api_key.start }.should_not raise_error(Modgen::ConfigurationError)
17
+ end
18
+ end
@@ -0,0 +1,99 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Modgen::Discovery do
6
+ before(:all) {
7
+ Modgen.configure do
8
+ api do
9
+ base_url "#{API_URL}/api/"
10
+ end
11
+ end
12
+ }
13
+
14
+ let(:config) { Modgen.config }
15
+ let(:api) { Modgen::API.api }
16
+ let(:discovery) { Modgen::Discovery }
17
+
18
+ context "configure" do
19
+ it "api_base_url should be localhost" do
20
+ config.api.base_url.should eql("#{API_URL}/api/")
21
+ end
22
+
23
+ it "api_discovery_versions_url shoud be base_url + versions" do
24
+ config.api.discovery_versions_url.to_s.should eql("#{API_URL}/api/discovery/versions")
25
+ end
26
+
27
+ it "api_discovery_version_url shoud be base_url + version/:id" do
28
+ config.api.discovery_version_url.to_s.should eql("#{API_URL}/api/discovery/version/:id")
29
+ end
30
+ end
31
+
32
+ context "API detils" do
33
+ it "should show preffered version" do
34
+ discovery.preffered_version.should eql('v1')
35
+ end
36
+
37
+ it "should show 2 version" do
38
+ versions = discovery.versions
39
+
40
+ versions.status.should eql(200)
41
+
42
+ versions.body['versions'].size.should eql(2)
43
+ end
44
+
45
+ it "non exist version" do
46
+ lambda { discovery.version('v3') }.should raise_error(Modgen::APIError)
47
+ end
48
+
49
+ it "version should take preffered version" do
50
+ discovery.version.body['version'].should eql('v1')
51
+ end
52
+
53
+ it "verion should have some values" do
54
+ result = discovery.version('v1').body
55
+
56
+ result['name'].should eql('Modgen API')
57
+ result['version'].should eql('v1')
58
+ result['created_at'].should eql('16022013')
59
+ result['updated_at'].should eql('16022013')
60
+ result['base_url'].should eql('https://modgen.net/api')
61
+ end
62
+ end
63
+
64
+ context "before discover" do
65
+ it "shoud raise Modgen::APIError" do
66
+ lambda { api }.should raise_error(Modgen::APIError)
67
+ end
68
+
69
+ it "should false" do
70
+ Modgen::API.discovered?.should eql(false)
71
+ end
72
+ end
73
+
74
+ context "discover" do
75
+ before(:all) {
76
+ Modgen::Discovery.discover('v1')
77
+ }
78
+
79
+ it "details about API" do
80
+ api.name.should eql('Modgen API')
81
+ api.description.should eql('Predikační platforma')
82
+ api.version.should eql('v1')
83
+ api.created_at.should eql('16022013')
84
+ api.updated_at.should eql('16022013')
85
+ api.base_url.should eql('https://modgen.net/api')
86
+ end
87
+
88
+ it "should true" do
89
+ Modgen::API.discovered?.should eql(true)
90
+ end
91
+
92
+ it "some methods should exist" do
93
+ Modgen::API.methods.should eql([:profile, :dataset])
94
+ Modgen::API.profile.methods.should eql([:get, :update])
95
+ Modgen::API.dataset.methods.should eql([:list, :get])
96
+ end
97
+ end
98
+
99
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ describe Modgen::API do
4
+ before(:all) do
5
+ Modgen.config.api_key.key = 'f0ddaaef2903e6f2ac634e7f6037c9b2'
6
+ Modgen::Session.api_key.start
7
+
8
+ @user = Modgen::API.profile.get.body
9
+ end
10
+
11
+ let(:profile) { Modgen::API.profile }
12
+ let(:dataset) { Modgen::API.dataset }
13
+
14
+ context "profile" do
15
+ it "get" do
16
+ result = profile.get
17
+
18
+ result.status.should eql(200)
19
+
20
+ result.body["id"].should eql(@user["id"])
21
+ result.body["first_name"].should eql(@user["first_name"])
22
+ result.body["last_name"].should eql(@user["last_name"])
23
+ result.body["email"].should eql(@user["email"])
24
+ result.body["created_at"].should eql(@user["created_at"])
25
+ result.body["updated_at"].should eql(@user["updated_at"])
26
+ result.body["last_access"].should eql(@user["last_access"])
27
+ end
28
+
29
+ context "update" do
30
+ it "should update" do
31
+ result = profile.update(user: { first_name: "a",
32
+ last_name: "a",
33
+ email: "a@a.aa" })
34
+
35
+ result.status.should eql(200)
36
+
37
+ result.body["id"].should eql(@user["id"])
38
+ result.body["first_name"].should eql("a")
39
+ result.body["last_name"].should eql("a")
40
+ result.body["email"].should eql("a@a.aa")
41
+ end
42
+
43
+ it "missing value" do
44
+ lambda { profile.update(first_name: "a") }.should raise_error(Modgen::APIRequestError)
45
+ end
46
+
47
+ it "wrong format" do
48
+ lambda { profile.update(user: {first_name: "."}) }.should raise_error(Modgen::APIRequestError)
49
+ end
50
+ end
51
+ end
52
+
53
+ context "dataset" do
54
+ it "list" do
55
+ result = dataset.list
56
+
57
+ result.status.should eql(200)
58
+
59
+ result.body['datasets'].size.should eql(3)
60
+ end
61
+
62
+ context "get" do
63
+ it "should get" do
64
+ result = dataset.get(id: 1)
65
+
66
+ result.status.should eql(200)
67
+
68
+ result.body['id'].should eql(1)
69
+ end
70
+
71
+ it "missing value" do
72
+ lambda { dataset.get }.should raise_error(Modgen::APIRequestError)
73
+ end
74
+
75
+ it "non exist id" do
76
+ result = dataset.get(id: 6)
77
+
78
+ result.status.should eql(404)
79
+ end
80
+
81
+ it "unknow parameteres" do
82
+ lambda { dataset.get(a: "a") }.should raise_error(Modgen::APIRequestError)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,14 @@
1
+ $:.unshift File.dirname(__FILE__) + '/../lib'
2
+ require "modgen"
3
+
4
+ API_URL = 'http://localhost:3000'
5
+
6
+ API_KEY = 'f0ddaaef2903e6f2ac634e7f6037c9b2'
7
+
8
+ RSpec.configure do |config|
9
+ config.treat_symbols_as_metadata_keys_with_true_values = true
10
+ config.run_all_when_everything_filtered = true
11
+ # config.filter_run :focus
12
+ config.color_enabled = true
13
+ config.formatter = 'documentation'
14
+ end
@@ -0,0 +1,15 @@
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile ~/.gitignore_global
6
+
7
+ # Ignore bundler config
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+
13
+ # Ignore all logfiles and tempfiles.
14
+ /log/*.log
15
+ /tmp
data/test_api/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '3.2.13'
4
+
5
+ gem 'sqlite3'
6
+ gem 'grape'
7
+ gem 'multi_json'