k_doc 0.0.18 → 0.0.21

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: 28959da3b25b7817899193c0b0057e42750783a561e8190de4f6af82be5116c9
4
- data.tar.gz: c55996060304324b439d6a02d3a0993279a9f76dee8468802486a9e92cf958e3
3
+ metadata.gz: a39ec448d9de5183b86d1ee4e4d45cf529db22669bf10567efd9c35151aaf79c
4
+ data.tar.gz: 5d2388c614eeedec80cc2a1b2a587d94763102983b3ffdf64b04906a7efcc8ea
5
5
  SHA512:
6
- metadata.gz: e5c7303c8d1d9f0b6b90c1071c46d20852ed7796ba3410e2267f5fc42af55dc9ac7d20ff43d1c9a228f6779b67a1e9da0ecdde0b0fffe42b2b87811571af7d72
7
- data.tar.gz: e464b9117c83fdd72fc25a1bb17815ff62cf58a74b6e4f197c070eccf588ecd45e99ca25ff7985b06b1dd889e0fa62c1fd7adffc29c6b3bc2b50870ae13e88eb
6
+ metadata.gz: 9dd44d107a8b053afadace454dec1b650a9bb92b5f24451ff77dec479000a270904938d925efc9639c10a955c605995b3608465437d46b670c687fd595915564
7
+ data.tar.gz: b27b655fcd670d9db544f52b2b998fbf7adbbe00572cfec09c3e80d14518a403e1101826197c2d580e55768452c7791c6420f048ecafeeca59e0906ef2d1fbe0
@@ -0,0 +1,10 @@
1
+ require_relative './build_actions'
2
+ require_relative './director'
3
+ # require_relative './gem_director'
4
+ require_relative './klue_director'
5
+ require_relative './design_pattern_director'
6
+
7
+ def klue
8
+ @klue ||= KlueDirector.new
9
+ end
10
+
@@ -0,0 +1,39 @@
1
+ module BuildActions
2
+ def cd(folder_key)
3
+ @builder.cd(folder_key)
4
+
5
+ self
6
+ end
7
+
8
+ def add_file(file, **opts)
9
+ @builder.add_file(file, **opts)
10
+
11
+ self
12
+ end
13
+
14
+ def delete_file(file, **opts)
15
+ @builder.delete_file(file, **opts)
16
+
17
+ self
18
+ end
19
+
20
+ def add_clipboard(**opts)
21
+ @builder.add_clipboard(**opts)
22
+
23
+ self
24
+ end
25
+
26
+ def open
27
+ builder.open
28
+
29
+ self
30
+ end
31
+ alias o open
32
+
33
+ def open_template
34
+ builder.open_template
35
+
36
+ self
37
+ end
38
+ alias ot open_template
39
+ end
@@ -0,0 +1,39 @@
1
+ class DesignPatternDirector < Director
2
+ include BuildActions
3
+
4
+ def del(file, *_params, **opts)
5
+ delete_file(file, **opts)
6
+
7
+ self
8
+ end
9
+ alias dadd del
10
+
11
+ def add(output_file, template_file = nil, **opts)
12
+ template_file = output_file if template_file.nil?
13
+
14
+ opts = {
15
+ template_file: template_file,
16
+ on_exist: :write
17
+ }.merge(opts)
18
+
19
+ add_file(output_file, **opts)
20
+ puts output_file
21
+
22
+ self
23
+ end
24
+
25
+ # This pattern would be great as a configurable generic class
26
+ #
27
+ # children could be renamed as:
28
+ # - directors
29
+ # - components
30
+ # - elements
31
+ def composite(name:, relative_path:, **opts)
32
+ opts = { name: name }.merge(opts)
33
+ cd(:lib)
34
+ add(File.join(relative_path, "#{name}.rb"), "composite/composite.rb", **opts)
35
+ cd(:spec)
36
+ add(File.join(relative_path, "#{name}_spec.rb"), "composite/composite_spec.rb", **opts)
37
+ self
38
+ end
39
+ end
@@ -0,0 +1,185 @@
1
+ class Director
2
+ include KType::Composite
3
+ # Should this be on the base class, or setup as needed on child directors?
4
+
5
+ attr_reader :builder
6
+
7
+ # Maybe Deprecate
8
+ attr_reader :director_types
9
+
10
+ def initialize(parent = nil, **opts)
11
+ attach_parent(parent)
12
+
13
+ reset_settings
14
+ process_options(opts)
15
+ end
16
+
17
+ def init(opts)
18
+ reset_settings
19
+ process_options(opts)
20
+
21
+ self
22
+ rescue => ex
23
+ log.exception(ex)
24
+ end
25
+
26
+ def reset
27
+ reset_settings
28
+
29
+ self
30
+ rescue => ex
31
+ log.exception(ex)
32
+ end
33
+
34
+ def register(name, klass)
35
+ register_director(name, klass)
36
+
37
+ self
38
+ rescue => ex
39
+ log.exception(ex)
40
+ end
41
+
42
+ def back
43
+ navigate_parent
44
+ end
45
+
46
+ def with(director, &block)
47
+ change_director = director(director)
48
+ change_director.instance_eval(&block)
49
+ navigate_parent
50
+ end
51
+
52
+ def help(*topics) #**opts)
53
+ if topics.blank?
54
+ help_actions
55
+ return
56
+ end
57
+
58
+ help_actions if topics.include?(:all)
59
+ help_channels if topics.include?(:channels)
60
+ rescue => ex
61
+ log.exception(ex)
62
+ end
63
+
64
+ def director(name)
65
+ @director ||= Hash.new do |add_to_hash, key|
66
+ raise "Director not registered: #{key}" unless has_child?(key)
67
+ director = get_child(key)
68
+ add_to_hash[key] = director.klass.new(self).init(builder_config_name: key)
69
+ end
70
+ @director[name]
71
+ rescue => ex
72
+ log.exception(ex)
73
+ end
74
+
75
+ def guard(message)
76
+ log.error(message)
77
+
78
+ self
79
+ end
80
+
81
+
82
+ # def director(type, name)
83
+ # Setup.config(type).debug
84
+ # end
85
+
86
+ def debug
87
+ # puts 'debug'
88
+ # puts children
89
+ # puts director_types
90
+ if builder
91
+ builder.debug
92
+ else
93
+ log.error "No builder"
94
+ end
95
+
96
+ director_types.keys.each do |key|
97
+ log.section_heading(key)
98
+ log.structure director_types[key]
99
+ end
100
+
101
+ self
102
+ end
103
+
104
+ private
105
+
106
+ # Composite Pattern Custom Implementation - BEGIN
107
+
108
+ def has_child?(key)
109
+ @children.key?(key)
110
+ end
111
+
112
+ def get_child(key)
113
+ @children[key]
114
+ end
115
+
116
+ def add_child(key, child)
117
+ @children[key] = child
118
+ end
119
+
120
+ def reset_children
121
+ @children = {}
122
+ end
123
+
124
+ # Composite Pattern Custom Implementation - END
125
+
126
+ def register_director(name, klass)
127
+ if has_child?(name)
128
+ log.error "Director has already been registered: #{name}"
129
+ return
130
+ end
131
+
132
+ add_director(name, klass)
133
+ rescue => ex
134
+ log.exception(ex)
135
+ end
136
+
137
+ def add_director(name, klass)
138
+ director = OpenStruct.new(name: name, klass: klass)
139
+
140
+ # Adding a director should create a new method for accessing that director
141
+ add_child(name, director)
142
+ rescue => ex
143
+ log.exception(ex)
144
+ end
145
+
146
+ # HELP
147
+
148
+ def help_actions
149
+ log.warn 'Help about actions available from this class'
150
+ end
151
+
152
+ def help_channels
153
+ log.warn 'Help about channels'
154
+ debug
155
+ end
156
+
157
+ def reset_settings
158
+ @builder = nil
159
+ reset_children
160
+ @director_types = {}
161
+ end
162
+
163
+ def process_options(opts)
164
+ attach_builder(opts)
165
+ rescue => ex
166
+ log.exception(ex)
167
+ end
168
+
169
+ # If builder is provided then use it
170
+ # If builder configuration is provided
171
+ # If builder config_name is provided
172
+
173
+ def attach_builder(opts)
174
+ return if @builder
175
+
176
+ log.warning("options :builder and :builder_config_name are mutually exclusive, will use opts[:builder]") if opts[:builder] && opts[:builder_config_name]
177
+
178
+ # Use the provided builder
179
+ @builder = opts[:builder] if opts[:builder]
180
+
181
+ return if @builder
182
+
183
+ @builder = KBuilder::BaseBuilder.init(KBuilder.configuration(opts[:builder_config_name]))
184
+ end
185
+ end
@@ -0,0 +1,5 @@
1
+ class KlueDirector < Director
2
+ def design_patterns
3
+ director(:design_patterns)
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'k_log'
2
+ require 'k_util'
3
+
4
+ include KLog::Logging
5
+
6
+ require_relative './configure_builder'
7
+ require_relative './handlebars_helpers'
@@ -0,0 +1,38 @@
1
+ KBuilder.reset(:gem)
2
+ KBuilder.configure(:gem) do |config|
3
+ # config.template_folders.add(:global , '~/dev/kgems/k_templates/definitions/genesis')
4
+ config.target_folders.add(:root , File.expand_path('..', Dir.getwd))
5
+ config.target_folders.add(:lib , :root, 'lib', 'k_doc')
6
+ config.target_folders.add(:spec , :root, 'spec', 'k_doc')
7
+ end
8
+
9
+ KBuilder.reset(:design_patterns)
10
+ KBuilder.configure(:design_patterns) do |config|
11
+ config.template_folders.add(:global , '~/dev/kgems/k_templates/templates/ruby_design_patterns')
12
+ config.target_folders.add(:root , File.expand_path('..', Dir.getwd))
13
+ config.target_folders.add(:lib , :root, 'lib', 'k_doc')
14
+ config.target_folders.add(:spec , :root, 'spec', 'k_doc')
15
+ end
16
+
17
+ # KBuilder.configuration(:gem).debug
18
+
19
+ # def builder
20
+ # @builder ||= KBuilder::BaseBuilder.init
21
+ # end
22
+
23
+ puts ':)'
24
+
25
+ # Setup.configure(:microapp) do |config|
26
+ # config.template_folders.add(:microapp , '~/dev/kgems/k_templates/definitions/microapp')
27
+ # config.target_folders.add(:root , Dir.getwd)
28
+ # end
29
+
30
+ # Setup.configure(:data) do |config|
31
+ # # config.template_folders.add(:microapp , '~/dev/kgems/k_templates/definitions/microapp')
32
+ # config.target_folders.add(:root , File.expand_path('..', Dir.getwd), '.data')
33
+ # end
34
+
35
+ # Setup.configure(:actual_app) do |config|
36
+ # # config.template_folders.add(:microapp , '~/dev/kgems/k_templates/definitions/microapp')
37
+ # config.target_folders.add(:root , File.expand_path('..', Dir.getwd))
38
+ # end
@@ -0,0 +1,27 @@
1
+ Handlebars::Helpers.configure do |config|
2
+ config_file = File.join(Gem.loaded_specs['handlebars-helpers'].full_gem_path, '.handlebars_helpers.json')
3
+ config.helper_config_file = config_file
4
+
5
+ string_config_file = File.join(Gem.loaded_specs['handlebars-helpers'].full_gem_path, '.handlebars_string_formatters.json')
6
+ config.string_formatter_config_file = string_config_file
7
+ end
8
+
9
+ def camel
10
+ require 'handlebars/helpers/string_formatting/camel'
11
+ Handlebars::Helpers::StringFormatting::Camel.new
12
+ end
13
+
14
+ def titleize
15
+ require 'handlebars/helpers/string_formatting/titleize'
16
+ Handlebars::Helpers::StringFormatting::Titleize.new
17
+ end
18
+
19
+ def pluralize
20
+ require 'handlebars/helpers/inflection/pluralize'
21
+ Handlebars::Helpers::Inflection::Pluralize.new
22
+ end
23
+
24
+ def singularize
25
+ require 'handlebars/helpers/inflection/singularize'
26
+ Handlebars::Helpers::Inflection::Singularize.new
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'initializers/_'
2
+ require 'directors/_'
3
+
4
+ klue
5
+ .reset
6
+ .register(:design_patterns , DesignPatternDirector)
7
+
8
+ klue
9
+ .with(:design_patterns) do
10
+ composite(
11
+ relative_path: 'mixins',
12
+ name: :composite_spec,
13
+ namespace: 'KDoc',
14
+ children_name: :child,
15
+ children_name_plural: :children)
16
+ end
17
+
18
+ puts '...'
data/Guardfile CHANGED
@@ -19,7 +19,7 @@ group :green_pass_then_cop, halt_on_fail: true do
19
19
  # Ruby files
20
20
  ruby = dsl.ruby
21
21
  dsl.watch_spec_files_for(ruby.lib_files)
22
- watch(%r{^lib/k_doc/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
22
+ watch(%r{^lib/k_doc/**/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
23
23
  watch(%r{^lib/k_doc/commands/(.+)\.rb$}) { |m| "spec/unit/commands/#{m[1]}_spec.rb" }
24
24
  end
25
25
 
@@ -1,50 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDoc
4
- # A data acts a base data object for any data requires tagging such as
5
- # unique key, type and namespace.
4
+ # A container acts a base data object for any data that requires tagging
5
+ # such as unique key, type and namespace.
6
6
  class Container
7
- # include KLog::Logging
8
-
9
- # Name of the document (required)
10
- #
11
- # Examples: user, account, country
12
- attr_reader :key
13
-
14
- # Type of data
15
- #
16
- # Examples by data type
17
- # :csv, :yaml, :json, :xml
18
- #
19
- # Examples by shape of the data in a DSL
20
- # :entity, :microapp, blueprint
21
- attr_reader :type
22
-
23
- attr_writer :data
24
-
25
- attr_reader :error
26
-
27
- # Create container for storing data/documents.
28
- #
29
- # Any container can be uniquely identified via it's
30
- # key, type, namespace and project_key attributes
31
- #
32
- # @param [Hash] **opts The options
33
- # @option opts [String|Symbol] name Name of the container
34
- # @option opts [String|Symbol] type Type of the container, defaults to KDoc:: FakeOpinion.new.default_model_type if not set
35
- def initialize(**opts)
36
- @key = opts[:key] || SecureRandom.alphanumeric(4)
37
- @type = opts[:type] || ''
38
- @data = opts[:data] || {}
7
+ include KLog::Logging
8
+ include KDoc::Guarded
9
+ include KDoc::Taggable
10
+ include KDoc::Datum
11
+ include KDoc::BlockProcessor
12
+
13
+ attr_reader :opts
14
+
15
+ # TODO: Owner/Owned need to be in a module and tested
16
+ attr_accessor :owner
17
+
18
+ def owned?
19
+ @owner != nil
39
20
  end
40
21
 
41
- def debug_header
42
- log.kv 'key' , key , 15
43
- log.kv 'type' , type , 15
22
+ def initialize(**opts, &block)
23
+ @opts = opts
24
+
25
+ initialize_tag(opts)
26
+ initialize_data(opts)
27
+ initialize_block(opts, &block)
28
+ end
29
+
30
+ def default_container_type
31
+ :container
32
+ end
33
+
34
+ def default_data_value
35
+ {}
36
+ end
37
+
38
+ def debug
39
+ debug_container
40
+ debug_errors
44
41
  end
45
42
 
46
- def data
47
- @data.clone
43
+ private
44
+
45
+ def debug_errors
46
+ log.block(errors, title: 'errors') unless valid?
48
47
  end
49
48
  end
50
49
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+
5
+ module KDoc
6
+ # CsvDoc is a DSL for modeling CSV data objects
7
+ class CsvDoc < KDoc::Container
8
+ attr_reader :file
9
+
10
+ # Create CSV document
11
+ #
12
+ # @param [String|Symbol] name Name of the document
13
+ # @param args[0] Type of the document, defaults to KDoc:: FakeOpinion.new.default_csv_type if not set
14
+ # @param default: Default value (using named params), as above
15
+ def initialize(key = nil, **opts, &block)
16
+ super(**{ key: key }.merge(opts))
17
+
18
+ initialize_file
19
+
20
+ @block = block if block_given?
21
+ end
22
+
23
+ # Load data from file
24
+ #
25
+ # @param [Symbol] load_action The load_action to take if data has already been loaded
26
+ # @param [:once] load_action :once will load the data from content source on first try only
27
+ # @param [:reload] load_action :reload will reload from content source each time
28
+ # @param [Symbol] data_action The data_action to take when setting data, defaults to :replace
29
+ # @param [:replace] data_action :replace will replace the existing data instance with the incoming data value
30
+ # @param [:append] data_action :append will keep existing data and then new value data over the top
31
+ def load(load_action: :once, data_action: :replace)
32
+ return if load_action == :once && loaded?
33
+
34
+ rows = []
35
+
36
+ CSV.foreach(file, headers: true, header_converters: :symbol) do |row|
37
+ rows << row.to_h
38
+ end
39
+
40
+ set_data(rows, data_action: data_action)
41
+
42
+ @loaded = true
43
+ end
44
+
45
+ def loaded?
46
+ @loaded
47
+ end
48
+
49
+ private
50
+
51
+ def initialize_file
52
+ @file ||= opts.delete(:file) || ''
53
+ @loaded = false
54
+ end
55
+
56
+ def default_data_value
57
+ []
58
+ end
59
+
60
+ def default_container_type
61
+ :csv
62
+ end
63
+ end
64
+ end
@@ -5,8 +5,12 @@ require 'json'
5
5
  module KDoc
6
6
  # This is called fake opinion because I have not figured out
7
7
  # how I want to implement this
8
+ # Need to look at the configuration patterns, this is really a configuration
8
9
  class FakeOpinion
9
10
  attr_accessor :default_model_type
11
+ attr_accessor :default_csv_type
12
+ attr_accessor :default_json_type
13
+ attr_accessor :default_yaml_type
10
14
  attr_accessor :default_settings_key
11
15
  attr_accessor :default_table_key
12
16
 
@@ -16,6 +20,9 @@ module KDoc
16
20
 
17
21
  def initialize
18
22
  @default_model_type = :entity
23
+ @default_csv_type = :csv
24
+ @default_json_type = :json
25
+ @default_yaml_type = :yaml
19
26
  @default_settings_key = :settings
20
27
  @default_table_key = :table
21
28
 
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDoc
4
+ # JsonDoc is a DSL for modeling JSON data objects
5
+ class JsonDoc < KDoc::Container
6
+ attr_reader :file
7
+
8
+ # Create JSON document
9
+ #
10
+ # @param [String|Symbol] name Name of the document
11
+ # @param args[0] Type of the document, defaults to KDoc:: FakeOpinion.new.default_csv_type if not set
12
+ # @param default: Default value (using named params), as above
13
+ # @param [Proc] block The block is stored and accessed different types in the document loading workflow.
14
+ def initialize(key = nil, **opts, &_block)
15
+ super(**{ key: key }.merge(opts))
16
+
17
+ initialize_file
18
+ end
19
+
20
+ # Load data from file
21
+ #
22
+ # @param [Symbol] load_action The load_action to take if data has already been loaded
23
+ # @param [:once] load_action :once will load the data from content source on first try only
24
+ # @param [:reload] load_action :reload will reload from content source each time
25
+ # @param [Symbol] data_action The data_action to take when setting data, defaults to :replace
26
+ # @param [:replace] data_action :replace will replace the existing data instance with the incoming data value
27
+ # @param [:append] data_action :append will keep existing data and then new value data over the top
28
+ def load(load_action: :once, data_action: :replace)
29
+ return if load_action == :once && loaded?
30
+
31
+ content = File.read(file)
32
+ hash = JSON.parse(content)
33
+
34
+ set_data(hash, data_action: data_action)
35
+
36
+ @loaded = true
37
+ end
38
+
39
+ def loaded?
40
+ @loaded
41
+ end
42
+
43
+ private
44
+
45
+ def initialize_file
46
+ @file ||= opts.delete(:file) || ''
47
+ @loaded = false
48
+ end
49
+
50
+ def default_data_value
51
+ @default_data_value ||= {}
52
+ end
53
+
54
+ def default_container_type
55
+ :json
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDoc
4
+ # A container acts a base data object for any data that requires tagging
5
+ # such as unique key, type and namespace.
6
+ # Rename: BlockProcessor
7
+ module BlockProcessor
8
+ attr_accessor :block
9
+
10
+ def initialize_block(_opts, &block)
11
+ @block = block if block_given?
12
+ end
13
+
14
+ def execute_block(run_actions: nil)
15
+ eval_block
16
+ run_on_action if run_actions
17
+ end
18
+
19
+ def eval_block
20
+ return if @block.nil?
21
+
22
+ instance_eval(&@block)
23
+ rescue StandardError => e
24
+ log.error('Standard error in document')
25
+ # puts "key #{unique_key}"
26
+ # puts "file #{KUtil.data.console_file_hyperlink(resource.file, resource.file)}"
27
+ log.error(e.message)
28
+ @error = e
29
+ raise
30
+ end
31
+
32
+ def run_on_action
33
+ return if @block.nil?
34
+
35
+ on_action if respond_to?(:on_action)
36
+ rescue StandardError => e
37
+ log.error('Standard error while running actions')
38
+ # puts "key #{unique_key}"
39
+ # puts "file #{KUtil.data.console_file_hyperlink(resource.file, resource.file)}"
40
+ log.error(e.message)
41
+ @error = e
42
+ raise
43
+ end
44
+ end
45
+ end