hecks-domain 0.0.1
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/lib/adapters/adapters.rb +2 -0
- data/lib/adapters/resource_server/cli/cli.rb +1 -0
- data/lib/adapters/resource_server/cli/generate_resource_server.rb +25 -0
- data/lib/adapters/resource_server/cli/templates/resource_server/config.ru.tt +8 -0
- data/lib/adapters/resource_server/resource_server.rb +1 -0
- data/lib/adapters/sql_database/cli/cli.rb +3 -0
- data/lib/adapters/sql_database/cli/generate_domain_migrations.rb +33 -0
- data/lib/adapters/sql_database/cli/generate_sql_database.rb +35 -0
- data/lib/adapters/sql_database/cli/migration_builder.rb +51 -0
- data/lib/adapters/sql_database/cli/templates/migration.rb.tt +14 -0
- data/lib/adapters/sql_database/cli/templates/repository.rb.tt +24 -0
- data/lib/adapters/sql_database/cli/templates/sql_database/Gemfile +10 -0
- data/lib/adapters/sql_database/cli/templates/sql_database/Rakefile +15 -0
- data/lib/adapters/sql_database/commands/read/fetch_references.rb +58 -0
- data/lib/adapters/sql_database/commands/update/delete_references.rb +45 -0
- data/lib/adapters/sql_database/commands/update/link_to_references.rb +45 -0
- data/lib/adapters/sql_database/sql_database.rb +1 -0
- data/lib/cli/builder/aggregate_command_line_builder.rb +22 -0
- data/lib/cli/builder/builder.rb +3 -0
- data/lib/cli/builder/reference_command_line_builder.rb +23 -0
- data/lib/cli/builder/value_object_command_line_builder.rb +23 -0
- data/lib/cli/cli.rb +8 -0
- data/lib/cli/command_builder.rb +59 -0
- data/lib/cli/domain_object/assignment_template.rb +43 -0
- data/lib/cli/domain_object/option_formatter.rb +36 -0
- data/lib/cli/generate_domain_object.rb +71 -0
- data/lib/cli/new.rb +50 -0
- data/lib/cli/templates/aggregate/lib/domain/%name%/%head_name%.rb.tt +16 -0
- data/lib/cli/templates/aggregate/lib/domain/%name%/%name%.rb.tt +9 -0
- data/lib/cli/templates/aggregate/lib/domain/%name%/repository.rb.tt +41 -0
- data/lib/cli/templates/domain/%name%.gemspec.tt +12 -0
- data/lib/cli/templates/domain/Version +1 -0
- data/lib/cli/templates/domain/lib/%name%.rb.tt +21 -0
- data/lib/cli/templates/domain/spec/spec_helper.rb.tt +4 -0
- data/lib/cli/templates/reference/lib/domain/%module_name%/%file_name%.rb.tt +25 -0
- data/lib/cli/templates/value_object/lib/domain/%module_name%/%name%.rb.tt +24 -0
- data/lib/domain_builder/attribute.rb +60 -0
- data/lib/domain_builder/domain.rb +19 -0
- data/lib/domain_builder/domain_builder.rb +37 -0
- data/lib/domain_builder/domain_module.rb +28 -0
- data/lib/domain_builder/domain_object.rb +43 -0
- data/lib/domain_builder/head.rb +8 -0
- data/lib/domain_builder/reference.rb +19 -0
- data/lib/domain_builder/value.rb +8 -0
- data/lib/hecks-domain.rb +7 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0e407c46ded01180a5c47b3b779aa5f193509002
|
4
|
+
data.tar.gz: d36411b8e9533bc8a42d4e9c845ab61329fd05a7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d89bcd8761dab08e36ca8cab1ea1d7e42cd63be5685d826bae3ca2b5d4e16ea007de15c00770111d900bf5bc69a9eb24c9e5517f77329a28c6b40588e1fd308f
|
7
|
+
data.tar.gz: 852174b857cdbd06b0f5d68ee75f54d756988250163052ce9247a12f41c2b3fe2016f985c8863422dac157405483ae010846a6bc8877b87875f4bf71d5c22265
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'generate_resource_server'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
module ResourceServer
|
5
|
+
module CLI
|
6
|
+
class GenerateResourceServer < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
File.dirname(__FILE__) + '/templates/'
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_aggregate_folder
|
14
|
+
directory('resource_server', '.')
|
15
|
+
end
|
16
|
+
|
17
|
+
def domain
|
18
|
+
File.basename(Dir.getwd)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'cli/cli'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module CLI
|
6
|
+
class GenerateDomainMigrations < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
attr_writer :migration_builder
|
9
|
+
|
10
|
+
def load_domain_spec
|
11
|
+
load('../../Domain')
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.source_root
|
15
|
+
File.dirname(__FILE__) + '/templates/'
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_migration_file
|
19
|
+
@migration_builder = MigrationBuilder.new(self, DOMAIN)
|
20
|
+
@migration_builder.call
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def migration_builder
|
26
|
+
@migration_builder
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module CLI
|
6
|
+
class GenerateSQLDatabase < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
File.dirname(__FILE__) + '/templates/'
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_sql_database_folder
|
14
|
+
directory('sql_database', './adapters/sql_database')
|
15
|
+
end
|
16
|
+
|
17
|
+
def bundle
|
18
|
+
run 'bundle'
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def class_name
|
24
|
+
@class_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def domain_module_name
|
28
|
+
DOMAIN.name.camelize
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module CLI
|
6
|
+
class MigrationBuilder
|
7
|
+
def initialize(generator, specification)
|
8
|
+
@generator = generator
|
9
|
+
@schema = Hecks::Adapters::SQLDatabase::Schema.factory(specification)
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
generate_migrations
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def table_name
|
18
|
+
@table.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def columns
|
22
|
+
@table.columns
|
23
|
+
end
|
24
|
+
|
25
|
+
def tables
|
26
|
+
@schema.tables
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :generator
|
32
|
+
|
33
|
+
def file_name(index, object)
|
34
|
+
"#{index}_create_#{table_name}.rb"
|
35
|
+
end
|
36
|
+
|
37
|
+
def generate_migrations
|
38
|
+
tables.each.with_index(1) do |table, index|
|
39
|
+
@table = table
|
40
|
+
@generator.template(
|
41
|
+
"migration.rb.tt",
|
42
|
+
"db/migrate/" + file_name(index, table)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
up do
|
3
|
+
create_table(:<%= migration_builder.table_name %>) do
|
4
|
+
primary_key :id
|
5
|
+
<%- migration_builder.columns.each do |column| -%>
|
6
|
+
<%= column.type.camelcase %> :<%= column.name.to_sym %>, :null=>false
|
7
|
+
<%- end -%>
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
down do
|
12
|
+
drop_table(:<%= migration_builder.table_name %>)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module <%= domain_module_name %>
|
2
|
+
module Adapters
|
3
|
+
class SQLDatabase
|
4
|
+
module Repositories
|
5
|
+
class <%= class_name %>
|
6
|
+
def self.create attributes = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.update id, attributes
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.read id
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.delete id
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.delete_all
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Run migrations"
|
3
|
+
task :migrate, [:version] do |t, args|
|
4
|
+
require "sequel"
|
5
|
+
Sequel.extension :migration
|
6
|
+
db = Sequel.connect(ENV.fetch("DATABASE_URL"))
|
7
|
+
if args[:version]
|
8
|
+
puts "Migrating to version #{args[:version]}"
|
9
|
+
Sequel::Migrator.run(db, "db/migrate", target: args[:version].to_i)
|
10
|
+
else
|
11
|
+
puts "Migrating to latest"
|
12
|
+
Sequel::Migrator.run(db, "db/migrate")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module Commands
|
6
|
+
class Read
|
7
|
+
class FetchReferences
|
8
|
+
attr_reader :reference_map
|
9
|
+
def initialize(read_command)
|
10
|
+
@head = read_command.head
|
11
|
+
@reference_map = {}
|
12
|
+
@entity = read_command.entity
|
13
|
+
@table = read_command.table
|
14
|
+
@id = read_command.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
@head.references.each do |reference|
|
19
|
+
fetch_reference(reference)
|
20
|
+
fetch_references(reference)
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def fetch_reference(reference)
|
28
|
+
return if reference.list?
|
29
|
+
column = Column.factory(reference)
|
30
|
+
value = DB[column.to_table_name].first(id: @entity[column.to_foreign_key])
|
31
|
+
|
32
|
+
@entity.delete(column.to_foreign_key)
|
33
|
+
value.delete(:id)
|
34
|
+
@reference_map[column.name.to_sym] = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def fetch_references(reference)
|
38
|
+
return unless reference.list?
|
39
|
+
|
40
|
+
where_clause = {}
|
41
|
+
where_clause[@table.to_foreign_key.to_sym] = @id
|
42
|
+
column = Column.factory(reference)
|
43
|
+
|
44
|
+
@reference_map[column.name.to_sym] ||= []
|
45
|
+
|
46
|
+
DB[JoinTable(@table, reference).name.to_sym].where(where_clause).map do |record|
|
47
|
+
value_object = DB[column.to_table_name].first(id: record[column.to_foreign_key])
|
48
|
+
value_object.delete(:id)
|
49
|
+
@reference_map[column.name.to_sym] << value_object
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module Commands
|
6
|
+
class Update
|
7
|
+
class DeleteReferences
|
8
|
+
attr_reader :attributes
|
9
|
+
|
10
|
+
def initialize(table:, attributes:, reference:)
|
11
|
+
@table = table
|
12
|
+
@attributes = attributes
|
13
|
+
@reference = reference
|
14
|
+
@where_clause = {}
|
15
|
+
@dataset = DB[JoinTable.new(@table, @reference).name.to_sym]
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
build_where_clause
|
20
|
+
delete_references
|
21
|
+
remove_references_from_attributes
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def build_where_clause
|
28
|
+
DB[JoinTable.new(@table, @reference).name.to_sym]
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_references_from_attributes
|
32
|
+
@attributes.delete(@reference.name.to_sym)
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete_references
|
36
|
+
return unless @reference.list?
|
37
|
+
@dataset.where(@where_clause).delete
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module Adapters
|
4
|
+
class SQLDatabase
|
5
|
+
module Commands
|
6
|
+
class Update
|
7
|
+
class LinkToReferences
|
8
|
+
attr_reader :reference_ids
|
9
|
+
def initialize(reference:, table:, reference_ids:, attributes:)
|
10
|
+
@reference = reference
|
11
|
+
@reference_ids = reference_ids
|
12
|
+
@table = table
|
13
|
+
@attributes = attributes
|
14
|
+
@column = Column.factory(@reference)
|
15
|
+
@record = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
make_linking_records
|
20
|
+
make_foreign_keys
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def make_linking_records
|
27
|
+
return unless @reference.list?
|
28
|
+
@reference_ids[@reference.name.to_sym].each do |value|
|
29
|
+
@record[@column.to_foreign_key] = value
|
30
|
+
@record[@table.to_foreign_key] = @attributes[:id]
|
31
|
+
DB[JoinTable.new(@table, @reference).name.to_sym].insert(@record)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def make_foreign_keys
|
36
|
+
return if @reference.list?
|
37
|
+
@attributes[@column.to_foreign_key] = @reference_ids[@reference.name]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'cli/cli'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module CLI
|
4
|
+
class CommandBuilder
|
5
|
+
module AggregateCommandLineBuilder
|
6
|
+
def self.build(domain, runner)
|
7
|
+
domain.domain_modules.values.each do |domain_module|
|
8
|
+
runner.call(
|
9
|
+
[
|
10
|
+
'generate domain_object',
|
11
|
+
'-t', 'aggregate',
|
12
|
+
'-n', domain_module.name,
|
13
|
+
'--head_name', domain_module.head.name,
|
14
|
+
'-a', domain_module.head.attribute_string
|
15
|
+
])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module CLI
|
4
|
+
class CommandBuilder
|
5
|
+
module ReferenceCommandLineBuilder
|
6
|
+
def self.build(domain, runner)
|
7
|
+
domain.domain_modules.values.each do |domain_module|
|
8
|
+
domain_module.references.each do |reference|
|
9
|
+
runner.call([
|
10
|
+
'generate domain_object',
|
11
|
+
'-t', 'reference',
|
12
|
+
'-n', reference.name,
|
13
|
+
'-m', domain_module.name,
|
14
|
+
'-r', reference.referenced_entity
|
15
|
+
])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module CLI
|
4
|
+
class CommandBuilder
|
5
|
+
module ValueObjectCommandLineBuilder
|
6
|
+
def self.build(domain, runner)
|
7
|
+
domain.domain_modules.values.each do |domain_module|
|
8
|
+
(domain_module.objects - [domain_module.head]).each do |value_object|
|
9
|
+
runner.call([
|
10
|
+
'generate domain_object',
|
11
|
+
'-t', 'value_object',
|
12
|
+
'-n', value_object.name,
|
13
|
+
'-m', domain_module.name,
|
14
|
+
'-a', value_object.attribute_string
|
15
|
+
])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/cli/cli.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
require_relative 'generate_domain_object'
|
4
|
+
require_relative 'new'
|
5
|
+
require_relative 'builder/builder'
|
6
|
+
require_relative 'command_builder'
|
7
|
+
require_relative "domain_object/assignment_template"
|
8
|
+
require_relative "domain_object/option_formatter"
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hecks
|
4
|
+
module Domain
|
5
|
+
module CLI
|
6
|
+
class CommandBuilder
|
7
|
+
def initialize(name:, dry_run: false)
|
8
|
+
@name = name
|
9
|
+
@domain = DOMAIN
|
10
|
+
@dry_run = dry_run
|
11
|
+
@runner = CommandRunner.new(domain, name, dry_run)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
delete_tmpfile
|
16
|
+
puts "\n"
|
17
|
+
generate :domain
|
18
|
+
generate :modules
|
19
|
+
generate :value_objects
|
20
|
+
generate :references
|
21
|
+
execute_tmpfile && return unless @dry_run
|
22
|
+
print_tmpfile
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :runner, :name, :domain
|
28
|
+
|
29
|
+
def print_tmpfile
|
30
|
+
puts File.read('tmp/hecks')
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_tmpfile
|
34
|
+
return unless Pathname('tmp/hecks').exist?
|
35
|
+
FileUtils.rm('tmp/hecks')
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute_tmpfile
|
39
|
+
exec('bash -x tmp/hecks')
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate(command)
|
43
|
+
case command
|
44
|
+
when :references
|
45
|
+
ReferenceCommandLineBuilder.build(domain, runner)
|
46
|
+
when :domain
|
47
|
+
runner.call(['new', '-n', name])
|
48
|
+
when :modules
|
49
|
+
AggregateCommandLineBuilder.build(domain, runner)
|
50
|
+
when :value_objects
|
51
|
+
ValueObjectCommandLineBuilder.build(domain, runner)
|
52
|
+
else
|
53
|
+
raise "unrecognized command: #{command}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module CLI
|
4
|
+
class GenerateDomainObject
|
5
|
+
class AssignmentTemplate
|
6
|
+
def initialize(attributes)
|
7
|
+
@attributes = attributes
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
attributes.map do |attribute|
|
12
|
+
@attribute = Hecks::Domain::DomainBuilder::Attribute.new(attribute)
|
13
|
+
do_assignment
|
14
|
+
end.join("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :attributes, :attribute
|
20
|
+
|
21
|
+
def do_assignment
|
22
|
+
return value_assignment if Hecks::Domain::DomainBuilder::Types.values.include?(@attribute.type)
|
23
|
+
return value_assignment if @attribute.type == 'Value'
|
24
|
+
return reference_factory_assignment if attribute.domain_module
|
25
|
+
return factory_assignment
|
26
|
+
end
|
27
|
+
|
28
|
+
def reference_factory_assignment
|
29
|
+
"@#{attribute.name} = #{attribute.type}Reference.factory(#{attribute.name})"
|
30
|
+
end
|
31
|
+
|
32
|
+
def factory_assignment
|
33
|
+
"@#{attribute.name} = #{attribute.type}.factory(#{attribute.name})"
|
34
|
+
end
|
35
|
+
|
36
|
+
def value_assignment
|
37
|
+
"@#{attribute.name} = #{attribute.name}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
module CLI
|
4
|
+
class GenerateDomainObject
|
5
|
+
class OptionFormatter
|
6
|
+
def initialize(attributes)
|
7
|
+
@attributes = attributes.map do |attribute|
|
8
|
+
Hecks::Domain::DomainBuilder::Attribute.new(attribute)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(format, include_id: false)
|
13
|
+
case format
|
14
|
+
when 'keys_and_values'
|
15
|
+
attributes(include_id).map { |attribute| (attribute.name + ': ' + attribute.name) }.join(', ')
|
16
|
+
when 'attribute_string'
|
17
|
+
attributes(include_id).map { |attribute| ':' + attribute.name }.join ', '
|
18
|
+
when 'param_names'
|
19
|
+
attributes(include_id).map { |attribute| attribute.name + ':' }.join ', '
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def attributes(include_id)
|
26
|
+
if include_id
|
27
|
+
@attributes + [Hecks::Domain::DomainBuilder::Attribute.new('id:value')]
|
28
|
+
else
|
29
|
+
@attributes
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hecks
|
3
|
+
module Domain
|
4
|
+
module CLI
|
5
|
+
class GenerateDomainObject < Thor::Group
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
class_option :head_name, aliases: '-h', desc: 'the name of the aggregate head'
|
9
|
+
class_option :attributes, aliases: '-a', type: :array, desc: 'attributes for the aggregate head'
|
10
|
+
class_option :name, aliases: '-n', desc: 'attributes for the aggregate head'
|
11
|
+
class_option :type, aliases: '-t', desc: 'The type of domain object you want to create'
|
12
|
+
class_option :module_name, aliases: '-m', desc: 'Domain Module'
|
13
|
+
class_option :referenced_entity, aliases: '-r', desc: 'Referenced Entity'
|
14
|
+
|
15
|
+
def self.source_root
|
16
|
+
File.dirname(__FILE__) + '/templates'
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_aggregate_folder
|
20
|
+
directory(options[:type].to_s, '.')
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def assignment_template(attributes)
|
26
|
+
AssignmentTemplate.new(attributes).render
|
27
|
+
end
|
28
|
+
|
29
|
+
def option_format(format, include_id: false)
|
30
|
+
OptionFormatter.new(options[:attributes]).call(format, include_id: include_id)
|
31
|
+
end
|
32
|
+
|
33
|
+
def head_name
|
34
|
+
options[:head_name]
|
35
|
+
end
|
36
|
+
|
37
|
+
def name
|
38
|
+
options[:name]
|
39
|
+
end
|
40
|
+
|
41
|
+
def file_name
|
42
|
+
name.underscore
|
43
|
+
end
|
44
|
+
|
45
|
+
def attribute_names_without_id
|
46
|
+
attributes_without_id.map(&:name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def module_name
|
50
|
+
options[:module_name]
|
51
|
+
end
|
52
|
+
|
53
|
+
def domain_name
|
54
|
+
Dir.pwd.split('/').last
|
55
|
+
end
|
56
|
+
|
57
|
+
def attributes_without_id_as_string
|
58
|
+
attributes_without_id.map { |attribute| ':' + Hecks::Domain::DomainBuilder::Attribute.new(attribute).name }.join ', '
|
59
|
+
end
|
60
|
+
|
61
|
+
def attributes
|
62
|
+
options[:attributes] + ['id:integer']
|
63
|
+
end
|
64
|
+
|
65
|
+
def attributes_without_id
|
66
|
+
options[:attributes]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/cli/new.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
load('Domain') if File.exist?('Domain')
|
3
|
+
module Hecks
|
4
|
+
module Domain
|
5
|
+
module CLI
|
6
|
+
class New < Thor::Group
|
7
|
+
namespace :hecks
|
8
|
+
include Thor::Actions
|
9
|
+
|
10
|
+
class_option :nobuilder, aliases: '-n', desc: 'load schema from builder'
|
11
|
+
class_option :dry_run, aliases: '-d', desc: 'Use when specifying a schema file to output the commands, without running them'
|
12
|
+
|
13
|
+
def self.source_root
|
14
|
+
File.dirname(__FILE__)
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_from_builder
|
18
|
+
return if options[:nobuilder]
|
19
|
+
CommandBuilder.new(
|
20
|
+
name: File.basename(Dir.getwd),
|
21
|
+
dry_run: !options[:dry_run].nil?
|
22
|
+
).call
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_hexagon_folder
|
26
|
+
return unless options[:nobuilder]
|
27
|
+
directory('templates/domain', ".")
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def name
|
33
|
+
File.basename(Dir.getwd)
|
34
|
+
end
|
35
|
+
|
36
|
+
def module_name
|
37
|
+
name.camelize
|
38
|
+
end
|
39
|
+
|
40
|
+
def domain_module_name
|
41
|
+
domain_name.camelize
|
42
|
+
end
|
43
|
+
|
44
|
+
def condensed_module_name
|
45
|
+
name.delete('_')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module <%= domain_name.camelize %>
|
2
|
+
module Domain
|
3
|
+
module <%= name.camelize %>
|
4
|
+
class <%= options[:head_name].camelize %>
|
5
|
+
attr_accessor <%= option_format('attribute_string', include_id: true) %>
|
6
|
+
def initialize(<%= option_format('param_names', include_id: true) %>)
|
7
|
+
<%= assignment_template(attributes) %>
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_json
|
11
|
+
JSON.generate(<%= option_format('keys_and_values', include_id: true) %>)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module <%= domain_name.camelize %>
|
2
|
+
module Domain
|
3
|
+
module <%= name.camelize %>
|
4
|
+
class Repository
|
5
|
+
@collection = {}
|
6
|
+
@last_id = 0
|
7
|
+
|
8
|
+
def self.create attributes={}
|
9
|
+
id = @last_id + 1
|
10
|
+
@collection[id] = <%= options[:head_name].camelize %>.new(attributes.merge(id: id))
|
11
|
+
@last_id = id
|
12
|
+
Struct.new(:id).new(id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.update id, attributes
|
16
|
+
entity = read id
|
17
|
+
|
18
|
+
return unless entity
|
19
|
+
attributes.each do |field, value|
|
20
|
+
entity.send("#{field}=", value)
|
21
|
+
end
|
22
|
+
|
23
|
+
entity
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.read id
|
27
|
+
@collection[id]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.delete(id)
|
31
|
+
@collection.delete(id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.delete_all
|
35
|
+
@collection = {}
|
36
|
+
@last_id = 0
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = '<%= name %>'
|
3
|
+
s.homepage = ""
|
4
|
+
s.version = File.read('Version').gsub("\n", '')
|
5
|
+
s.date = '2016-09-12'
|
6
|
+
s.summary = "Summary"
|
7
|
+
s.description = "Description"
|
8
|
+
s.authors = ["Author"]
|
9
|
+
s.email = 'email@example.com'
|
10
|
+
s.files = Dir["lib/**/*"]
|
11
|
+
s.license = 'MIT'
|
12
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module <%= module_name %>
|
2
|
+
Dir[File.dirname(__FILE__) + "/domain/**/*.rb"].each {|file| require file}
|
3
|
+
|
4
|
+
def self.domain_modules
|
5
|
+
Domain.constants.map { |name| Domain.const_get(name)}
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.repositories
|
9
|
+
domain_modules.map do |domain_module|
|
10
|
+
[module_name(domain_module), domain_module.const_get(:Repository)]
|
11
|
+
end.to_h
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.module_name(domain_module)
|
15
|
+
domain_module.to_s.downcase.split("::").last.to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.spec_path
|
19
|
+
File.dirname(__FILE__) + '/../Domain'
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module <%= domain_name.camelize %>
|
2
|
+
module Domain
|
3
|
+
module <%= module_name.camelize %>
|
4
|
+
class <%= name.camelize %>
|
5
|
+
attr_accessor :id, :referenced_entity
|
6
|
+
|
7
|
+
def self.factory(group_attributes)
|
8
|
+
return <%= name.camelize %>.new(group_attributes) unless group_attributes.is_a?(Array)
|
9
|
+
group_attributes.map do |attributes|
|
10
|
+
<%= name.camelize %>.new(attributes)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(id:)
|
15
|
+
@id = id
|
16
|
+
@referenced_entity = <%= options[:referenced_entity] %>
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json(config)
|
20
|
+
JSON.generate({id: @id, referenced_entity: @referenced_entity})
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module <%= domain_name.camelize %>
|
2
|
+
module Domain
|
3
|
+
module <%= module_name.camelize %>
|
4
|
+
class <%= name.camelize %>
|
5
|
+
attr_accessor <%= attributes_without_id_as_string %>
|
6
|
+
|
7
|
+
def self.factory(group_attributes)
|
8
|
+
return <%= name.camelize %>.new(group_attributes) unless group_attributes.is_a?(Array)
|
9
|
+
group_attributes.map do |attributes|
|
10
|
+
<%= name.camelize %>.new(attributes)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(<%= option_format('param_names') %>)
|
15
|
+
<%= assignment_template(attributes_without_id) %>
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_json(config)
|
19
|
+
JSON.generate(<%= option_format('keys_and_values') %>)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
class DomainBuilder
|
4
|
+
class Attribute
|
5
|
+
attr_writer :type
|
6
|
+
attr_reader :object_name
|
7
|
+
|
8
|
+
def initialize(string)
|
9
|
+
@string = string
|
10
|
+
@object_name = object_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def list?
|
14
|
+
@string.include?("[")
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
@string.split(":").first
|
19
|
+
end
|
20
|
+
|
21
|
+
def type
|
22
|
+
return @type if @type
|
23
|
+
@string.split(":").last.delete("[").delete("]").camelize
|
24
|
+
end
|
25
|
+
|
26
|
+
def domain_module
|
27
|
+
return unless @string.include?("::")
|
28
|
+
@string.split("::").first.split(":").last.camelize
|
29
|
+
end
|
30
|
+
|
31
|
+
def copy(new_values={})
|
32
|
+
result = self.class.new(@string)
|
33
|
+
result.type = new_values[:type] if new_values[:type]
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
def reference?
|
38
|
+
!primitive? && !list?
|
39
|
+
end
|
40
|
+
|
41
|
+
def referenced_object
|
42
|
+
return unless reference?
|
43
|
+
return @string.split("::").last if @string.include?("::")
|
44
|
+
@string.split(":").last
|
45
|
+
end
|
46
|
+
|
47
|
+
def primitive?
|
48
|
+
['String', 'Integer', 'Currency'].include?(type)
|
49
|
+
end
|
50
|
+
|
51
|
+
def ==(other)
|
52
|
+
return false if other.name != name
|
53
|
+
return false if other.type != type
|
54
|
+
return false if other.domain_module != domain_module
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
class DomainBuilder
|
4
|
+
class Domain
|
5
|
+
attr_reader :domain_modules, :name
|
6
|
+
def initialize(name:)
|
7
|
+
@name = name
|
8
|
+
@domain_modules = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def module(name, &block)
|
12
|
+
result = DomainModule.new(name: name)
|
13
|
+
@domain_modules[name.to_sym] = result
|
14
|
+
yield(result)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'attribute'
|
2
|
+
require_relative 'domain'
|
3
|
+
require_relative 'domain_module'
|
4
|
+
require_relative 'domain_object'
|
5
|
+
require_relative 'value'
|
6
|
+
require_relative 'head'
|
7
|
+
require_relative 'reference'
|
8
|
+
|
9
|
+
module Hecks
|
10
|
+
module Domain
|
11
|
+
class DomainBuilder
|
12
|
+
Types = { string: 'String', integer: 'Integer', currency: 'Currency'}
|
13
|
+
|
14
|
+
attr_accessor :domain, :specification, :name
|
15
|
+
|
16
|
+
def initialize(domain_name:, &block)
|
17
|
+
@name = domain_name
|
18
|
+
@domain = Domain.new(name: domain_name)
|
19
|
+
block.yield(@domain)
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def domain_modules
|
24
|
+
@domain.domain_modules
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](module_name)
|
28
|
+
domain_modules[module_name]
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def self.build(domain_name, &block)
|
33
|
+
new(domain_name: domain_name, &block)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
class DomainBuilder
|
4
|
+
class DomainModule
|
5
|
+
attr_reader :objects, :name, :references
|
6
|
+
|
7
|
+
def initialize(name:)
|
8
|
+
@name = name
|
9
|
+
@objects = []
|
10
|
+
@references = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def head(name=nil)
|
14
|
+
return (@objects << Head.new(name: name)).last if name
|
15
|
+
objects.find{ |o| o.is_a?(Head) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def value(name)
|
19
|
+
(@objects << Value.new(name: name)).last
|
20
|
+
end
|
21
|
+
|
22
|
+
def reference(name)
|
23
|
+
(@references << Reference.new(name)).last
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
class DomainBuilder
|
4
|
+
class DomainObject
|
5
|
+
attr_reader :name, :attributes
|
6
|
+
|
7
|
+
def initialize(name:)
|
8
|
+
@name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
def attributes(*values)
|
12
|
+
return @attributes if @attributes
|
13
|
+
@attributes = values.map { |value| Hecks::Domain::DomainBuilder::Attribute.new(value) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def attribute_hash
|
17
|
+
attributes.map do |attribute|
|
18
|
+
[attribute.name.to_sym, type_with_domain_module(attribute)]
|
19
|
+
end.to_h
|
20
|
+
end
|
21
|
+
|
22
|
+
def attribute_string
|
23
|
+
attributes.map do |attribute|
|
24
|
+
[attribute.name, type_with_domain_module(attribute)].join(':')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def references
|
29
|
+
@attributes.reject(&:primitive?)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def type_with_domain_module(attribute)
|
35
|
+
type = DomainBuilder::Types.values.include?(attribute.type) ? "Value" : attribute.type
|
36
|
+
type = '[' + type + ']' if attribute.list?
|
37
|
+
return type unless attribute.domain_module
|
38
|
+
[attribute.domain_module, type].join("::")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Hecks
|
2
|
+
module Domain
|
3
|
+
class DomainBuilder
|
4
|
+
class Reference
|
5
|
+
def initialize(reference)
|
6
|
+
@reference = reference
|
7
|
+
end
|
8
|
+
|
9
|
+
def referenced_entity
|
10
|
+
@reference.split("::").map(&:camelcase).join("::")
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
@reference.split("::").last.camelcase + "Reference"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/hecks-domain.rb
ADDED
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hecks-domain
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Young
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hecks-adatpers-sql-database
|
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
|
+
description: Make the Domain the center of your programming world
|
28
|
+
email: chris@example.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/adapters/adapters.rb
|
34
|
+
- lib/adapters/resource_server/cli/cli.rb
|
35
|
+
- lib/adapters/resource_server/cli/generate_resource_server.rb
|
36
|
+
- lib/adapters/resource_server/cli/templates/resource_server/config.ru.tt
|
37
|
+
- lib/adapters/resource_server/resource_server.rb
|
38
|
+
- lib/adapters/sql_database/cli/cli.rb
|
39
|
+
- lib/adapters/sql_database/cli/generate_domain_migrations.rb
|
40
|
+
- lib/adapters/sql_database/cli/generate_sql_database.rb
|
41
|
+
- lib/adapters/sql_database/cli/migration_builder.rb
|
42
|
+
- lib/adapters/sql_database/cli/templates/migration.rb.tt
|
43
|
+
- lib/adapters/sql_database/cli/templates/repository.rb.tt
|
44
|
+
- lib/adapters/sql_database/cli/templates/sql_database/Gemfile
|
45
|
+
- lib/adapters/sql_database/cli/templates/sql_database/Rakefile
|
46
|
+
- lib/adapters/sql_database/commands/read/fetch_references.rb
|
47
|
+
- lib/adapters/sql_database/commands/update/delete_references.rb
|
48
|
+
- lib/adapters/sql_database/commands/update/link_to_references.rb
|
49
|
+
- lib/adapters/sql_database/sql_database.rb
|
50
|
+
- lib/cli/builder/aggregate_command_line_builder.rb
|
51
|
+
- lib/cli/builder/builder.rb
|
52
|
+
- lib/cli/builder/reference_command_line_builder.rb
|
53
|
+
- lib/cli/builder/value_object_command_line_builder.rb
|
54
|
+
- lib/cli/cli.rb
|
55
|
+
- lib/cli/command_builder.rb
|
56
|
+
- lib/cli/domain_object/assignment_template.rb
|
57
|
+
- lib/cli/domain_object/option_formatter.rb
|
58
|
+
- lib/cli/generate_domain_object.rb
|
59
|
+
- lib/cli/new.rb
|
60
|
+
- lib/cli/templates/aggregate/lib/domain/%name%/%head_name%.rb.tt
|
61
|
+
- lib/cli/templates/aggregate/lib/domain/%name%/%name%.rb.tt
|
62
|
+
- lib/cli/templates/aggregate/lib/domain/%name%/repository.rb.tt
|
63
|
+
- lib/cli/templates/domain/%name%.gemspec.tt
|
64
|
+
- lib/cli/templates/domain/Version
|
65
|
+
- lib/cli/templates/domain/lib/%name%.rb.tt
|
66
|
+
- lib/cli/templates/domain/spec/spec_helper.rb.tt
|
67
|
+
- lib/cli/templates/reference/lib/domain/%module_name%/%file_name%.rb.tt
|
68
|
+
- lib/cli/templates/value_object/lib/domain/%module_name%/%name%.rb.tt
|
69
|
+
- lib/domain_builder/attribute.rb
|
70
|
+
- lib/domain_builder/domain.rb
|
71
|
+
- lib/domain_builder/domain_builder.rb
|
72
|
+
- lib/domain_builder/domain_module.rb
|
73
|
+
- lib/domain_builder/domain_object.rb
|
74
|
+
- lib/domain_builder/head.rb
|
75
|
+
- lib/domain_builder/reference.rb
|
76
|
+
- lib/domain_builder/value.rb
|
77
|
+
- lib/hecks-domain.rb
|
78
|
+
homepage: https://github.com/chrisyoung/hecks-domain
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.6.10
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: DDD and Hexagonal Code Generators
|
102
|
+
test_files: []
|