overture 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 +7 -0
- data/README.md +15 -0
- data/bin/overture-migration +65 -0
- data/lib/overture.rb +5 -0
- data/lib/overture/database.rb +27 -0
- data/lib/overture/interactor.rb +30 -0
- data/lib/overture/model.rb +12 -0
- data/lib/overture/password_digester.rb +18 -0
- data/lib/overture/version.rb +6 -0
- data/lib/tasks/db.rake +44 -0
- metadata +186 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 67719de8a9681b85fa9a2736febd368c53b2f5ed99650ec57c3997f812a23925
|
4
|
+
data.tar.gz: 82d3fefb3fb15f4674a8a2bdf8078865df14b86ad5bed0da2d8dc2c90fc4001c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d785fcc8a0fae25165899087c8238a2ed74eb9378fda5a146d35f731d4a20146d52696c4af7cee4365598220777e296a4778a7e40d212b2b78aeccb13e1d10f0
|
7
|
+
data.tar.gz: 544673208d5782b8623e378800e88649158201368d35af737077bb7151724d9123d150725e74dae43d675b10212390a1b017619fdfbf4c594e5d1e89ac103572
|
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Overture
|
2
|
+
|
3
|
+
This is a library of tools and configurations based on the Clean Architecture.
|
4
|
+
|
5
|
+
This gem contains the basic configuration options and file organization to create a Ruby application.
|
6
|
+
|
7
|
+
Sinatra is used as a delivery layer, but it can be easily replaced. Core business rules live in the Interactors.
|
8
|
+
|
9
|
+
## Contents
|
10
|
+
|
11
|
+
- `Overture::Database`
|
12
|
+
- `Overture::Interactor`
|
13
|
+
- `Overture::Model`
|
14
|
+
- `Overture::PasswordDigester`
|
15
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
class Parser
|
8
|
+
def self.parse(options = {})
|
9
|
+
opt_parser = OptionParser.new do |opts|
|
10
|
+
opts.banner = 'Usage: overture-generate migration [options]'
|
11
|
+
|
12
|
+
opts.on '-nNAME', '--name=NAME', 'Migration name' do |n|
|
13
|
+
options[:name] = n
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on '-h', '--help', 'Prints this message' do
|
17
|
+
puts opts
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
opt_parser.parse!(options)
|
23
|
+
options
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
options = Parser.parse
|
28
|
+
|
29
|
+
if options[:name].nil?
|
30
|
+
Parser.parse(['--help'])
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
def generate_migration(name)
|
35
|
+
timestamp = Time.now.strftime('%Y%m%d%H%M%S')
|
36
|
+
filename = "migrations/#{timestamp}_#{name.tr(' ', '_').downcase}.rb"
|
37
|
+
|
38
|
+
FileUtils.mkdir_p('migrations')
|
39
|
+
File.open(filename, 'w') do |f|
|
40
|
+
f.puts <<~TEMPLATE
|
41
|
+
# frozen_string_literal: true
|
42
|
+
|
43
|
+
Sequel.migration do
|
44
|
+
table_name = :table_name # change this
|
45
|
+
|
46
|
+
up do
|
47
|
+
create_table(table_name) do
|
48
|
+
primary_key :id
|
49
|
+
DateTime :created_at, null: false
|
50
|
+
DateTime :updated_at, null: false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
down do
|
55
|
+
drop_table(table_name)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
TEMPLATE
|
60
|
+
end
|
61
|
+
puts "-----------> Created db migration: #{filename}"
|
62
|
+
end
|
63
|
+
|
64
|
+
generate_migration(options[:name])
|
65
|
+
|
data/lib/overture.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sequel'
|
4
|
+
|
5
|
+
Sequel.database_timezone = :utc
|
6
|
+
Sequel.application_timezone = :local
|
7
|
+
Sequel.extension :datetime_parse_to_time
|
8
|
+
|
9
|
+
module Overture
|
10
|
+
module Database
|
11
|
+
DEFAULT_OPTIONS = {
|
12
|
+
extensions: %i[
|
13
|
+
pg_array
|
14
|
+
pg_json
|
15
|
+
pg_timestamptz
|
16
|
+
named_timezones
|
17
|
+
],
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
module_function
|
21
|
+
|
22
|
+
def connect(url, options = {})
|
23
|
+
Sequel.connect(url, DEFAULT_OPTIONS.merge(options))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'interactor'
|
4
|
+
|
5
|
+
module Overture
|
6
|
+
class Interactor
|
7
|
+
include ::Interactor
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def required(*input)
|
11
|
+
before do
|
12
|
+
opts = input.last.is_a?(Hash) ? input.pop : {}
|
13
|
+
allow_empty = opts[:allow_empty]
|
14
|
+
|
15
|
+
input.each do |attr|
|
16
|
+
value = context.public_send(attr)
|
17
|
+
empty = value.respond_to?(:empty?) ? value.empty? : false
|
18
|
+
valid = !value.nil? && (allow_empty ? true : !empty)
|
19
|
+
fail!("#{attr} is required") unless valid
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def fail!(message)
|
26
|
+
context.fail!(error: message)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sequel'
|
4
|
+
|
5
|
+
module Overture
|
6
|
+
Model = Class.new(Sequel::Model)
|
7
|
+
Model.def_Model(self)
|
8
|
+
Model.plugin :timestamps, update_on_create: true
|
9
|
+
Model.plugin :many_through_many
|
10
|
+
Model.plugin :defaults_setter
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bcrypt'
|
4
|
+
|
5
|
+
module Overture
|
6
|
+
module PasswordDigester
|
7
|
+
def valid_password?(password_digest, password)
|
8
|
+
BCrypt::Password.new(password_digest).is_password?(password)
|
9
|
+
rescue BCrypt::Errors::InvalidHash
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
def digest_password(password, cost: BCrypt::Engine.cost)
|
14
|
+
BCrypt::Password.create(password, cost: cost)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
data/lib/tasks/db.rake
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sequel'
|
4
|
+
|
5
|
+
Sequel.extension :migration
|
6
|
+
|
7
|
+
namespace :db do
|
8
|
+
desc 'Run migrations for $DATABASE_URL'
|
9
|
+
task :migrate, [:version] do |_t, args|
|
10
|
+
require_relative '../overture/database'
|
11
|
+
|
12
|
+
DB ||= Overture::Database.connect(ENV['DATABASE_URL'])
|
13
|
+
version = args[:version].to_i if args[:version]
|
14
|
+
|
15
|
+
def pk_uuid(name)
|
16
|
+
column name, :uuid, primary_key: true, default: Sequel.function(:uuid_generate_v4)
|
17
|
+
end
|
18
|
+
|
19
|
+
puts "Migrating database to #{version ? "version #{version}" : 'latest version'}..."
|
20
|
+
Sequel::Migrator.run(DB, 'migrations', target: version)
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Resets $DATABASE_URL schema to latest version'
|
24
|
+
task :reset do
|
25
|
+
Rake::Task['db:migrate'].reenable
|
26
|
+
Rake::Task['db:migrate'].invoke(0)
|
27
|
+
Rake::Task['db:migrate'].reenable
|
28
|
+
Rake::Task['db:migrate'].invoke
|
29
|
+
end
|
30
|
+
|
31
|
+
namespace :test do
|
32
|
+
desc 'Resets $TEST_DATABASE_URL database schema to latest version'
|
33
|
+
task :reset do
|
34
|
+
ENV['RACK_ENV'] = 'test'
|
35
|
+
ENV['DATABASE_URL'] = ENV['TEST_DATABASE_URL']
|
36
|
+
|
37
|
+
Rake::Task['db:migrate'].reenable
|
38
|
+
Rake::Task['db:migrate'].invoke(0)
|
39
|
+
Rake::Task['db:migrate'].reenable
|
40
|
+
Rake::Task['db:migrate'].invoke
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
metadata
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: overture
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- edgarjs
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bcrypt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dotenv
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: interactor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sequel_pg
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.11'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.11'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tzinfo
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.2'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tzinfo-data
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2018'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.2018'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '5.11'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '5.11'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: minitest-reporters
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.3'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.3'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '12'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '12'
|
139
|
+
description: |
|
140
|
+
Tools and configurations based on the Clean Architecture.
|
141
|
+
|
142
|
+
This gem contains the basic configuration options and file
|
143
|
+
organization to create a Ruby application.
|
144
|
+
|
145
|
+
Sinatra is used as a delivery layer, but it can be easily
|
146
|
+
replaced. Core business rules live in the Interactors.
|
147
|
+
email: edgar.js@gmail.com
|
148
|
+
executables:
|
149
|
+
- overture-migration
|
150
|
+
extensions: []
|
151
|
+
extra_rdoc_files: []
|
152
|
+
files:
|
153
|
+
- README.md
|
154
|
+
- bin/overture-migration
|
155
|
+
- lib/overture.rb
|
156
|
+
- lib/overture/database.rb
|
157
|
+
- lib/overture/interactor.rb
|
158
|
+
- lib/overture/model.rb
|
159
|
+
- lib/overture/password_digester.rb
|
160
|
+
- lib/overture/version.rb
|
161
|
+
- lib/tasks/db.rake
|
162
|
+
homepage: https://github.com/edgarjs/overture
|
163
|
+
licenses:
|
164
|
+
- MIT
|
165
|
+
metadata: {}
|
166
|
+
post_install_message:
|
167
|
+
rdoc_options: []
|
168
|
+
require_paths:
|
169
|
+
- lib
|
170
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
requirements: []
|
181
|
+
rubyforge_project:
|
182
|
+
rubygems_version: 2.7.6
|
183
|
+
signing_key:
|
184
|
+
specification_version: 4
|
185
|
+
summary: Tools and configurations for your web app.
|
186
|
+
test_files: []
|