app_rail-airtable 0.4.0 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -5
- data/Gemfile.lock +9 -6
- data/Rakefile +5 -3
- data/app_rail-airtable.gemspec +21 -18
- data/bin/ara_generator +4 -2
- data/bin/console +4 -3
- data/lib/app_rail/airtable/application_record.rb +24 -21
- data/lib/app_rail/airtable/authenticatable.rb +20 -18
- data/lib/app_rail/airtable/authentication_helpers.rb +10 -7
- data/lib/app_rail/airtable/sinatra.rb +27 -25
- data/lib/app_rail/airtable/string_ext.rb +4 -2
- data/lib/app_rail/airtable/version.rb +1 -1
- data/lib/app_rail/airtable.rb +9 -7
- data/templates/project/Gemfile +1 -0
- data/templates/project/config.ru +2 -0
- data/templates/project/spec/spec_helper.rb +56 -57
- metadata +27 -14
- data/templates/project/Gemfile.lock +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f789fb754083245cc062131945cb235ac19070edd2e3ae154e5a233b1533f76b
|
4
|
+
data.tar.gz: '08a45094b4ba5b5882a8a1baed2acc39c3345adaa8d8557b8ae2daaa3a2bb96c'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9bdf986a03d4ce2e00368f7a4ac5048a8b2271778647d1ea27adce3c8b8fa185854e339b2769ee0e0acfce5bfb6dc985cdafc3b4787a8f78fad2da5fdda1681
|
7
|
+
data.tar.gz: 995431a75366484398c7d90e1e12a3950ac47c23ca6ebe78b9410320dd17224cf08d401df7f613f60b62dca8458103f506d5ebe3e6d5bb0aea0a60a726cce2dc
|
data/Gemfile
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in app_rail-airtable.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
gem
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
8
|
+
gem 'byebug'
|
9
|
+
gem 'rake', '~> 12.0'
|
10
|
+
gem 'rspec', '~> 3.0'
|
11
|
+
gem 'thor'
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
app_rail-airtable (0.4.
|
4
|
+
app_rail-airtable (0.4.3)
|
5
5
|
activesupport
|
6
6
|
airrecord
|
7
|
+
app_rail-steps
|
7
8
|
bcrypt
|
8
9
|
faraday (~> 2.2)
|
9
10
|
faraday-net_http_persistent (~> 2.0)
|
@@ -13,23 +14,25 @@ PATH
|
|
13
14
|
GEM
|
14
15
|
remote: https://rubygems.org/
|
15
16
|
specs:
|
16
|
-
activesupport (7.0.2.
|
17
|
+
activesupport (7.0.2.3)
|
17
18
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
19
|
i18n (>= 1.6, < 2)
|
19
20
|
minitest (>= 5.1)
|
20
21
|
tzinfo (~> 2.0)
|
21
|
-
airrecord (1.0.
|
22
|
+
airrecord (1.0.9)
|
22
23
|
faraday (>= 0.10, < 3.0)
|
24
|
+
faraday-net_http_persistent
|
23
25
|
net-http-persistent
|
24
|
-
|
26
|
+
app_rail-steps (0.2.0)
|
27
|
+
bcrypt (3.1.17)
|
25
28
|
byebug (11.1.3)
|
26
|
-
concurrent-ruby (1.1.
|
29
|
+
concurrent-ruby (1.1.10)
|
27
30
|
connection_pool (2.2.5)
|
28
31
|
diff-lcs (1.4.4)
|
29
32
|
faraday (2.2.0)
|
30
33
|
faraday-net_http (~> 2.0)
|
31
34
|
ruby2_keywords (>= 0.0.4)
|
32
|
-
faraday-net_http (2.0.
|
35
|
+
faraday-net_http (2.0.2)
|
33
36
|
faraday-net_http_persistent (2.0.1)
|
34
37
|
faraday-net_http
|
35
38
|
net-http-persistent (~> 4.0)
|
data/Rakefile
CHANGED
data/app_rail-airtable.gemspec
CHANGED
@@ -1,37 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'lib/app_rail/airtable/version'
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
|
-
spec.name =
|
6
|
+
spec.name = 'app_rail-airtable'
|
5
7
|
spec.version = AppRail::Airtable::VERSION
|
6
|
-
spec.authors = [
|
7
|
-
spec.email = [
|
8
|
+
spec.authors = ['Matt Brooke-Smith']
|
9
|
+
spec.email = ['matt@futureworkshops.com']
|
8
10
|
|
9
|
-
spec.summary =
|
10
|
-
spec.homepage =
|
11
|
-
spec.license =
|
12
|
-
spec.required_ruby_version = Gem::Requirement.new(
|
11
|
+
spec.summary = 'Gem to help building App Rail servers using Airtable as a backend'
|
12
|
+
spec.homepage = 'https://github.com/FutureWorkshops/app_rail-airtable'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
13
15
|
|
14
|
-
spec.metadata[
|
15
|
-
spec.metadata[
|
16
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
+
spec.metadata['source_code_uri'] = 'https://github.com/FutureWorkshops/app_rail-airtable'
|
16
18
|
|
17
19
|
# Specify which files should be added to the gem when it is released.
|
18
20
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
-
spec.files
|
21
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
20
22
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
spec.bindir = 'bin'
|
24
26
|
spec.executables << 'ara_generator'
|
25
|
-
|
26
|
-
spec.require_paths = [
|
27
|
+
|
28
|
+
spec.require_paths = ['lib']
|
29
|
+
spec.add_dependency 'app_rail-steps'
|
27
30
|
spec.add_dependency 'activesupport'
|
28
|
-
spec.add_dependency 'sinatra'
|
29
31
|
spec.add_dependency 'airrecord'
|
32
|
+
spec.add_dependency 'bcrypt'
|
30
33
|
spec.add_dependency 'faraday', '~> 2.2'
|
31
34
|
spec.add_dependency 'faraday-net_http_persistent', '~> 2.0' # workaround to make Faraday work after upgrading to 2.2.0
|
35
|
+
spec.add_dependency 'sinatra'
|
32
36
|
spec.add_dependency 'thor'
|
33
|
-
|
34
|
-
|
35
|
-
spec.add_development_dependency 'rspec'
|
37
|
+
|
36
38
|
spec.add_development_dependency 'rack-test'
|
37
|
-
|
39
|
+
spec.add_development_dependency 'rspec'
|
40
|
+
end
|
data/bin/ara_generator
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'app_rail/airtable'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "app_rail/airtable"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start(__FILE__)
|
@@ -1,64 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'airrecord'
|
4
|
+
require 'app_rail/steps'
|
2
5
|
require 'active_support/core_ext/string/inflections'
|
3
6
|
|
4
7
|
module AppRail
|
5
8
|
module Airtable
|
6
9
|
class ApplicationRecord < Airrecord::Table
|
7
10
|
include ActiveSupport::Inflector
|
8
|
-
|
11
|
+
include AppRail::Steps::Displayable
|
12
|
+
|
9
13
|
def self.base_key
|
10
|
-
ENV.fetch(
|
14
|
+
ENV.fetch('AIRTABLE_BASE_ID')
|
11
15
|
end
|
12
|
-
|
16
|
+
|
13
17
|
def self.table_name
|
14
|
-
|
18
|
+
name.pluralize
|
15
19
|
end
|
16
|
-
|
20
|
+
|
17
21
|
def self.airtable_attr(*attributes)
|
18
22
|
attributes.each do |attribute|
|
19
23
|
define_method(attribute.to_s.snake_case) { self[attribute] }
|
20
24
|
define_method("#{attribute.to_s.snake_case}=") { |value| self[attribute] = value }
|
21
25
|
end
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
# Step utilities
|
25
29
|
def self.ar_list_item(text:, detail_text: nil, image: nil, sf_symbol: nil, material_icon: nil)
|
26
30
|
define_method(:ar_list_item_as_json) do
|
27
31
|
{
|
28
|
-
id:
|
29
|
-
text: method_value(text).to_s,
|
30
|
-
detailText: method_value(detail_text).to_s,
|
31
|
-
imageURL: method_value(image),
|
32
|
-
sfSymbolName: method_value(sf_symbol),
|
32
|
+
id: id,
|
33
|
+
text: method_value(text).to_s,
|
34
|
+
detailText: method_value(detail_text).to_s,
|
35
|
+
imageURL: method_value(image),
|
36
|
+
sfSymbolName: method_value(sf_symbol),
|
33
37
|
materialIconName: method_value(material_icon)
|
34
38
|
}.compact
|
35
39
|
end
|
36
40
|
end
|
37
|
-
|
41
|
+
|
38
42
|
def self.ar_stack(text_items:)
|
39
43
|
define_method(:ar_stack_as_json) do
|
40
|
-
text_items.map{|ti| {type: :text, label: ti, text: self[ti].to_s} }
|
44
|
+
text_items.map { |ti| { type: :text, label: ti, text: self[ti].to_s } }
|
41
45
|
end
|
42
46
|
end
|
43
|
-
|
47
|
+
|
44
48
|
# Customisable behaviour
|
45
|
-
|
49
|
+
|
46
50
|
# Override to provide custom sorting or filtering for index
|
47
51
|
def self.index(user:)
|
48
52
|
all
|
49
53
|
end
|
50
|
-
|
54
|
+
|
51
55
|
private
|
52
|
-
|
56
|
+
|
53
57
|
def method_value(name)
|
54
58
|
send(name) if name.present?
|
55
59
|
end
|
56
|
-
|
60
|
+
|
57
61
|
# size is either :small, :large or :full
|
58
62
|
def image(name, index: 0, size: :full)
|
59
|
-
self[name][index][
|
63
|
+
self[name][index]['thumbnails'][size.to_s]['url'] if self[name] && self[name].length > index
|
60
64
|
end
|
61
|
-
|
62
65
|
end
|
63
66
|
end
|
64
|
-
end
|
67
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bcrypt'
|
2
4
|
require 'securerandom'
|
3
5
|
|
@@ -5,50 +7,50 @@ module AppRail
|
|
5
7
|
module Airtable
|
6
8
|
module Authenticatable
|
7
9
|
include BCrypt
|
8
|
-
|
10
|
+
|
9
11
|
def self.included(klass)
|
10
12
|
klass.extend(ClassMethods)
|
11
13
|
klass.prepend(InstanceMethods) # prepends `initialize` instance method in order to take precedence over Airrecord::Table#initialize
|
12
14
|
end
|
13
|
-
|
15
|
+
|
14
16
|
module ClassMethods
|
15
17
|
def create(email:, password:)
|
16
|
-
user = new(
|
18
|
+
user = new('Email' => email, 'Password Hash' => password_hash(password), 'Access Token' => next_access_token)
|
17
19
|
user.create
|
18
20
|
user
|
19
21
|
end
|
20
|
-
|
22
|
+
|
21
23
|
def create_session_as_json(email:, password:)
|
22
24
|
user = find_by_email_and_password(email, password)
|
23
25
|
return nil unless user
|
24
|
-
|
25
|
-
user[
|
26
|
+
|
27
|
+
user['Access Token'] = next_access_token
|
26
28
|
user.save
|
27
29
|
user&.oauth_session
|
28
30
|
end
|
29
|
-
|
31
|
+
|
30
32
|
def find_by_email_and_password(email, password)
|
31
33
|
user = all(filter: "{Email} = \"#{email}\"").first
|
32
34
|
user&.valid_password?(password) ? user : nil
|
33
35
|
end
|
34
36
|
|
35
37
|
def find_by_access_token(access_token)
|
36
|
-
all(filter: "{Access Token} = \"#{access_token}\"").first
|
38
|
+
all(filter: "{Access Token} = \"#{access_token}\"").first
|
37
39
|
end
|
38
|
-
|
40
|
+
|
39
41
|
def password_hash(password)
|
40
42
|
BCrypt::Password.create(password)
|
41
|
-
end
|
42
|
-
|
43
|
+
end
|
44
|
+
|
43
45
|
def next_access_token
|
44
46
|
SecureRandom.hex
|
45
|
-
end
|
47
|
+
end
|
46
48
|
end
|
47
49
|
|
48
50
|
module InstanceMethods
|
49
51
|
def initialize(*args)
|
50
52
|
if (kwargs = args.first) && kwargs.is_a?(Hash) && kwargs.size == 2 && kwargs.key?(:email) && kwargs.key?(:password)
|
51
|
-
super(
|
53
|
+
super('Email' => kwargs[:email], 'Password Hash' => self.class.password_hash(kwargs[:password]), 'Access Token' => self.class.next_access_token)
|
52
54
|
else
|
53
55
|
super
|
54
56
|
end
|
@@ -58,14 +60,14 @@ module AppRail
|
|
58
60
|
def valid_password?(password)
|
59
61
|
BCrypt::Password.new(password_hash) == password
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
def password_hash
|
63
|
-
self[
|
65
|
+
self['Password Hash']
|
64
66
|
end
|
65
|
-
|
67
|
+
|
66
68
|
def oauth_session
|
67
|
-
{ access_token: self[
|
69
|
+
{ access_token: self['Access Token'], scope: :user, refresh_token: '', token_type: :bearer, expires_in: 60_000 }
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
71
|
-
end
|
73
|
+
end
|
@@ -1,27 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module AppRail
|
2
4
|
module Airtable
|
3
5
|
module AuthenticationHelpers
|
4
6
|
def current_user
|
5
7
|
@current_user ||= find_current_user
|
6
8
|
end
|
7
|
-
|
9
|
+
|
8
10
|
def find_current_user
|
9
11
|
authorization_header && bearer_token ? find_authenticatable_resource(access_token: bearer_token) : nil
|
10
12
|
end
|
11
|
-
|
13
|
+
|
12
14
|
def bearer_token
|
13
|
-
authorization_values = authorization_header.split(
|
15
|
+
authorization_values = authorization_header.split(' ')
|
14
16
|
return nil unless authorization_values.count > 1
|
17
|
+
|
15
18
|
authorization_values[1]
|
16
19
|
end
|
17
|
-
|
20
|
+
|
18
21
|
def authorization_header
|
19
|
-
request.env[
|
22
|
+
request.env['HTTP_AUTHORIZATION']
|
20
23
|
end
|
21
|
-
|
24
|
+
|
22
25
|
def authenticate!
|
23
26
|
halt 401 unless current_user
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
27
|
-
end
|
30
|
+
end
|
@@ -1,57 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'sinatra'
|
2
4
|
require 'json'
|
3
5
|
require 'active_support'
|
4
6
|
|
5
7
|
# TODO: MBS - move to configure block or other
|
6
|
-
Airrecord.api_key = ENV.fetch(
|
8
|
+
Airrecord.api_key = ENV.fetch('AIRTABLE_API_KEY')
|
7
9
|
|
8
10
|
class Symbol
|
9
|
-
|
10
11
|
def pluralize
|
11
12
|
ActiveSupport::Inflector.pluralize(self)
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def classify
|
15
|
-
ActiveSupport::Inflector.classify(self)
|
16
|
+
ActiveSupport::Inflector.classify(self)
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
def classify_constantize
|
19
20
|
ActiveSupport::Inflector.constantize(classify)
|
20
21
|
end
|
21
|
-
|
22
22
|
end
|
23
23
|
|
24
24
|
module AppRail
|
25
25
|
module Airtable
|
26
26
|
class Sinatra < Sinatra::Base
|
27
27
|
@@authenticated_route = false
|
28
|
-
|
28
|
+
|
29
29
|
helpers do
|
30
30
|
def request_body_as_json
|
31
31
|
request.body.rewind
|
32
32
|
JSON.parse(request.body.read)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def params_and_body_as_json
|
36
36
|
request_body_as_json.merge(params)
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
|
-
def self.authenticatable_resources(name, only: [
|
41
|
-
|
39
|
+
|
40
|
+
def self.authenticatable_resources(name, only: %i[index show create update])
|
42
41
|
# If authentication is used then include the correct helpers
|
43
42
|
# Allowing the routes to use `authenticate!` and `current_user`
|
44
43
|
helpers AppRail::Airtable::AuthenticationHelpers
|
45
|
-
|
44
|
+
|
46
45
|
resources(name, only: only)
|
47
|
-
|
46
|
+
|
48
47
|
return unless block_given?
|
48
|
+
|
49
49
|
@@authenticated_route = true
|
50
50
|
yield
|
51
51
|
@@authenticated_route = false
|
52
52
|
end
|
53
53
|
|
54
|
-
def self.resources(name, only: [
|
54
|
+
def self.resources(name, only: %i[index show create update])
|
55
55
|
only = [only] if only.is_a?(Symbol)
|
56
56
|
|
57
57
|
index_route(name, authenticated_route?) if only.include?(:index)
|
@@ -59,34 +59,36 @@ module AppRail
|
|
59
59
|
create_route(name, authenticated_route?) if only.include?(:create)
|
60
60
|
update_route(name, authenticated_route?) if only.include?(:update)
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def self.index_route(name, authenticated_route)
|
64
|
-
get "/#{name
|
64
|
+
get "/#{name}" do
|
65
65
|
authenticate! if authenticated_route
|
66
66
|
name.classify_constantize.index(user: authenticated_route ? current_user : nil).map(&:ar_list_item_as_json).to_json
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def self.show_route(name, authenticated_route)
|
71
|
-
get "/#{name
|
71
|
+
get "/#{name}/:id" do
|
72
72
|
authenticate! if authenticated_route
|
73
73
|
name.classify_constantize.find(params['id']).ar_stack_as_json.to_json
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def self.create_route(name, authenticated_route)
|
78
|
-
post "/#{name
|
78
|
+
post "/#{name}" do
|
79
79
|
authenticate! if authenticated_route
|
80
|
-
as_json = name.classify_constantize.create_as_json(current_user: authenticated_route ? current_user : nil,
|
81
|
-
|
80
|
+
as_json = name.classify_constantize.create_as_json(current_user: authenticated_route ? current_user : nil,
|
81
|
+
params: params_and_body_as_json)
|
82
|
+
[201, as_json.to_json]
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
86
|
def self.update_route(name, authenticated_route)
|
86
|
-
put "/#{name
|
87
|
+
put "/#{name}/:id" do
|
87
88
|
authenticate! if authenticated_route
|
88
89
|
record = name.classify_constantize.find(params['id'])
|
89
|
-
as_json = record.update_as_json(current_user: authenticated_route ? current_user : nil,
|
90
|
+
as_json = record.update_as_json(current_user: authenticated_route ? current_user : nil,
|
91
|
+
params: params_and_body_as_json)
|
90
92
|
[200, as_json.to_json]
|
91
93
|
end
|
92
94
|
end
|
@@ -96,4 +98,4 @@ module AppRail
|
|
96
98
|
end
|
97
99
|
end
|
98
100
|
end
|
99
|
-
end
|
101
|
+
end
|
data/lib/app_rail/airtable.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'app_rail/airtable/version'
|
4
|
+
require 'app_rail/airtable/string_ext'
|
5
|
+
require 'app_rail/airtable/application_record'
|
6
|
+
require 'app_rail/airtable/authenticatable'
|
7
|
+
require 'app_rail/airtable/authentication_helpers'
|
8
|
+
require 'app_rail/airtable/sinatra'
|
9
|
+
require 'app_rail/airtable/generator'
|
8
10
|
|
9
11
|
module AppRail
|
10
12
|
module Airtable
|
data/templates/project/Gemfile
CHANGED
data/templates/project/config.ru
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
4
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
5
|
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
@@ -19,9 +21,9 @@ ENV['AIRTABLE_API_KEY'] = 'keyABC123'
|
|
19
21
|
ENV['AIRTABLE_BASE_ID'] = 'appABC123'
|
20
22
|
ENV['RACK_ENV'] = 'test'
|
21
23
|
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
24
|
+
require 'rack/test'
|
25
|
+
require 'app_rail/airtable'
|
26
|
+
require 'byebug'
|
25
27
|
|
26
28
|
require './lib/server'
|
27
29
|
|
@@ -56,60 +58,57 @@ RSpec.configure do |config|
|
|
56
58
|
# triggering implicit auto-inclusion in groups with matching metadata.
|
57
59
|
config.shared_context_metadata_behavior = :apply_to_host_groups
|
58
60
|
|
59
|
-
# The settings below are suggested to provide a good initial experience
|
60
|
-
# with RSpec, but feel free to customize to your heart's content.
|
61
|
-
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
#
|
75
|
-
#
|
76
|
-
# - http://
|
77
|
-
# - http://
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
84
|
-
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
|
99
|
-
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
Kernel.srand config.seed
|
111
|
-
=end
|
61
|
+
# The settings below are suggested to provide a good initial experience
|
62
|
+
# with RSpec, but feel free to customize to your heart's content.
|
63
|
+
# # This allows you to limit a spec run to individual examples or groups
|
64
|
+
# # you care about by tagging them with `:focus` metadata. When nothing
|
65
|
+
# # is tagged with `:focus`, all examples get run. RSpec also provides
|
66
|
+
# # aliases for `it`, `describe`, and `context` that include `:focus`
|
67
|
+
# # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
|
68
|
+
# config.filter_run_when_matching :focus
|
69
|
+
#
|
70
|
+
# # Allows RSpec to persist some state between runs in order to support
|
71
|
+
# # the `--only-failures` and `--next-failure` CLI options. We recommend
|
72
|
+
# # you configure your source control system to ignore this file.
|
73
|
+
# config.example_status_persistence_file_path = "spec/examples.txt"
|
74
|
+
#
|
75
|
+
# # Limits the available syntax to the non-monkey patched syntax that is
|
76
|
+
# # recommended. For more details, see:
|
77
|
+
# # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
|
78
|
+
# # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
79
|
+
# # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
|
80
|
+
# config.disable_monkey_patching!
|
81
|
+
#
|
82
|
+
# # This setting enables warnings. It's recommended, but in some cases may
|
83
|
+
# # be too noisy due to issues in dependencies.
|
84
|
+
# config.warnings = true
|
85
|
+
#
|
86
|
+
# # Many RSpec users commonly either run the entire suite or an individual
|
87
|
+
# # file, and it's useful to allow more verbose output when running an
|
88
|
+
# # individual spec file.
|
89
|
+
# if config.files_to_run.one?
|
90
|
+
# # Use the documentation formatter for detailed output,
|
91
|
+
# # unless a formatter has already been configured
|
92
|
+
# # (e.g. via a command-line flag).
|
93
|
+
# config.default_formatter = "doc"
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# # Print the 10 slowest examples and example groups at the
|
97
|
+
# # end of the spec run, to help surface which specs are running
|
98
|
+
# # particularly slow.
|
99
|
+
# config.profile_examples = 10
|
100
|
+
#
|
101
|
+
# # Run specs in random order to surface order dependencies. If you find an
|
102
|
+
# # order dependency and want to debug it, you can fix the order by providing
|
103
|
+
# # the seed, which is printed after each run.
|
104
|
+
# # --seed 1234
|
105
|
+
# config.order = :random
|
106
|
+
#
|
107
|
+
# # Seed global randomization in this process using the `--seed` CLI option.
|
108
|
+
# # Setting this allows you to use `--seed` to deterministically reproduce
|
109
|
+
# # test failures related to randomization by passing the same `--seed` value
|
110
|
+
# # as the one that triggered the failure.
|
111
|
+
# Kernel.srand config.seed
|
112
112
|
|
113
113
|
config.include Rack::Test::Methods
|
114
|
-
|
115
114
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_rail-airtable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Brooke-Smith
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: app_rail-steps
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bcrypt
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: faraday
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,7 +95,7 @@ dependencies:
|
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '2.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: sinatra
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - ">="
|
@@ -95,7 +109,7 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: thor
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ">="
|
@@ -109,7 +123,7 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: rack-test
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
@@ -123,7 +137,7 @@ dependencies:
|
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
140
|
+
name: rspec
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
@@ -136,7 +150,7 @@ dependencies:
|
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
|
-
description:
|
153
|
+
description:
|
140
154
|
email:
|
141
155
|
- matt@futureworkshops.com
|
142
156
|
executables:
|
@@ -172,7 +186,6 @@ files:
|
|
172
186
|
- templates/project/.env.tt
|
173
187
|
- templates/project/.gitignore
|
174
188
|
- templates/project/Gemfile
|
175
|
-
- templates/project/Gemfile.lock
|
176
189
|
- templates/project/app.json
|
177
190
|
- templates/project/config.ru
|
178
191
|
- templates/project/lib/server.rb.tt
|
@@ -184,7 +197,7 @@ licenses:
|
|
184
197
|
metadata:
|
185
198
|
homepage_uri: https://github.com/FutureWorkshops/app_rail-airtable
|
186
199
|
source_code_uri: https://github.com/FutureWorkshops/app_rail-airtable
|
187
|
-
post_install_message:
|
200
|
+
post_install_message:
|
188
201
|
rdoc_options: []
|
189
202
|
require_paths:
|
190
203
|
- lib
|
@@ -199,8 +212,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
212
|
- !ruby/object:Gem::Version
|
200
213
|
version: '0'
|
201
214
|
requirements: []
|
202
|
-
rubygems_version: 3.
|
203
|
-
signing_key:
|
215
|
+
rubygems_version: 3.1.6
|
216
|
+
signing_key:
|
204
217
|
specification_version: 4
|
205
218
|
summary: Gem to help building App Rail servers using Airtable as a backend
|
206
219
|
test_files: []
|
@@ -1,96 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activesupport (6.1.4.1)
|
5
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
6
|
-
i18n (>= 1.6, < 2)
|
7
|
-
minitest (>= 5.1)
|
8
|
-
tzinfo (~> 2.0)
|
9
|
-
zeitwerk (~> 2.3)
|
10
|
-
airrecord (1.0.7)
|
11
|
-
faraday (>= 0.10, < 2.0)
|
12
|
-
net-http-persistent
|
13
|
-
app_rail-airtable (0.4.0)
|
14
|
-
activesupport
|
15
|
-
airrecord
|
16
|
-
bcrypt
|
17
|
-
sinatra
|
18
|
-
thor
|
19
|
-
bcrypt (3.1.16)
|
20
|
-
byebug (11.1.3)
|
21
|
-
concurrent-ruby (1.1.9)
|
22
|
-
connection_pool (2.2.5)
|
23
|
-
diff-lcs (1.4.4)
|
24
|
-
dotenv (2.7.6)
|
25
|
-
faraday (1.8.0)
|
26
|
-
faraday-em_http (~> 1.0)
|
27
|
-
faraday-em_synchrony (~> 1.0)
|
28
|
-
faraday-excon (~> 1.1)
|
29
|
-
faraday-httpclient (~> 1.0.1)
|
30
|
-
faraday-net_http (~> 1.0)
|
31
|
-
faraday-net_http_persistent (~> 1.1)
|
32
|
-
faraday-patron (~> 1.0)
|
33
|
-
faraday-rack (~> 1.0)
|
34
|
-
multipart-post (>= 1.2, < 3)
|
35
|
-
ruby2_keywords (>= 0.0.4)
|
36
|
-
faraday-em_http (1.0.0)
|
37
|
-
faraday-em_synchrony (1.0.0)
|
38
|
-
faraday-excon (1.1.0)
|
39
|
-
faraday-httpclient (1.0.1)
|
40
|
-
faraday-net_http (1.0.1)
|
41
|
-
faraday-net_http_persistent (1.2.0)
|
42
|
-
faraday-patron (1.0.0)
|
43
|
-
faraday-rack (1.0.0)
|
44
|
-
i18n (1.8.11)
|
45
|
-
concurrent-ruby (~> 1.0)
|
46
|
-
minitest (5.14.4)
|
47
|
-
multipart-post (2.1.1)
|
48
|
-
mustermann (1.1.1)
|
49
|
-
ruby2_keywords (~> 0.0.1)
|
50
|
-
net-http-persistent (4.0.1)
|
51
|
-
connection_pool (~> 2.2)
|
52
|
-
rack (2.2.3)
|
53
|
-
rack-protection (2.1.0)
|
54
|
-
rack
|
55
|
-
rack-test (1.1.0)
|
56
|
-
rack (>= 1.0, < 3)
|
57
|
-
rspec (3.10.0)
|
58
|
-
rspec-core (~> 3.10.0)
|
59
|
-
rspec-expectations (~> 3.10.0)
|
60
|
-
rspec-mocks (~> 3.10.0)
|
61
|
-
rspec-core (3.10.1)
|
62
|
-
rspec-support (~> 3.10.0)
|
63
|
-
rspec-expectations (3.10.1)
|
64
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
65
|
-
rspec-support (~> 3.10.0)
|
66
|
-
rspec-mocks (3.10.2)
|
67
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
68
|
-
rspec-support (~> 3.10.0)
|
69
|
-
rspec-support (3.10.3)
|
70
|
-
ruby2_keywords (0.0.5)
|
71
|
-
sinatra (2.1.0)
|
72
|
-
mustermann (~> 1.0)
|
73
|
-
rack (~> 2.2)
|
74
|
-
rack-protection (= 2.1.0)
|
75
|
-
tilt (~> 2.0)
|
76
|
-
thor (1.1.0)
|
77
|
-
tilt (2.0.10)
|
78
|
-
tzinfo (2.0.4)
|
79
|
-
concurrent-ruby (~> 1.0)
|
80
|
-
zeitwerk (2.5.1)
|
81
|
-
|
82
|
-
PLATFORMS
|
83
|
-
ruby
|
84
|
-
|
85
|
-
DEPENDENCIES
|
86
|
-
app_rail-airtable (~> 0.4.0)
|
87
|
-
byebug
|
88
|
-
dotenv
|
89
|
-
rack-test
|
90
|
-
rspec
|
91
|
-
|
92
|
-
RUBY VERSION
|
93
|
-
ruby 2.7.4p191
|
94
|
-
|
95
|
-
BUNDLED WITH
|
96
|
-
2.1.4
|