k_builder 0.0.19 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f81ce6d464232f632884a2d3c1e04c180551644bf5ce9202a4a5d4a2e20d5c40
4
- data.tar.gz: bdc67f51753f3b63944b88ad3f739ba4710bf0981190fd9d7b8ce69eea6493aa
3
+ metadata.gz: ad123a63da5538fbf3c598f39f6af371760f01dcd90320f7d4c43cfa081c2a04
4
+ data.tar.gz: b851793f9e4716209fc5a49183d4bb49257e71648515a0dfb4c185581adbd604
5
5
  SHA512:
6
- metadata.gz: db0ac5f45c53b1a4d7d58e9acfd5bd106402039f1d28d81c998d3279f4b1177980817b284362cd272853735f02eb492a8d131cbcade21dacf707132269b84c75
7
- data.tar.gz: 24ff7bfeefa7db10f9a028cbda7695f171a5d7d6095be2a23637a9d3e7e727323512962414d5236d6961d4864aa4aad3521770f33120f2df07740671878a9e70
6
+ metadata.gz: 1f528ed1fecbc4776e7a5315d844207bb819e9cda4a4b43ff508ccbaf56e4b1e844f53824f50857a57051b8d5b5c8f7b3aeea0528767cb2dd809e1b55c2077cf
7
+ data.tar.gz: 38f600a8f7016f6f8aed25b5745122efd8b1e7e3f10a77d47a56cee3b54b2885ac7f563f8e1bba1d3ee17ef00fda870b98764ff858e256b47835dfc55e034dbb
data/README.md CHANGED
@@ -1,29 +1,6 @@
1
1
  # K Builder
2
2
 
3
- > K Builder provides various fluent builders for initializing applications with different language requirements
4
-
5
- ## ToDo
6
-
7
- - BuildWatcher (as a builder)
8
- - AppBuilder
9
- - BaseBuilder
10
- - WebBuilder
11
- - PackageBuilder
12
- - Webpack5Builder
13
- - ReactBuilder
14
- - SlideDeckBuilder
15
- - JavscriptBuilder
16
- - SolutionBuilder
17
- - DotnetBuilder
18
- - C#Console
19
- - C#Mvc
20
- - RubyBuilder
21
- - RubyGem
22
- - RailsApp
23
- - PythonBuilder
24
- - DddBuilder
25
- - DddGenerator
26
-
3
+ > KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
27
4
 
28
5
  ## Installation
29
6
 
@@ -59,12 +36,41 @@ See all [usage examples](./USAGE.md)
59
36
 
60
37
  ### Basic Example
61
38
 
62
- #### Basic example
39
+ #### Configure and Run
40
+
41
+ Setup configuration for KBuilder
42
+
43
+ Generate two files:
44
+
45
+ 1. main.rb is based on class.rb from app_template
46
+ 2. configuration.log.txt is based on an inline template
63
47
 
64
- Description for a basic example to be featured in the main README.MD file
48
+ Check out usage.md for more details
65
49
 
66
50
  ```ruby
67
- class SomeRuby; end
51
+ usecases_folder = File.join(Dir.getwd, 'spec', 'usecases')
52
+
53
+ KBuilder.configure do |config|
54
+ config.template_folder = File.join(usecases_folder, '.app_template')
55
+ config.global_template_folder = File.join(usecases_folder, '.global_template')
56
+ config.target_folder = File.join(usecases_folder, '.output')
57
+ end
58
+
59
+ template = <<~TEXT
60
+ Configured Template Folder : {{a}}
61
+ Configured Global Template Folder : {{b}}
62
+ Configured Output Folder : {{c}}
63
+ TEXT
64
+
65
+ builder = KBuilder::Builder.init
66
+
67
+ builder.add_file('main.rb', template_file: 'class.rb', name: 'main').add_file(
68
+ 'configuration.log.txt',
69
+ template: template,
70
+ a: builder.template_folder,
71
+ b: builder.global_template_folder,
72
+ c: builder.target_folder
73
+ )
68
74
  ```
69
75
 
70
76
  ## Development
data/STORIES.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # K Builder
2
2
 
3
- > K Builder provides various fluent builders for initializing applications with different language requirements
3
+ > KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
4
4
 
5
5
  As a Polyglot Developer, I want to be up and running in any development language with consistency, so I am productive and using best practices
6
6
 
data/USAGE.md CHANGED
@@ -1,19 +1,104 @@
1
1
  # K Builder
2
2
 
3
- > K Builder provides various fluent builders for initializing applications with different language requirements
3
+ > KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
4
4
 
5
5
  As a Polyglot Developer, I want to be up and running in any development language with consistency, so I am productive and using best practices
6
6
 
7
7
  ## Usage
8
8
 
9
- ### Sample Classes
9
+ ### Configure And Build
10
10
 
11
- #### Simple example
12
-
13
- Description for a simple example that shows up in the USAGE.MD
11
+ Print the configuration
14
12
 
15
13
  ```ruby
16
- class SomeRuby
17
- def initialize; end
14
+ usecases_folder = File.join(Dir.getwd, 'spec', 'usecases')
15
+
16
+ KBuilder.configure do |config|
17
+ config.template_folder = File.join(usecases_folder, '.app_template')
18
+ config.global_template_folder = File.join(usecases_folder, '.global_template')
19
+ config.target_folder = File.join(usecases_folder, '.output')
18
20
  end
21
+
22
+ puts JSON.pretty_generate(KBuilder.configuration.to_hash)
23
+ ```
24
+
25
+ ```javascript
26
+ {
27
+ "target_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.output",
28
+ "template_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.app_template",
29
+ "global_template_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.global_template"
30
+ }
19
31
  ```
32
+
33
+ #### Folder Structure (starting)
34
+
35
+ Example folder structure for this usecase before running the builder
36
+
37
+ > Note: app-templates will take preference over global templates
38
+
39
+ ![](usage/_usage_folder_before.png)
40
+
41
+ #### Run builder
42
+
43
+ This example builder will add 4 files into the output folder.
44
+
45
+ 1. `main.rb` is based on `class.rb` from `app_template`
46
+ 2. `person.rb` & `address.rb` are based on `model.rb` from `global_template`
47
+ 3. `configuration.log.txt` is based on an inline template
48
+
49
+ ```ruby
50
+ template = <<~TEXT
51
+ Configured Template Folder : {{a}}
52
+ Configured Global Template Folder : {{b}}
53
+ Configured Output Folder : {{c}}
54
+ TEXT
55
+
56
+ builder = KBuilder::Builder.init
57
+
58
+ builder
59
+ .add_file('main.rb', template_file: 'class.rb', name: 'main')
60
+ .add_file('person.rb',
61
+ template_file: 'model.rb',
62
+ name: 'person',
63
+ fields: %i[first_name last_name])
64
+ .add_file('address.rb',
65
+ template_file: 'model.rb',
66
+ name: 'address',
67
+ fields: %i[street1 street2 post_code state])
68
+ .add_file('configuration.log.txt',
69
+ template: template,
70
+ a: builder.template_folder,
71
+ b: builder.global_template_folder,
72
+ c: builder.target_folder)
73
+ .add_file('css/index.css',
74
+ template: '{{#each colors}} .{{.}} { color: {{.}} } {{/each}}',
75
+ colors: ['red', 'blue', 'green'],
76
+ pretty: true)
77
+
78
+ ```
79
+
80
+ #### Folder Structure (after)
81
+
82
+ Folder structure after running the builder
83
+
84
+ ![](usage/_usage_folder_after.png)
85
+
86
+ #### main.rb
87
+
88
+ ![main.rb](usage/_out1.png)
89
+
90
+ #### person.rb
91
+
92
+ ![](usage/_out2.png)
93
+
94
+ #### address.rb
95
+
96
+ ![person.rb](usage/_out3.png)
97
+
98
+ #### configuration.log.txt
99
+
100
+ ![configuration.log.txt](usage/_out4.png)
101
+
102
+ #### css/index.css
103
+
104
+ ![css/index.css](usage/_out5.png)
data/k_builder.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = <<-TEXT
14
14
  K Builder provides various fluent builders for initializing applications with different language requirements
15
15
  TEXT
16
- spec.homepage = 'http://appydave.com/gems/k-builder'
16
+ spec.homepage = 'http://appydave.com' # /gems/k-builder'
17
17
  spec.license = 'MIT'
18
18
 
19
19
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
data/lib/k_builder.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'k_builder/version'
4
- require 'k_builder/base_configuration'
5
- require 'k_builder/configuration'
6
4
  require 'k_builder/base_builder'
5
+ require 'k_builder/base_configuration'
7
6
  require 'k_builder/builder'
7
+ require 'k_builder/configuration'
8
+ require 'k_builder/data_helper'
8
9
 
9
10
  require 'handlebars/helpers/template'
10
11
 
@@ -3,104 +3,33 @@
3
3
  module KBuilder
4
4
  # Base configuration object for all k_builder* GEM
5
5
  class BaseConfiguration
6
- def to_hash
7
- hash = {}
8
- instance_variables.each { |var| hash[var.to_s.delete('@')] = instance_variable_get(var) }
9
- hash
10
- end
11
-
12
- def kv(name, value)
13
- puts "#{name.rjust(30)} : #{value}"
14
- end
15
-
16
- # All of this code should be extracted into a module
17
- #
18
- # The module should then be extracted out into a GEM so that
19
- # I can include it as needed. The GEM might be called
20
- # (dynamic attributes) and would allow a regular class to act like an OpenStruct
21
- # K-DSL uses data hash, while base configuration uses instance variables
22
-
23
- def respond_to_missing?(name, *_args, &_block)
24
- # puts 'respond_to_missing?'
25
- # puts "respond_to_missing: #{name}"
26
- n = name.to_s
27
- n = n[0..-2] if n.end_with?('=')
28
-
29
- if n.end_with?('?')
30
- super
31
- else
32
- # This has not been fully tested
33
- instance_variable_defined?("@#{n}") || super
6
+ def self.attach_to(klass_me, klass_target, accessor_name)
7
+ # Create a memoized getter to an instance of the attaching class (:klass_me)
8
+ #
9
+ # def third_party
10
+ # @third_party ||= KBuilder::ThirdPartyGem::Configuration.new
11
+ # end
12
+ klass_target.send(:define_method, accessor_name) do
13
+ return instance_variable_get("@#{accessor_name}") if instance_variable_defined?("@#{accessor_name}")
14
+
15
+ instance_variable_set("@#{accessor_name}", klass_me.new)
34
16
  end
35
17
  end
36
18
 
37
- def method_missing(name, *args, &_block)
38
- # puts "method_missing: #{name}"
39
- # puts "args.length : #{args.length}"
40
-
41
- add_getter_or_param_method(name)
42
- add_setter_method(name)
43
-
44
- send(name, args[0]) if args.length == 1 # name.end_with?('=')
45
-
46
- super unless self.class.method_defined?(name)
47
- end
48
-
49
- # Handles Getter method and method with single parameter
50
- # object.my_name
51
- # object.my_name('david')
52
- def add_getter_or_param_method(name)
53
- # L.progress(1, 'add_getter_or_param_method')
54
- self.class.class_eval do
55
- # L.progress(2, 'add_getter_or_param_method')
56
- name = name.to_s.gsub(/=$/, '')
57
- # L.progress(3, 'add_getter_or_param_method')
58
- # L.kv 'name', name
59
- define_method(name) do |*args|
60
- # L.progress(4, 'add_getter_or_param_method')
61
- # L.kv 'add_getter_or_param_method', name
62
- raise KBuilder::Error, 'Multiple setting values is not supported' if args.length > 1
19
+ def to_hash
20
+ hash = {}
21
+ instance_variables.each do |var|
22
+ value = instance_variable_get(var)
63
23
 
64
- if args.length.zero?
65
- get_value(name)
66
- else
67
- send("#{name}=", args[0])
68
- end
69
- end
70
- end
71
- end
24
+ value = value.to_hash if value.is_a?(KBuilder::BaseConfiguration)
72
25
 
73
- # Handles Setter method
74
- # object.my_name = 'david'
75
- def add_setter_method(name)
76
- # L.progress(1, 'add_setter_method')
77
- self.class.class_eval do
78
- # L.progress(2, 'add_setter_method')
79
- name = name.to_s.gsub(/=$/, '')
80
- # L.progress(3, 'add_setter_method')
81
- # L.kv 'add_setter_method', name
82
- define_method("#{name}=") do |value|
83
- # L.progress(4, 'add_setter_method')
84
- # L.kv 'name', name
85
- # L.kv 'value', value
86
- instance_variable_set("@#{name}", value)
87
- # my_data[name.to_s] = value
88
- end
26
+ hash[var.to_s.delete('@')] = value
89
27
  end
28
+ hash
90
29
  end
91
30
 
92
- def get_value(name)
93
- instance_variable_get("@#{name}")
31
+ def kv(name, value)
32
+ puts "#{name.rjust(30)} : #{value}"
94
33
  end
95
34
  end
96
-
97
- # class L
98
- # def self.progress(index, label)
99
- # puts "#{index} - #{label}"
100
- # end
101
-
102
- # def self.kv(name, value)
103
- # puts "#{name.rjust(30)} : #{value}"
104
- # end
105
- # end
106
35
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Attach data helper to the KBuilder module
4
+ module KBuilder
5
+ # Data helpers/utils for Kbuilder
6
+ class << self
7
+ attr_writer :data
8
+ end
9
+
10
+ def self.data
11
+ @data ||= DataHelper.new
12
+ end
13
+
14
+ # Helper methods attached to the namespace for working with Data
15
+ #
16
+ # Usage: KBuilder.data.to_struct(data)
17
+ class DataHelper
18
+ # Convert a hash into a deep OpenStruct or array an array
19
+ # of objects into an array of OpenStruct
20
+ def to_struct(data)
21
+ case data
22
+ when Hash
23
+ OpenStruct.new(data.transform_values { |v| to_struct(v) })
24
+
25
+ when Array
26
+ data.map { |o| to_struct(o) }
27
+
28
+ else
29
+ # Some primitave type: String, True/False, Symbol or an ObjectStruct
30
+ data
31
+ end
32
+ end
33
+
34
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
35
+ def struct_to_hash(data)
36
+ # No test yet
37
+ if data.is_a?(Array)
38
+ return data.map { |v| v.is_a?(OpenStruct) ? struct_to_hash(v) : v }
39
+ end
40
+
41
+ data.each_pair.with_object({}) do |(key, value), hash|
42
+ case value
43
+ when OpenStruct, Struct, Hash
44
+ hash[key] = struct_to_hash(value)
45
+ when Array
46
+ # No test yet
47
+ values = value.map do |v|
48
+ v.is_a?(OpenStruct) || v.is_a?(Struct) || v.is_a?(Hash) ? struct_to_hash(v) : v
49
+ end
50
+ hash[key] = values
51
+ else
52
+ hash[key] = value
53
+ end
54
+ end
55
+ end
56
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
57
+
58
+ def clean_symbol(value)
59
+ return value if value.nil?
60
+
61
+ value.is_a?(Symbol) ? value.to_s : value
62
+ end
63
+ end
64
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KBuilder
4
- VERSION = '0.0.19'
4
+ VERSION = '0.0.27'
5
5
  end
data/usage/_out1.png ADDED
Binary file
data/usage/_out2.png ADDED
Binary file
data/usage/_out3.png ADDED
Binary file
data/usage/_out4.png ADDED
Binary file
data/usage/_out5.png ADDED
Binary file
Binary file
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-13 00:00:00.000000000 Z
11
+ date: 2021-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: handlebars-helpers
@@ -57,12 +57,20 @@ files:
57
57
  - lib/k_builder/base_configuration.rb
58
58
  - lib/k_builder/builder.rb
59
59
  - lib/k_builder/configuration.rb
60
+ - lib/k_builder/data_helper.rb
60
61
  - lib/k_builder/version.rb
61
- homepage: http://appydave.com/gems/k-builder
62
+ - usage/_out1.png
63
+ - usage/_out2.png
64
+ - usage/_out3.png
65
+ - usage/_out4.png
66
+ - usage/_out5.png
67
+ - usage/_usage_folder_after.png
68
+ - usage/_usage_folder_before.png
69
+ homepage: http://appydave.com
62
70
  licenses:
63
71
  - MIT
64
72
  metadata:
65
- homepage_uri: http://appydave.com/gems/k-builder
73
+ homepage_uri: http://appydave.com
66
74
  source_code_uri: https://github.com/klueless-io/k_builder
67
75
  changelog_uri: https://github.com/klueless-io/k_builder/commits/master
68
76
  post_install_message: