kybus-nanorecord 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d85c44fc47833caffc0b6edc7bd4e268838fb62d04cf147a36d3cb0c44a866ec
4
+ data.tar.gz: d0920287c879e9bbcd831ed69cb546cdd337875c442939a7951b253e38c11381
5
+ SHA512:
6
+ metadata.gz: ae91f986dcb75f2f33318c9c6d412fbab6ad1868774eab0fe8320b2c383be1847cf04796af51870d98d18789a4421eb894c5acf9fee80aef3eb45a1b4f4e8c30
7
+ data.tar.gz: 498603cda88397c22d7ed2b039790ab228f7be5c56d73bb788fc07c8eda95b40af397f46058f2934912771ad92ea70f846626f9479bfafcc4f0e60da68093f9c
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ class CRUDWebController
6
+ def initialize(name, conf, model)
7
+ @model = model
8
+ @conf = conf
9
+ @name = name
10
+ end
11
+
12
+ def build_class
13
+ @klass = Class.new(base_controller_class) do
14
+ extend Kybus::DRY::ResourceInjector
15
+
16
+ def model
17
+ self.class.resource(:kybus_model)
18
+ end
19
+
20
+ def index
21
+ @objects = model.paginate(page: params[:page], per_page: 3)
22
+ end
23
+
24
+ def new
25
+ @object = model.new
26
+ end
27
+
28
+ def edit; end
29
+ def show; end
30
+
31
+ def create
32
+ @object = model.new(build_params)
33
+ # user = current_user
34
+ # @object.user = user
35
+ if @object.save
36
+ flash[:notice] = "#{model.name} added"
37
+ redirect_to(@object)
38
+ else
39
+ render('new')
40
+ end
41
+ end
42
+
43
+ def update
44
+ if @object.update(build_params)
45
+ flash[:notice] = 'Updated correctly'
46
+ redirect_to(@object)
47
+ else
48
+ render('edit')
49
+ end
50
+ end
51
+
52
+ def destroy
53
+ @object.destroy
54
+ redirect_to(request.referrer || send("#{model.name.tableize}_path".to_sym))
55
+ end
56
+
57
+ private
58
+
59
+ def find_object
60
+ @object = model.find(params[:id])
61
+ end
62
+
63
+ def build_params
64
+ params.require(model.name.singularize.to_sym).permit(*expected_params_list, *expected_params_hash)
65
+ end
66
+
67
+ # def check_user
68
+ # require_user(@object.user, article_path(@object))
69
+ # end
70
+ end
71
+ end
72
+
73
+ def set_layout
74
+ @klass.layout(conf['layout'])
75
+ end
76
+
77
+ def base_controller_class
78
+ ActionController::Base
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ # # frozen_string_literal: true
85
+
86
+ # before_action :require_login, except: %i[index show]
87
+ # before_action :check_user, only: %i[edit update destroy]
88
+
89
+ # include ApplicationHelper
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'crud_web_controller'
4
+
5
+ module Kybus
6
+ module Nanorecord
7
+ module Controller
8
+ class WebControllers
9
+ def initialize(configs, schema)
10
+ @conf = configs
11
+ @schema = schema
12
+ @controllers = configs.to_h { |name, conf| [name, CRUDWebController.new(name, conf, schema.models[name])] }
13
+ end
14
+
15
+ def build!
16
+ @controllers.each_value(&:build_class)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kybus/dry/resource_injector'
4
+ require_relative 'plugins/hook'
5
+ require_relative 'plugins/plugin_provider'
6
+
7
+ module Kybus
8
+ module Nanorecord
9
+ class ModelHooks
10
+ def initialize(schema)
11
+ @hooks = schema.models.keys.to_h { |table| [table, Plugins::Hook.new] }
12
+ @schema = schema
13
+ end
14
+
15
+ def for_table(name)
16
+ raise("#{name} does not exist") unless @hooks[name]
17
+
18
+ @hooks[name]
19
+ end
20
+
21
+ def register_hook(table, type, &block)
22
+ for_table(table).register_hook(type, &block)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class Base
7
+ attr_reader :model
8
+
9
+ def initialize(model)
10
+ @model = model
11
+ end
12
+
13
+ def table
14
+ model.name.tableize
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class Hook
7
+ def initialize
8
+ @hooks = {
9
+ create_table: [],
10
+ post_table: [],
11
+ model: []
12
+ }
13
+ end
14
+
15
+ def register_hook(type, &block)
16
+ @hooks[type] << block
17
+ end
18
+
19
+ def apply(type, context)
20
+ @hooks[type].each { |hook| hook.call(context) }
21
+ end
22
+
23
+ def has?(type)
24
+ @hooks[type] && !@hooks[type].empty?
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class PluginProvider
7
+ extend Kybus::DRY::ResourceInjector
8
+
9
+ def self.register_plugin(name, provider)
10
+ register(:plugins, name, provider)
11
+ end
12
+
13
+ def self.apply!(config, model, hooks)
14
+ provider = resource(:plugins, config['name'])
15
+ provider.new(model).apply!(config, hooks)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ require_relative 'relationships'
23
+ require_relative 'secure_password'
24
+ require_relative 'timestamps'
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Kybus
6
+ module Nanorecord
7
+ module Plugins
8
+ class Relationships < Base
9
+ class Plugin
10
+ def initialize(model, table, conf)
11
+ @model = model
12
+ @table = table.tableize
13
+ @conf = conf
14
+ end
15
+
16
+ def apply_to(hook_provider, to)
17
+ hook_provider.register_hook(@table, :create_table) do |t|
18
+ t.column("#{to}_id".to_sym, :int)
19
+ end
20
+
21
+ hook_provider.register_hook(@table, :post_table) do |t|
22
+ t.add_foreign_key(@table.to_sym, to.pluralize.to_sym)
23
+ end
24
+
25
+ hook_provider.register_hook(@table, :model) do |t|
26
+ t.belongs_to(to.to_sym)
27
+ end
28
+
29
+ hook_provider.register_hook(to.pluralize.to_s, :model) do |t|
30
+ t.has_many(@table.to_sym)
31
+ end
32
+ end
33
+
34
+ def apply_n_to_n_relationship(hook_provider, model_a, model_b)
35
+ hook_provider.register_hook(model_a.pluralize.to_s, :model) do |t|
36
+ t.has_many(model_b.pluralize.to_sym, through: @table.to_sym)
37
+ end
38
+
39
+ hook_provider.register_hook(model_b.pluralize.to_s, :model) do |t|
40
+ t.has_many(model_a.pluralize.to_sym, through: @table.to_sym)
41
+ end
42
+ end
43
+
44
+ def apply(hook_provider)
45
+ case @conf['models']
46
+ when String
47
+ apply_to(hook_provider, @conf['models'])
48
+ when Array
49
+ @conf['models'].each { |to| apply_to(hook_provider, to) }
50
+ apply_n_to_n_relationship(hook_provider, *@conf['models']) if @conf['models'].size == 2
51
+ end
52
+ end
53
+ end
54
+
55
+ def apply!(config, hook_provider)
56
+ Plugin.new(model, table, config).apply(hook_provider)
57
+ end
58
+ end
59
+ PluginProvider.register_plugin('belongs_to', Relationships)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class SecurePassword < Base
7
+ def apply!(_config, hook_provider)
8
+ hook_provider.register_hook(table, :create_table) do |t|
9
+ t.string(:password_digest, null: false)
10
+ end
11
+
12
+ hook_provider.register_hook(table, :model, &:has_secure_password)
13
+ end
14
+ end
15
+
16
+ PluginProvider.register_plugin('safe_password', SecurePassword)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class Timestamps < Base
7
+ def apply!(_config, hook_provider)
8
+ hook_provider.register_hook(table, :create_table, &:timestamps)
9
+ end
10
+ end
11
+ PluginProvider.register_plugin('timestamps', Timestamps)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ module Plugins
6
+ class Validations < Base
7
+ def apply(_hook_provider)
8
+ # rubocop: disable Lint/EmptyBlock
9
+ tables.each do |t|
10
+ end
11
+ # rubocop: enable Lint/EmptyBlock
12
+ end
13
+ end
14
+ PluginProvider.register_plugin(Validations)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ class Schema
6
+ class Config
7
+ attr_reader :raw
8
+
9
+ def initialize(confs, model)
10
+ @raw = confs
11
+ @model = model
12
+ end
13
+
14
+ def parse_array
15
+ raw.map { |str| str.is_a?(String) ? parse_string(str) : str }
16
+ end
17
+
18
+ def parse_string(str = raw)
19
+ { 'name' => str }
20
+ end
21
+
22
+ def config_for(config_name)
23
+ plugins_config.select { |h| h['name'] == config_name }.first
24
+ end
25
+
26
+ def plugins_config
27
+ case raw
28
+ when Array
29
+ parse_array
30
+ when String
31
+ parse_string
32
+ else
33
+ []
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ module Kybus
6
+ module Nanorecord
7
+ class Schema
8
+ class Field
9
+ attr_reader :confs, :type, :name, :extra
10
+
11
+ def initialize(name, confs)
12
+ @confs = confs || {}
13
+ @type = @confs['type']&.to_sym || :string
14
+ @name = name.to_sym
15
+ @extra = {
16
+ null: @confs['not_null'],
17
+ index: build_index
18
+ }.compact
19
+ end
20
+
21
+ def build_index
22
+ (@confs['unique'] || @confs['index']) && { unique: !@confs['unique'].nil? }
23
+ end
24
+
25
+ def build_regex
26
+ case @confs['regex']
27
+ when 'email'
28
+ URI::MailTo::EMAIL_REGEXP
29
+ when String
30
+ /#{@confs['regex']}/
31
+ end
32
+ end
33
+
34
+ def build_uniqueness
35
+ if @confs['case_sensitive'].nil?
36
+ @confs['unique']
37
+ elsif !@confs['case_sensitive']
38
+ { case_insensitive: true }
39
+ else
40
+ { case_insensitive: false }
41
+ end
42
+ end
43
+
44
+ def build_validations
45
+ {
46
+ presence: @confs['not_null'],
47
+ length: { minimum: @confs['min_size'], maximum: @confs['size'] }.compact_blank,
48
+ uniqueness: build_uniqueness,
49
+ format: { with: build_regex }.compact_blank
50
+ }.compact_blank
51
+ end
52
+
53
+ def apply_validations(klass)
54
+ validations = build_validations
55
+ klass.validates(name, validations) unless validations.empty?
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record'
4
+
5
+ require_relative 'model_migration'
6
+ require_relative 'field'
7
+ require_relative 'config'
8
+
9
+ module Kybus
10
+ module Nanorecord
11
+ class Schema
12
+ class Model
13
+ attr_reader :name, :configs, :fields
14
+
15
+ def initialize(model_name, table_schema)
16
+ @name = model_name.classify
17
+ @fields = (table_schema['fields'] || {}).to_h { |name, confs| [name, Field.new(name, confs)] }
18
+ @configs = Config.new(table_schema['configs'], self)
19
+ @migration = ModelMigration.new(model_name, @fields, {})
20
+ end
21
+
22
+ def apply_plugins!(global_hooks)
23
+ configs.plugins_config.each do |plugin|
24
+ Plugins::PluginProvider.apply!(plugin, self, global_hooks)
25
+ end
26
+ end
27
+
28
+ def build!
29
+ klass = Class.new(ActiveRecord::Base)
30
+ Object.const_set(name, klass)
31
+ @hooks.apply(:model, klass)
32
+ fields.each_value { |field| field.apply_validations(klass) }
33
+ klass
34
+ end
35
+
36
+ def hooks=(hooks)
37
+ @hooks = hooks
38
+ @migration.hooks = hooks
39
+ end
40
+
41
+ def build_migration!
42
+ @migration.build!
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ class Schema
6
+ class ModelMigration
7
+ extend Kybus::DRY::ResourceInjector
8
+ DEFAULT_MIGRATION_VERSION = 7.0
9
+
10
+ def self.configure_migration_version(version)
11
+ register(:migration_version, version)
12
+ end
13
+
14
+ attr_reader :name, :fields
15
+
16
+ attr_writer :hooks
17
+
18
+ def initialize(model_name, fields, _configs)
19
+ @name = model_name.tableize
20
+ @fields = fields
21
+ @migrations = []
22
+ end
23
+
24
+ def self.base_migration_class
25
+ ActiveRecord::Migration[unsafe_resource(:migration_version) || DEFAULT_MIGRATION_VERSION]
26
+ end
27
+
28
+ # rubocop: disable Metrics/MethodLength
29
+ # rubocop: disable Metrics/AbcSize
30
+ def build_class!
31
+ @migration_class = Class.new(self.class.base_migration_class) do
32
+ extend Kybus::DRY::ResourceInjector
33
+
34
+ def self.precedense
35
+ 0
36
+ end
37
+
38
+ def change
39
+ fields = self.class.resource(:fields)
40
+ name = self.class.resource(:name)
41
+ hooks = self.class.resource(:hooks)
42
+ create_table(name, if_not_exists: true) do |t|
43
+ fields.each { |f| t.column(f.name, f.type, **f.extra) }
44
+ hooks.apply(:create_table, t)
45
+ end
46
+ end
47
+ end
48
+
49
+ @migrations << @migration_class
50
+ end
51
+ # rubocop: enable Metrics/MethodLength Metrics/AbcSize
52
+ # rubocop: enable Metrics/AbcSize
53
+
54
+ def inject_hooks!
55
+ @migration_class.register(:fields, fields.values)
56
+ @migration_class.register(:name, name)
57
+ @migration_class.register(:hooks, @hooks)
58
+ end
59
+
60
+ def build_extra_migration!
61
+ return unless @hooks.has?(:post_table)
62
+
63
+ @extra_migation = Class.new(@migration_class) do
64
+ def self.precedense
65
+ 1
66
+ end
67
+
68
+ def change
69
+ hooks = self.class.superclass.resource(:hooks)
70
+ hooks.apply(:post_table, self)
71
+ end
72
+ end
73
+
74
+ @migrations << @extra_migation
75
+ end
76
+
77
+ def build!
78
+ build_class!
79
+ inject_hooks!
80
+ build_extra_migration!
81
+ @migrations
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'model_hooks'
4
+ require_relative 'schema/model'
5
+ require_relative 'controller/web_controllers'
6
+
7
+ module Kybus
8
+ module Nanorecord
9
+ class Schema
10
+ attr_reader :models
11
+
12
+ def initialize(conf)
13
+ @models = conf['schema']['models'].to_h { |name, fields| [name, Model.new(name, fields)] }
14
+ @hooks = ModelHooks.new(self)
15
+ @models.each { |name, model| model.hooks = @hooks.for_table(name) }
16
+ apply_plugins!
17
+ @controllers = Controller::WebControllers.new(conf.dig('schema', 'controllers', 'web'), self)
18
+ end
19
+
20
+ def apply_plugins!
21
+ @models.each_value { |model| model.apply_plugins!(@hooks) }
22
+ end
23
+
24
+ def self.load_file!(path)
25
+ conf = YAML.load_file(path)
26
+ new(conf)
27
+ end
28
+
29
+ def build_models
30
+ @models.map { |_, model| model.build! }
31
+ end
32
+
33
+ def build_controllers!
34
+ @controllers.build!
35
+ end
36
+
37
+ def build_model_migrations
38
+ @models.map { |_, model| model.build_migration! }.flatten.sort_by(&:precedense)
39
+ end
40
+
41
+ def run_migrations!
42
+ @migrations = build_model_migrations
43
+ @migrations.each { |m| m.migrate(:up) }
44
+ end
45
+
46
+ def build_classes!
47
+ build_models
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kybus
4
+ module Nanorecord
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kybus/dry/resource_injector'
4
+ require_relative 'nanorecord/schema'
5
+
6
+ module Kybus
7
+ module Nanorecord
8
+ def self.load_schema!(path)
9
+ Schema.load_file!(path)
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,313 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kybus-nanorecord
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gilberto Vargas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: kybus-core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: amazing_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
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: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
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.11'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.12'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.12'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack-minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.0'
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.3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '12.3'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rdoc
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '6.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '6.1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop-minitest
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop-performance
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-rake
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubycritic
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: simplecov
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.16'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '0.16'
237
+ - !ruby/object:Gem::Dependency
238
+ name: sqlite3
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: webmock
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '3.5'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '3.5'
265
+ description: Helps to create CRUD objects from a config
266
+ email:
267
+ - tachoguitar@gmail.com
268
+ executables: []
269
+ extensions: []
270
+ extra_rdoc_files: []
271
+ files:
272
+ - lib/kybus/nanorecord.rb
273
+ - lib/kybus/nanorecord/controller/crud_web_controller.rb
274
+ - lib/kybus/nanorecord/controller/web_controllers.rb
275
+ - lib/kybus/nanorecord/model_hooks.rb
276
+ - lib/kybus/nanorecord/plugins/base.rb
277
+ - lib/kybus/nanorecord/plugins/hook.rb
278
+ - lib/kybus/nanorecord/plugins/plugin_provider.rb
279
+ - lib/kybus/nanorecord/plugins/relationships.rb
280
+ - lib/kybus/nanorecord/plugins/secure_password.rb
281
+ - lib/kybus/nanorecord/plugins/timestamps.rb
282
+ - lib/kybus/nanorecord/plugins/validations.rb
283
+ - lib/kybus/nanorecord/schema.rb
284
+ - lib/kybus/nanorecord/schema/config.rb
285
+ - lib/kybus/nanorecord/schema/field.rb
286
+ - lib/kybus/nanorecord/schema/model.rb
287
+ - lib/kybus/nanorecord/schema/model_migration.rb
288
+ - lib/kybus/nanorecord/version.rb
289
+ homepage: https://github.com/tachomex/kybus
290
+ licenses:
291
+ - MIT
292
+ metadata:
293
+ rubygems_mfa_required: 'true'
294
+ post_install_message:
295
+ rdoc_options: []
296
+ require_paths:
297
+ - lib
298
+ required_ruby_version: !ruby/object:Gem::Requirement
299
+ requirements:
300
+ - - "~>"
301
+ - !ruby/object:Gem::Version
302
+ version: '3.1'
303
+ required_rubygems_version: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - ">="
306
+ - !ruby/object:Gem::Version
307
+ version: '0'
308
+ requirements: []
309
+ rubygems_version: 3.4.10
310
+ signing_key:
311
+ specification_version: 4
312
+ summary: Implements CRUD from yaml file using active record
313
+ test_files: []