tkxs-component-generator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/executable/tkxs-component-generator +6 -0
  3. data/lib/command_line/component_generator/commands/component.rb +59 -0
  4. data/lib/command_line/component_generator/interface.rb +7 -0
  5. data/lib/command_line/component_generator.rb +9 -0
  6. data/source/%component_name%.gemspec.tt +28 -0
  7. data/source/.circleci/config.yml +141 -0
  8. data/source/.gitignore +18 -0
  9. data/source/.rspec.tt +2 -0
  10. data/source/.rubocop.yml.tt +110 -0
  11. data/source/CHANGELOG.md +26 -0
  12. data/source/Dockerfile.tt +21 -0
  13. data/source/Guardfile.tt +26 -0
  14. data/source/README.md.tt +5 -0
  15. data/source/Rakefile.tt +35 -0
  16. data/source/VERSION +1 -0
  17. data/source/bin/release +9 -0
  18. data/source/bin/setup.tt +4 -0
  19. data/source/bin/start.tt +10 -0
  20. data/source/config/pgadmin_servers.json.tt +13 -0
  21. data/source/docker-compose.yml.tt +72 -0
  22. data/source/gems.rb.tt +6 -0
  23. data/source/lib/%component_name%/%entity_name%.rb.tt +14 -0
  24. data/source/lib/%component_name%/consumers/commands.rb.tt +11 -0
  25. data/source/lib/%component_name%/consumers/events.rb.tt +11 -0
  26. data/source/lib/%component_name%/handlers/commands.rb.tt +49 -0
  27. data/source/lib/%component_name%/handlers/events.rb.tt +21 -0
  28. data/source/lib/%component_name%/messages/commands/.empty_directory +0 -0
  29. data/source/lib/%component_name%/messages/events/.empty_directory +0 -0
  30. data/source/lib/%component_name%/projection.rb.tt +24 -0
  31. data/source/lib/%component_name%/start.rb.tt +10 -0
  32. data/source/lib/%component_name%/store.rb.tt +15 -0
  33. data/source/lib/%component_name%.rb.tt +17 -0
  34. data/source/secrets.env.example +4 -0
  35. data/source/spec/%component_name%/%component_name%_spec.rb.tt +5 -0
  36. data/source/spec/spec_helper.rb.tt +34 -0
  37. data/source/spec/support/.keep.tt +0 -0
  38. metadata +107 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 68ab994fc0ea224422b2282e7105da3954cdea553f0c640fb73a9500b129bb0e
4
+ data.tar.gz: 23f8dbe9691a8f1d59f666f31585ebed21c66e1ab819ef76ae7468f9ae105020
5
+ SHA512:
6
+ metadata.gz: ac3f45cc3a4c9493b4b2b6b36e4a889740a34376162675b7f37ea569ea7b30c87fc530059f40bf4103c340fe922dbf8b2777d2eecc02661b0d1ee916af11b645
7
+ data.tar.gz: e2a59ad8300a3e775816dd9e36b3e019ae057abff264ff867e1d01121f82a3ad7e429b16c95cc079e5d13865e21257966479862a602ceb6a2705f3c632862dca
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'command_line/component_generator'
@@ -0,0 +1,59 @@
1
+ module CommandLine
2
+ module ComponentGenerator
3
+ module Commands
4
+ class Component < Thor::Group
5
+ include Thor::Actions
6
+
7
+ argument :name
8
+
9
+ def component_name
10
+ @component_name ||= name.end_with?('_component') ? name : "#{name}_component"
11
+ end
12
+
13
+ def component_root_dir_name
14
+ @component_dir_name ||= component_name.gsub('_','-')
15
+ end
16
+
17
+ def component_constant_name
18
+ @component_constant_name ||= Casing::Pascal.(component_name)
19
+ end
20
+
21
+ def entity_name
22
+ @entity_name ||= Casing::Underscore.(entity_constant_name)
23
+ end
24
+
25
+ def entity_stream_name
26
+ @entity_stream_name ||= Casing::Camel.(entity_name)
27
+ end
28
+
29
+ def entity_constant_name
30
+ @entity_constant_name ||= Casing::Pascal.(component_name.gsub('_component', ''))
31
+ end
32
+
33
+ def service_name
34
+ @service_name ||= entity_name.gsub('_', '-')
35
+ end
36
+
37
+ def self.source_root
38
+ File.dirname(__FILE__) + '/../../../../source'
39
+ end
40
+
41
+ def initialize(args=[], options={}, config={})
42
+ super
43
+ self.destination_root = component_root_dir_name
44
+ end
45
+
46
+ def generate_component
47
+ directory('./')
48
+ end
49
+
50
+ def assign_executable_attribute
51
+ chmod 'bin/release', 0755
52
+ chmod 'bin/setup', 0755
53
+ chmod 'bin/start', 0755
54
+ chmod 'Rakefile', 0755
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,7 @@
1
+ module CommandLine
2
+ module ComponentGenerator
3
+ class Interface < Thor
4
+ register(CommandLine::ComponentGenerator::Commands::Component, 'component', 'component NAME', 'Generates a new Eventide component')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+
4
+ require 'casing'
5
+
6
+ require 'command_line/component_generator/commands/component'
7
+ require 'command_line/component_generator/interface'
8
+
9
+ CommandLine::ComponentGenerator::Interface.start(ARGV)
@@ -0,0 +1,28 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = '<%= component_name %>'
6
+ spec.version = File.read('VERSION')
7
+ spec.summary = ' '
8
+ spec.description = ' '
9
+
10
+ spec.authors = ['email@domain.com']
11
+ spec.homepage = 'http://tkxs.com'
12
+ spec.licenses = ['TODO']
13
+
14
+ # Prevent pushing this gem to RubyGems.org, allow Gemfury
15
+ spec.metadata['allowed_push_host'] = 'http://gemfury.com'
16
+
17
+ spec.require_paths = ['lib']
18
+ spec.files = Dir.glob('{lib}/**/*')
19
+ spec.platform = Gem::Platform::RUBY
20
+ spec.required_ruby_version = '>= 2.6'
21
+
22
+ spec.add_runtime_dependency 'tkxs-components'
23
+
24
+ spec.add_development_dependency 'guard-rspec'
25
+ spec.add_development_dependency 'guard-rubocop'
26
+ spec.add_development_dependency 'pry'
27
+ spec.add_development_dependency 'simplecov'
28
+ end
@@ -0,0 +1,141 @@
1
+ version: 2.0
2
+
3
+ references:
4
+ image_ruby: &image_ruby
5
+ ruby:2.6
6
+ # image_postgres: &image_postgres
7
+ # postgres:11-alpine
8
+
9
+ cache_key_bundle: &cache_key_bundle
10
+ v1-bundle-{{ checksum "gems.rb" }}
11
+ cache_key_backup_bundle: &cache_key_backup_bundle
12
+ v1-bundle-
13
+ cache_path_bundle: &cache_path_bundle
14
+ /usr/local/bundle
15
+ restore_cache_bundle: &restore_cache_bundle
16
+ restore_cache:
17
+ keys:
18
+ - *cache_key_bundle
19
+ - *cache_key_backup_bundle
20
+
21
+ cache_key_git: &cache_key_git
22
+ v1-git-{{ .Environment.CIRCLE_SHA1 }}
23
+ cache_key_backup_git: &cache_key_backup_git
24
+ v1-git-
25
+ cache_path_git: &cache_path_git
26
+ /usr/src/app
27
+ restore_cache_git: &restore_cache_git
28
+ restore_cache:
29
+ keys:
30
+ - *cache_key_git
31
+ - *cache_key_backup_git
32
+
33
+ jobs:
34
+ checkout_code:
35
+ docker:
36
+ - image: *image_ruby
37
+ working_directory: /usr/src/app
38
+ steps:
39
+ - checkout
40
+ # - run:
41
+ # name: Decrypt secrets
42
+ # command: |
43
+ # echo $KEY > secrets.aes
44
+ # openssl enc \
45
+ # -in .circleci/secrets.encrypted \
46
+ # -out secrets.env \
47
+ # -d -aes256 \
48
+ # -pass file:secrets.aes
49
+ - save_cache:
50
+ key: *cache_key_git
51
+ paths:
52
+ - *cache_path_git
53
+
54
+ run_bundle:
55
+ docker:
56
+ - image: *image_ruby
57
+ working_directory: /usr/src/app
58
+ steps:
59
+ - *restore_cache_git
60
+ - *restore_cache_bundle
61
+ - run:
62
+ name: Bundle
63
+ command: |
64
+ export BUNDLER_VERSION=2.0.1
65
+ gem install bundler
66
+ bundle check || \
67
+ bundle install -j5 && \
68
+ bundle clean
69
+ rm -f gems.locked
70
+ - save_cache:
71
+ key: *cache_key_bundle
72
+ paths:
73
+ - *cache_path_bundle
74
+
75
+ setup_and_test:
76
+ docker:
77
+ - image: *image_ruby
78
+ environment:
79
+ # EVENT_STORE_DATABASE_URL: postgresql://message_store@localhost:5432/message_store
80
+ LOG_LEVEL: "error"
81
+ # - image: *image_postgres
82
+ working_directory: /usr/src/app
83
+ steps:
84
+ - *restore_cache_git
85
+ - *restore_cache_bundle
86
+ - run:
87
+ name: Code Climate Test Reporter
88
+ command: |
89
+ cc_download_url=https://codeclimate.com/downloads/test-reporter/
90
+ curl -L $cc_download_url/test-reporter-latest-linux-amd64 > ./cc
91
+ chmod +x ./cc
92
+ - run:
93
+ name: Apt
94
+ command: |
95
+ # apt-get update -y
96
+ # apt-get install -y --no-install-recommends \
97
+ # postgresql-client \
98
+ # libsybdb5
99
+ - run:
100
+ name: Setup
101
+ command: |
102
+ # export VIEW_DATA_DATABASE_URL=postgresql://postgres@localhost:5432/cache_db
103
+ # export EVENT_STORE_DATABASE_URL=postgresql://postgres@localhost:5432/message_store
104
+
105
+ # cd ./tkxs_components/
106
+ # cp -R ./db/config/. .
107
+
108
+ # export DATABASE=event_store
109
+ # rake db:create db:migrate-event-store
110
+
111
+ # export DATABASE=view_data
112
+ # rake db:create db:migrate-view-data-prerequisites
113
+
114
+ # export DATABASE_URL=postgresql://postgres@localhost:5432/cache_db
115
+ # cd ..
116
+ # rake db:migrate-all-components
117
+ - run:
118
+ name: Test
119
+ command: |
120
+ export BUNDLER_VERSION=2.0.1
121
+ # export EVENT_STORE_DATABASE_URL=postgresql://postgres@localhost:5432/message_store
122
+ # # notify code climate that a build is starting
123
+ ./cc before-build
124
+ # run the specs
125
+ rake ci
126
+ # notify code climate build is finished
127
+ ./cc after-build -t simplecov
128
+ - store_artifacts:
129
+ path: ./coverage
130
+
131
+ workflows:
132
+ version: 2
133
+ build_test:
134
+ jobs:
135
+ - checkout_code
136
+ - run_bundle:
137
+ requires:
138
+ - checkout_code
139
+ - setup_and_test:
140
+ requires:
141
+ - run_bundle
data/source/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ gems.locked
2
+ *.gem
3
+ gems
4
+
5
+ /tmp
6
+ /log
7
+ /coverage
8
+ **/pkg
9
+
10
+ spec/examples.txt
11
+ db/schema.rb
12
+
13
+ secrets.aes
14
+ secrets.env
15
+
16
+ .DS_Store
17
+ .rspec-local
18
+ .idea/
data/source/.rspec.tt ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,110 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.6
3
+ Exclude:
4
+ - bin/**
5
+ - tmp/**
6
+ - ./**/db/schema.rb
7
+
8
+ Documentation:
9
+ # don't require classes to be documented
10
+ Enabled: false
11
+
12
+ Encoding:
13
+ # no need to always specify encoding
14
+ Enabled: false
15
+
16
+ Style/NumericPredicate:
17
+ # The following is a false positive for specs:
18
+ #
19
+ # "Use be.positive? instead of be > 0."
20
+ Exclude:
21
+ - 'spec/**/*'
22
+
23
+ Metrics/BlockLength:
24
+ # Certain DSL use blocks and can be lengthy
25
+ Exclude:
26
+ - 'spec/**/*'
27
+ - '*.gemspec'
28
+ - 'Guardfile'
29
+
30
+ AlignParameters:
31
+ # allow for multi-line methods to have normal indentation.
32
+ # for example:
33
+ #
34
+ # Person.where(
35
+ # first_name: 'tom',
36
+ # last_name: 'foolery'
37
+ # )
38
+ EnforcedStyle: with_fixed_indentation
39
+
40
+ # Disabling this is not desirable however a change in RuboCop v0.60.0 has made
41
+ # this cop overly restrictive. Watch for an update here:
42
+ # https://github.com/rubocop-hq/rubocop/issues/6410
43
+ Layout/AlignHash:
44
+ Enabled: false
45
+
46
+ Layout/AlignParameters:
47
+ # allow for end of if to be aligned with a variable.
48
+ # for example:
49
+ #
50
+ # foo = if a == b
51
+ # 'bar'
52
+ # else
53
+ # 'baz'
54
+ # end
55
+ EnforcedStyle: with_fixed_indentation
56
+
57
+ Layout/MultilineMethodCallIndentation:
58
+ # allow for multi-line method chaining to have normal indentation.
59
+ # for example:
60
+ #
61
+ # Person
62
+ # .where(first_name: 'tom')
63
+ # .not(last_name: 'foolery')
64
+ EnforcedStyle: indented
65
+
66
+ Style/RaiseArgs:
67
+ Enabled: false
68
+
69
+ ClassAndModuleChildren:
70
+ # ok to use compact style when modules are predefined.
71
+ # for example the following is fine so long as we're sure that
72
+ # module MDB has already been required/defined.
73
+ #
74
+ # class MDB::Person; end
75
+ Enabled: false
76
+
77
+ Style/FrozenStringLiteralComment:
78
+ Enabled: false
79
+
80
+ Style/ParallelAssignment:
81
+ Enabled: false
82
+
83
+ Metrics/AbcSize:
84
+ Enabled: true
85
+
86
+ Metrics/MethodLength:
87
+ Enabled: false
88
+
89
+ Style/PercentLiteralDelimiters:
90
+ PreferredDelimiters:
91
+ default: ()
92
+ "%i": ()
93
+ "%w": ()
94
+
95
+ Style/FormatString:
96
+ Enabled: false
97
+
98
+ Naming/FileName:
99
+ Exclude:
100
+ - 'Dangerfile'
101
+ Naming/UncommunicativeMethodParamName:
102
+ AllowedNames:
103
+ - 'pk'
104
+ - 'id'
105
+ Layout/EndAlignment:
106
+ EnforcedStyleAlignWith: variable
107
+
108
+ # https://github.com/bbatsov/rubocop/pull/5231
109
+ Layout/EmptyLinesAroundArguments:
110
+ Enabled: false
@@ -0,0 +1,26 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased](https://github.com/technekes/<%= component_root_dir_name %>/compare/v0.1.0...HEAD)
9
+
10
+ When submitting a new PR add your PR's details under the appropriate subsection below.
11
+
12
+ ### Added
13
+
14
+ ### Changed
15
+
16
+ ### Deprecated
17
+
18
+ ### Removed
19
+
20
+ ### Fixed
21
+
22
+ ### Security
23
+
24
+ ### Changed
25
+
26
+ ## 0.1.0 (2019-0x-xx)
@@ -0,0 +1,21 @@
1
+ # base layer
2
+ FROM ruby:2.6-alpine AS base
3
+
4
+ RUN mkdir -p /usr/src/app
5
+ WORKDIR /usr/src/app
6
+
7
+ RUN \
8
+ apk add --update --no-cache \
9
+ bash \
10
+ build-base \
11
+ postgresql-client \
12
+ postgresql-dev
13
+
14
+ COPY gems* /usr/src/app/
15
+
16
+ # development and test layer with all dependencies
17
+ FROM base AS development
18
+
19
+ COPY . /usr/src/app
20
+
21
+ CMD ["bin/start"]
@@ -0,0 +1,26 @@
1
+ options = {
2
+ cmd: 'rspec',
3
+ all_after_pass: true,
4
+ all_on_start: true,
5
+ spec_paths: './spec'
6
+ }
7
+
8
+ guard(:rspec, options) do
9
+ require 'guard/rspec/dsl'
10
+ dsl = Guard::RSpec::Dsl.new(self)
11
+
12
+ # RSpec files
13
+ rspec = dsl.rspec
14
+ watch(rspec.spec_helper) { rspec.spec_dir }
15
+ watch(rspec.spec_support) { rspec.spec_dir }
16
+ watch(rspec.spec_files)
17
+
18
+ # Ruby files
19
+ ruby = dsl.ruby
20
+ dsl.watch_spec_files_for(ruby.lib_files)
21
+ end
22
+
23
+ guard :rubocop, cli: ['--display-cop-names'] do
24
+ watch(%r{/.+\.rb$/})
25
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
26
+ end
@@ -0,0 +1,5 @@
1
+ # <%= component_name %>
2
+
3
+ This component was generated by the [TKXS component generator](https://github.com/technekes/command-line-component-generator).
4
+
5
+ For setup and usage instructions see: [TKXS component development](https://github.com/technekes/documentation/blob/master/development/ruby/component_development.md)
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler/gem_tasks'
4
+
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec) do |spec|
7
+ spec.pattern = '*spec/**/*_spec.rb'
8
+ end
9
+
10
+ require 'rainbow/ext/string' unless String.respond_to?(:color)
11
+ require 'rubocop/rake_task'
12
+
13
+ RuboCop::RakeTask.new(:rubocop)
14
+
15
+ task default: %i(rubocop spec)
16
+
17
+ task ci: :default
18
+
19
+ # this should really be handled inside of `tkxs-components`
20
+ namespace :db do
21
+ task :'migrate-event-store' do
22
+ Dir.chdir(Gem::Specification.find_by_name('tkxs-components').gem_dir) do
23
+ require 'fileutils'
24
+ FileUtils.cp_r('db/config/.', '.')
25
+
26
+ require 'standalone_migrations'
27
+ StandaloneMigrations::Tasks.load_tasks
28
+
29
+ require 'tkxs/components/tasks'
30
+ TKXS::Components::Tasks.install
31
+
32
+ Rake::Task['db:migrate'].invoke
33
+ end
34
+ end
35
+ end
data/source/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,9 @@
1
+ #! /bin/sh
2
+
3
+ echo "
4
+ ---
5
+ :gemfury_api_key: ${GEMFURY_API_KEY}
6
+ " > ~/.gem/gemfury
7
+
8
+ rake release
9
+ rm -f Gemfile.lock
@@ -0,0 +1,4 @@
1
+ #! /usr/bin/env sh
2
+
3
+ bundle install -j5
4
+ DATABASE=event_store rake db:migrate-event-store
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
4
+
5
+ require 'component_host'
6
+ require '<%= component_name %>'
7
+
8
+ ComponentHost.start('<%= service_name %>-component') do |host|
9
+ host.register(<%= component_constant_name %>::Start)
10
+ end
@@ -0,0 +1,13 @@
1
+ {
2
+ "Servers": {
3
+ "1": {
4
+ "Name": "Cache DB Server",
5
+ "Group": "Servers",
6
+ "Port": 5432,
7
+ "Username": "docker",
8
+ "Host": "cache-db-server",
9
+ "SSLMode": "prefer",
10
+ "MaintenanceDB": "postgres"
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,72 @@
1
+ version: '2.3'
2
+
3
+ services:
4
+ gem:
5
+ build:
6
+ context: .
7
+ dockerfile: Dockerfile
8
+ target: development
9
+ links:
10
+ - message-store-db-server
11
+ # - cache-db-server
12
+ volumes:
13
+ - .:/usr/src/app:delegated
14
+ - bundle:/usr/local/bundle:delegated
15
+ env_file: secrets.env
16
+ environment:
17
+ LOG_TAGS: "ignored,handle,write,-message_store,store,cache,snapshot,view_data,view_data_pg"
18
+ LOG_LEVEL: "warn"
19
+
20
+ message-store-db-server:
21
+ image: postgres:11-alpine
22
+ command: postgres -c 'max_connections=200'
23
+ ports:
24
+ - "54321:5432"
25
+ environment:
26
+ POSTGRES_DB: message_store
27
+ POSTGRES_USER: docker
28
+ POSTGRES_PASSWORD: docker
29
+
30
+ # cache-db-server:
31
+ # image: postgres:11-alpine
32
+ # command: postgres -c 'max_connections=200'
33
+ # ports:
34
+ # - "54322:5432"
35
+ # environment:
36
+ # POSTGRES_DB: cache_db
37
+ # POSTGRES_USER: docker
38
+ # POSTGRES_PASSWORD: docker
39
+
40
+ # rake:
41
+ # build:
42
+ # context: tkxs_components
43
+ # dockerfile: ../Dockerfile.migrate
44
+ # command: -T
45
+ # volumes:
46
+ # - ./tkxs_components/db:/usr/src/app/db:delegated
47
+ # - ./rakelib:/usr/src/app/rakelib:delegated
48
+ # links:
49
+ # - message-store-db-server
50
+ # - cache-db-server
51
+ # env_file:
52
+ # - ./secrets.env
53
+
54
+ pgadmin:
55
+ image: dpage/pgadmin4
56
+ volumes:
57
+ - pgadmin:/var/lib/pgadmin
58
+ - ./config/pgadmin_servers.json:/pgadmin4/servers.json
59
+ ports:
60
+ - "9090:80"
61
+ links:
62
+ - message-store-db-server
63
+ # - cache-db-server
64
+ environment:
65
+ PGADMIN_DEFAULT_EMAIL: docker
66
+ PGADMIN_DEFAULT_PASSWORD: docker
67
+
68
+ volumes:
69
+ bundle:
70
+ driver: local
71
+ pgadmin:
72
+ driver: local
data/source/gems.rb.tt ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ source 'https://gem.fury.io/technekes/'
3
+
4
+ gemspec name: '<%= component_name %>'
5
+
6
+ gem 'evt-component_host'
@@ -0,0 +1,14 @@
1
+ # Entity user guide: http://docs.eventide-project.org/user-guide/entities.html
2
+ # Entity snapshotting user guide: http://docs.eventide-project.org/user-guide/entity-store/snapshotting.html
3
+
4
+ module <%= component_constant_name %>
5
+ class <%= entity_constant_name %>
6
+ include Schema::DataStructure
7
+
8
+ attribute :id, String
9
+
10
+ # TODO Implement attributes
11
+ # TODO Implement entity logic, predicates, mutations, calculations, etc
12
+ # Note: This class's methods should pertain only to its attributes
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # Consumer user guide: http://docs.eventide-project.org/user-guide/consumers.html
2
+
3
+ module <%= component_constant_name %>
4
+ module Consumers
5
+ class Commands
6
+ include Consumer::Postgres
7
+
8
+ handler Handlers::Commands
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # Consumer user guide: http://docs.eventide-project.org/user-guide/consumers.html
2
+
3
+ module <%= component_constant_name %>
4
+ module Consumers
5
+ class Events
6
+ include Consumer::Postgres
7
+
8
+ handler Handlers::Events
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,49 @@
1
+ # Handler user guide: http://docs.eventide-project.org/user-guide/handlers.html
2
+ # Message user guide: http://docs.eventide-project.org/user-guide/messages-and-message-data/
3
+
4
+ module <%= component_constant_name %>
5
+ module Handlers
6
+ class Commands
7
+ include Messaging::Handle
8
+ include Messaging::StreamName
9
+ include Log::Dependency
10
+ # TODO include Messages::Commands once commands are implemented
11
+ # include Messages::Commands
12
+ # TODO include Messages::Events once events are implemented
13
+ # include Messages::Events
14
+
15
+ dependency :write, Messaging::Postgres::Write
16
+ dependency :clock, Clock::UTC
17
+ dependency :store, Store
18
+
19
+ def configure
20
+ Messaging::Postgres::Write.configure(self)
21
+ Clock::UTC.configure(self)
22
+ Store.configure(self)
23
+ end
24
+
25
+ category :<%= entity_name %>
26
+
27
+ # TODO Implement command handler blocks"
28
+ # eg:
29
+ # handle DoSomething do |do_something|
30
+ # <%= entity_name %>_id = do_something.<%= entity_name %>_id
31
+
32
+ # <%= entity_name %>, version = store.fetch(<%= entity_name %>_id, include: :version)
33
+
34
+ # if <%= entity_name %>.something_happened?
35
+ # logger.info(tag: :ignored) { "Command ignored (Command: #{do_something.message_type}, <%= entity_constant_name %> ID: #{<%= entity_name %>_id})" }
36
+ # return
37
+ # end
38
+
39
+ # something_happened = SomethingHappened.follow(do_something)
40
+
41
+ # something_happened.processed_time = clock.iso8601
42
+
43
+ # stream_name = stream_name(<%= entity_name %>_id)
44
+
45
+ # write.(something_happened, stream_name, expected_version: version)
46
+ # end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ # Handler user guide: http://docs.eventide-project.org/user-guide/handlers.html
2
+ # Message user guide: http://docs.eventide-project.org/user-guide/messages-and-message-data/
3
+
4
+ module <%= component_constant_name %>
5
+ module Handlers
6
+ class Events
7
+ include Messaging::Handle
8
+ include Messaging::StreamName
9
+ include Log::Dependency
10
+ # include Messages::Events once events are implemented
11
+ # include Messages::Events
12
+
13
+ # Note: Delete this file if not handling events
14
+
15
+ # TODO Implement event handler blocks
16
+ # eg:
17
+ # handle SomethingHappened do |something_happened|
18
+ # end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # Projection user guide: http://docs.eventide-project.org/user-guide/projection.html
2
+ # Message user guide: http://docs.eventide-project.org/user-guide/messages-and-message-data/
3
+
4
+ module <%= component_constant_name %>
5
+ class Projection
6
+ include EntityProjection
7
+ # TODO include Messages::Events once events are implemented"
8
+ # include Messages::Events
9
+
10
+ entity_name :<%= entity_name %>
11
+
12
+ # TODO Implement event projection blocks
13
+ # eg:
14
+ # apply SomethingHappened do |something_happened|
15
+ # SetAttributes.(<%= entity_name %>, something_happened, copy: [
16
+ # { :<%= entity_name %>_id => :id }
17
+ # ])
18
+
19
+ # something_happened_time = Clock.parse(something_happened.time)
20
+
21
+ # <%= entity_name %>.something_happened_time = something_happened_time
22
+ # end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ # Component initiator user guide: http://docs.eventide-project.org/user-guide/component-host.html#component-initiator
2
+
3
+ module <%= component_constant_name %>
4
+ module Start
5
+ def self.call
6
+ Consumers::Commands.start('<%= entity_stream_name %>:command')
7
+ Consumers::Events.start('<%= entity_stream_name %>')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ # Entity store user guide: http://docs.eventide-project.org/user-guide/entity-store/
2
+
3
+ module <%= component_constant_name %>
4
+ class Store
5
+ include EntityStore
6
+
7
+ category :<%= entity_name %>
8
+ entity <%= entity_constant_name %>
9
+ projection Projection
10
+ reader MessageStore::Postgres::Read, batch_size: 1000
11
+
12
+ # Optional snapshotting
13
+ # snapshot EntitySnapshot::Postgres, interval: 1000
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ require 'eventide/postgres'
2
+
3
+ # TODO Load command and event message files"
4
+ # require '<%= component_name %>/messages/commands/...'
5
+ # require '<%= component_name %>/messages/events/...'
6
+
7
+ require '<%= component_name %>/<%= entity_name %>'
8
+ require '<%= component_name %>/projection'
9
+ require '<%= component_name %>/store'
10
+
11
+ require '<%= component_name %>/handlers/commands'
12
+ require '<%= component_name %>/handlers/events'
13
+
14
+ require '<%= component_name %>/consumers/commands'
15
+ require '<%= component_name %>/consumers/events'
16
+
17
+ require '<%= component_name %>/start'
@@ -0,0 +1,4 @@
1
+ GEMFURY_PUSH_TOKEN=27JrtRxxxxxx
2
+ BUNDLE_GEM__FURY__IO=44xyxxxx
3
+ # VIEW_DATA_DATABASE_URL=postgresql://docker:docker@cache-db-server:5432/cache_db
4
+ EVENT_STORE_DATABASE_URL=postgresql://docker:docker@message-store-db-server:5432/message_store
@@ -0,0 +1,5 @@
1
+ RSpec.describe <%= component_constant_name %> do
2
+ it 'has a spec' do
3
+ expect(true).to be(true)
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'pry'
5
+ require 'ostruct'
6
+
7
+ require '<%= component_name %>'
8
+
9
+ Dir['./spec/support/**/*.rb'].each { |f| require f }
10
+
11
+ RSpec.configure do |config|
12
+ config.pattern = 'spec/**/*_spec.rb'
13
+
14
+ config.expect_with :rspec do |expectations|
15
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
16
+ end
17
+
18
+ config.mock_with :rspec do |mocks|
19
+ mocks.verify_partial_doubles = true
20
+ end
21
+
22
+ config.filter_run :focus
23
+ config.filter_run_excluding :disabled
24
+ config.run_all_when_everything_filtered = true
25
+
26
+ config.example_status_persistence_file_path = 'spec/examples.txt'
27
+ config.disable_monkey_patching!
28
+ config.warnings = true
29
+ config.default_formatter = 'doc' if config.files_to_run.one?
30
+ config.profile_examples = 5
31
+
32
+ config.order = :random
33
+ Kernel.srand config.seed
34
+ end
File without changes
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tkxs-component-generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - TKXS
8
+ autorequire:
9
+ bindir: executable
10
+ cert_chain: []
11
+ date: 2019-09-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: evt-casing
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: thor
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
+ description: " "
42
+ email: opensource@eventide-project.org
43
+ executables:
44
+ - tkxs-component-generator
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - executable/tkxs-component-generator
49
+ - lib/command_line/component_generator.rb
50
+ - lib/command_line/component_generator/commands/component.rb
51
+ - lib/command_line/component_generator/interface.rb
52
+ - source/%component_name%.gemspec.tt
53
+ - source/.circleci/config.yml
54
+ - source/.gitignore
55
+ - source/.rspec.tt
56
+ - source/.rubocop.yml.tt
57
+ - source/CHANGELOG.md
58
+ - source/Dockerfile.tt
59
+ - source/Guardfile.tt
60
+ - source/README.md.tt
61
+ - source/Rakefile.tt
62
+ - source/VERSION
63
+ - source/bin/release
64
+ - source/bin/setup.tt
65
+ - source/bin/start.tt
66
+ - source/config/pgadmin_servers.json.tt
67
+ - source/docker-compose.yml.tt
68
+ - source/gems.rb.tt
69
+ - source/lib/%component_name%.rb.tt
70
+ - source/lib/%component_name%/%entity_name%.rb.tt
71
+ - source/lib/%component_name%/consumers/commands.rb.tt
72
+ - source/lib/%component_name%/consumers/events.rb.tt
73
+ - source/lib/%component_name%/handlers/commands.rb.tt
74
+ - source/lib/%component_name%/handlers/events.rb.tt
75
+ - source/lib/%component_name%/messages/commands/.empty_directory
76
+ - source/lib/%component_name%/messages/events/.empty_directory
77
+ - source/lib/%component_name%/projection.rb.tt
78
+ - source/lib/%component_name%/start.rb.tt
79
+ - source/lib/%component_name%/store.rb.tt
80
+ - source/secrets.env.example
81
+ - source/spec/%component_name%/%component_name%_spec.rb.tt
82
+ - source/spec/spec_helper.rb.tt
83
+ - source/spec/support/.keep.tt
84
+ homepage: https://github.com/technekes/command-line-component-generator
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 2.4.0
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubygems_version: 3.0.3
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Command line Eventide component generator
107
+ test_files: []