resta 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f0effda84f46ab1d5add8af1cfa6ae8da98fb7fe
4
+ data.tar.gz: 842e996cdaa19a4936b24cf91529527811d68978
5
+ SHA512:
6
+ metadata.gz: 0fc5521456a57f1e1b326f2995b903c820845dd905fd8eb75087be70401f66b2e7a600a97dd93bdf34f1b6f29727aa02dbe3694449c0ea6f2223c74e20e3cf5a
7
+ data.tar.gz: a1ddce2f5f1b17a800fea38e0c16011b9fa922de84fe502b988178ab1b154687de41321bf57c956297afcfb84767f50ba09abd02482a7a368cb88072269ab069
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ db.sqlite3
data/.travis.yml ADDED
@@ -0,0 +1,23 @@
1
+ ---
2
+ language: ruby
3
+
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1
8
+ - 2.2
9
+ - 2.3.0
10
+ - rbx-2
11
+ - jruby
12
+ - jruby-head
13
+ - ruby-head
14
+
15
+ sudo: false
16
+ before_install: gem install bundler -v 1.11.2
17
+ matrix:
18
+ allow_failures:
19
+ - rvm: ruby-head
20
+ - rvm: jruby-head
21
+ fast_finish: true
22
+ branches:
23
+ only: master
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org' unless ENV['QUICK']
2
+ gemspec
3
+
4
+ gem 'sinatra', '~> 1.4', '>= 1.4.6'
5
+ gem 'sinatra-contrib', '~> 1.4', '>= 1.4.6'
6
+
7
+ gem 'sequel', '~> 4.29'
8
+ gem 'activesupport', '~> 4.2', '>= 4.2.5'
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Vincent Ting
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,16 @@
1
+ ## Resta
2
+
3
+ [![Build Status](https://secure.travis-ci.org/waiiio/resta.svg?branch=master)][travis]
4
+ [![Coverage Status](https://coveralls.io/repos/waiiio/resta/badge.svg)][coverage]
5
+
6
+ [travis]: https://travis-ci.org/waiiio/resta
7
+ [coverage]: https://coveralls.io/r/waiiio/resta
8
+
9
+ ---
10
+
11
+ > Resta is a [sinatra](http://www.sinatrarb.com/) based web server that turns your [sequel](http://sequel.jeremyevans.net/documentation.html) model directly into a RESTful API.
12
+
13
+ ## License
14
+
15
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
16
+
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ end
7
+
8
+ task default: :test
9
+
10
+ begin
11
+ require 'cane/rake_task'
12
+
13
+ desc 'Run cane to check quality metrics'
14
+ Cane::RakeTask.new(:quality) do |cane|
15
+ cane.abc_max = 15
16
+ cane.add_threshold 'coverage/.last_run.json', :>=, 95
17
+ cane.style_measure = 82
18
+ cane.style_glob = 'lib/**/*.rb'
19
+ end
20
+
21
+ task default: :quality
22
+ rescue LoadError
23
+ warn 'cane not available, quality task not provided.'
24
+ end
data/lib/resta.rb ADDED
@@ -0,0 +1 @@
1
+ require 'resta/resource'
@@ -0,0 +1,157 @@
1
+ require 'sequel'
2
+ require 'securerandom'
3
+
4
+ module Resta
5
+
6
+ # Mixins for subclass for `Sequel::Model`.
7
+ module Model
8
+
9
+ # Current class isn't inherited from Sequel::Model.
10
+ class UnsupportedClassError < TypeError
11
+ end
12
+
13
+ # Some necessary field missing for current database.
14
+ # e.g.`_$version` field used for caching
15
+ class NecessaryFieldMissingError < StandardError
16
+ end
17
+
18
+ # Class methods for model after been included.
19
+ module ClassMethods
20
+ attr_reader :use_increased_id, :timestamps_opts
21
+
22
+ def enable_increased_id
23
+ @use_increased_id = true
24
+ end
25
+
26
+ def use_timestamps(fields_opts=nil)
27
+ fields_opts ||= { update_on_create: true }
28
+ self.plugin :timestamps, fields_opts
29
+ end
30
+ end
31
+
32
+ # Instance methods for model after been included.
33
+ module InstanceMethods
34
+ def before_create
35
+ return false if super == false
36
+ update_version
37
+ # generate a v4 random UUID for resource id unless use auto increase.
38
+ self.id ||= SecureRandom.uuid unless self.class.use_increased_id
39
+ end
40
+
41
+ def before_update
42
+ return false if super == false
43
+ update_version
44
+ end
45
+
46
+ private
47
+ def update_version
48
+ self[:'_$version'] = SecureRandom.hex(8)
49
+ end
50
+ end
51
+
52
+ COMMON_DATABASE_FIELDS = {:'_$version' => :string}.freeze
53
+
54
+ def self.included(receiver)
55
+ raise UnsupportedClassError.new(
56
+ "#{receiver.class.name} is not a subclass of Sequel::Model"
57
+ ) unless receiver < Sequel::Model
58
+ necessary_fields_checker receiver
59
+ receiver.extend ClassMethods
60
+ receiver.send :include, InstanceMethods
61
+ end
62
+
63
+ def self.necessary_fields_checker(receiver)
64
+ COMMON_DATABASE_FIELDS.each_pair do |field, type|
65
+ raise NecessaryFieldMissingError.new(
66
+ "Missing field `#{field}`##{type} in #{receiver.table_name}"
67
+ ) unless(receiver.db_schema.has_key?(field) &&
68
+ receiver.db_schema[field][:type] == type)
69
+ end
70
+ end
71
+
72
+ private_class_method :necessary_fields_checker
73
+ end
74
+
75
+ # Sequel migration helpers for resta.
76
+ module MigrationHelpers
77
+
78
+ DEFAULT_PRIMARY_COLUMN_OPTS = {
79
+ type: :string,
80
+ auto_increment: false,
81
+ }.freeze
82
+
83
+ # Helpers used in schema modification.
84
+ module AlterTable
85
+ def add_primary_column(name, opts=nil)
86
+ opts = (opts || {}).merge DEFAULT_PRIMARY_COLUMN_OPTS
87
+ add_primary_key name, opts
88
+ end
89
+
90
+ def add_timestamp_columns
91
+ [:created_at, :updated_at].each do
92
+ |f| add_column f, :datetime
93
+ end
94
+ end
95
+
96
+ def add_version_column
97
+ add_column :'_$version', :string
98
+ end
99
+ end
100
+
101
+ # Helpers for AlterTableGenerator
102
+ module Reverser
103
+
104
+ private
105
+
106
+ def add_primary_column(name, opts=nil)
107
+ opts = (opts || {}).merge DEFAULT_PRIMARY_COLUMN_OPTS
108
+ @actions << [:drop_column, name, opts]
109
+ end
110
+
111
+ def add_timestamp_columns
112
+ @actions << [:drop_column, :created_at]
113
+ @actions << [:drop_column, :updated_at]
114
+ end
115
+
116
+ def add_version_column
117
+ @actions << [:drop_column, :'_$version']
118
+ end
119
+ end
120
+
121
+ # Helpers used in create table
122
+ module CreateTable
123
+ def primary_column(name, opts=nil)
124
+ opts = (opts || {}).merge DEFAULT_PRIMARY_COLUMN_OPTS
125
+ primary_key name, :string, opts
126
+ end
127
+
128
+ def timestamp_columns
129
+ [:created_at, :updated_at].each do
130
+ |f| column f, :datetime
131
+ end
132
+ end
133
+
134
+ def version_column
135
+ column :'_$version', :string
136
+ end
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+ module Sequel
143
+
144
+ class MigrationAlterTableReverser
145
+ include Resta::MigrationHelpers::Reverser
146
+ end
147
+
148
+ module Schema
149
+ class AlterTableGenerator
150
+ include Resta::MigrationHelpers::AlterTable
151
+ end
152
+
153
+ class CreateTableGenerator
154
+ include Resta::MigrationHelpers::CreateTable
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,45 @@
1
+ require 'active_support/inflector'
2
+ require 'singleton'
3
+ require 'sinatra/base'
4
+ require 'sinatra/multi_route'
5
+
6
+ require_relative 'model'
7
+
8
+ # Sinatra based web server.
9
+ # Turns your sequel model directly into a RESTful API.
10
+ module Resta
11
+
12
+ module_function
13
+ def get_model_pluralize_name(m)
14
+ m.name.split(':').last.underscore.pluralize.to_sym
15
+ end
16
+
17
+ # Global singleton hash object for storing resource builder object.
18
+ class RestaStore < Hash
19
+ include Singleton
20
+ end
21
+
22
+ # Resta resource object builder class
23
+ class ResourceBuilder
24
+
25
+ # Current support restful methods for resta.
26
+ ALLOWED_METODS = [:update, :create, :delete, :get, :query, :patch].freeze
27
+ end
28
+ end
29
+
30
+ module Sinatra
31
+
32
+ # Resta related helpers for sinatra
33
+ module RestaHelpers
34
+
35
+ end
36
+ helpers RestaHelpers
37
+
38
+ class << Application
39
+ def resource(model, opts = {}, &block)
40
+
41
+ end
42
+ end
43
+ Delegator.delegate(:resource)
44
+
45
+ end
@@ -0,0 +1,3 @@
1
+ module Resta
2
+ VERSION = "0.1.0"
3
+ end
data/resta.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'resta/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "resta"
8
+ spec.version = Resta::VERSION
9
+ spec.authors = ["Vincent Ting"]
10
+ spec.email = ["homerdd at gmail.com"]
11
+
12
+ spec.description = %q{Sinatra based web server that turns your sequel model directly into a RESTful API.}
13
+ spec.summary = spec.description
14
+ spec.homepage = "https://github.com/waiiio/resta"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.11"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ if RUBY_PLATFORM == 'java'
25
+ spec.add_development_dependency "jdbc-sqlite3", "~> 3.8"
26
+ else
27
+ spec.add_development_dependency "sqlite3", "~> 1.3"
28
+ spec.add_development_dependency "cane", "~> 2.6"
29
+ end
30
+ spec.add_development_dependency "minitest", "~> 5.0"
31
+ spec.add_development_dependency "simplecov", "~> 0.11.1"
32
+ spec.add_development_dependency "coveralls", "~> 0.8.2"
33
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Ting
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-01-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cane
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.11.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.11.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.8.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.2
111
+ description: Sinatra based web server that turns your sequel model directly into a
112
+ RESTful API.
113
+ email:
114
+ - homerdd at gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - lib/resta.rb
126
+ - lib/resta/model.rb
127
+ - lib/resta/resource.rb
128
+ - lib/resta/version.rb
129
+ - resta.gemspec
130
+ homepage: https://github.com/waiiio/resta
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.4.5.1
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Sinatra based web server that turns your sequel model directly into a RESTful
154
+ API.
155
+ test_files: []
156
+ has_rdoc: