appifier 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ebe2edb236e0e8042528bed79556182fb8dc433a3fee5968925bfec477174ca
4
- data.tar.gz: c68af6a6f2403399df42d306e57eae491fb34ace51642958a551187629b95c3c
3
+ metadata.gz: aeea227ea8e3eaa87c58fcbd7333297f73b7e2c82f7ba51da9b8bccb4f979f05
4
+ data.tar.gz: 3121f0753db7fbc4b8d68f2acfaf141cf9ee9785f5abfc5edca2b5a645faa942
5
5
  SHA512:
6
- metadata.gz: 00df49a5f7cef5ff1186cb48bc260a26e999a741e2ac892bbedbf018d42f5c7bb0fd49a1e2da8bce16fbbe9f6be3326346f245f139c782630c3c93f9c796e1c0
7
- data.tar.gz: 45876a4b19542f2ed10c01259a7f649b3b101a169443349f599e082e78e514a1c2591069f56225b72743d78ada3a1d7d4d8ddc83aa8c5fffa5993988a3ae2e29
6
+ metadata.gz: d7aceeba188e836380bd52eebdfb87839c6227f79282e2ae90fe12d1486d03c4dbb53147c61abb84d4aab172bca8e10b8d7aa419b214e0f0bb151bbd30e4a17c
7
+ data.tar.gz: 90fa233237110cfc8c815e6d3002dbc831eaf08b9979d9f0d499f9d08228768c87e519f212fde8241ee9c944f158d90cadbe9924fc4031bd8a8eaa42a6165873
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
data/appifier.gemspec CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'yard', '~> 0.9.27'
35
35
  spec.add_development_dependency 'yard-rspec', '~> 0.1'
36
36
  spec.metadata['rubygems_mfa_required'] = 'false'
37
- spec.add_dependency 'carioca', '~> 2.0'
37
+ spec.add_dependency 'carioca', '~> 2.0.9'
38
38
  spec.add_dependency 'thor', '~> 1.2'
39
+ spec.add_dependency 'tty-prompt', '~> 0.23.1'
39
40
  end
@@ -0,0 +1,9 @@
1
+ ---
2
+ :finisher:
3
+ :type: :internal
4
+ :description: The Finisher service
5
+ :service: Appifier::Services::Finisher
6
+ :depends:
7
+ - :configuration
8
+ - :logger
9
+ - :output
data/config/settings.yml CHANGED
@@ -6,3 +6,62 @@
6
6
  :test: {}
7
7
  :default:
8
8
  :test: 'Romain'
9
+ :exit_cases:
10
+ :not_root:
11
+ :message: This operation need to be run as root (use sudo or rvmsudo)
12
+ :code: 10
13
+ :options_incompatibility:
14
+ :message: Options incompatibility
15
+ :code: 40
16
+ :service_dependence_missing:
17
+ :message: Appifier Service dependence missing
18
+ :code: 60
19
+ :config_required:
20
+ :message: Specific configuration required
21
+ :code: 30
22
+ :setup_error:
23
+ :message: Setup terminated unsuccessfully
24
+ :code: 25
25
+ :setup_success:
26
+ :message: Setup terminated successfully
27
+ :code: 0
28
+ :sanitycheck_error:
29
+ :messagee: Sanitycheck terminated unsuccessfully
30
+ :code: 20
31
+ :sanitycheck_success:
32
+ :message: Sanitycheck terminated successfully
33
+ :code: 0
34
+ :configuration_error:
35
+ :message: Configuration Error
36
+ :code: 50
37
+
38
+
39
+ # global
40
+ :quiet_exit:
41
+ :code: 0
42
+ :error_exit:
43
+ :code: 99
44
+ :message: Operation failure
45
+
46
+ # events
47
+ :interrupt:
48
+ :message: User operation interrupted
49
+ :code: 33
50
+
51
+ # request
52
+ :not_found:
53
+ :message: Object not found
54
+ :code: 44
55
+ :already_exist:
56
+ :message: Object already exist
57
+ :code: 48
58
+
59
+ # daemon
60
+ :status_ok:
61
+ :message: Status OK
62
+ :code: 0
63
+ :status_ko:
64
+ :message: Status KO
65
+ :code: 31
66
+
67
+
data/exe/appifier CHANGED
@@ -7,4 +7,4 @@ require 'appifier/cli'
7
7
 
8
8
  include Appifier::CLI
9
9
 
10
- Command.start(ARGV)
10
+ MainCommand.start(ARGV)
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ require "tty-prompt"
3
+
4
+ module Appifier
5
+ module Actors
6
+ class Collector
7
+
8
+ extend Carioca::Injector
9
+ inject service: :output
10
+
11
+ attr_accessor :dataset
12
+ attr_reader :template
13
+
14
+ def initialize(template: ,dataset: nil,force: false )
15
+ @force = force
16
+ @template = template
17
+ get_defined_dataset(dataset)
18
+ end
19
+
20
+
21
+ def collect
22
+
23
+ appifilename = "#{File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)}/#{template}/Appifile"
24
+ appifile = Appifier::Components::Appifile::new path: appifilename
25
+ prompt = TTY::Prompt.new
26
+ @dataset = {}
27
+ appifile.dataset_rules.each do |name, rule|
28
+ default = (rule[:default])? rule[:default] : ""
29
+ @dataset[name] = prompt.ask("Give #{rule[:description]} : ", default: default) do |q|
30
+ q.required true
31
+ q.validate Regexp.new(rule[:format]) if rule[:format]
32
+ end
33
+ end
34
+ write_dataset template: @template, data: @dataset
35
+ @collected = true
36
+ output.info "Dataset recorded for #{@template}"
37
+
38
+ end
39
+
40
+ def collected?
41
+ return @collected
42
+ end
43
+
44
+ private
45
+ def get_defined_dataset(newdataset=nil)
46
+ if check_dataset_defined? template: @template then
47
+ @dataset = open_dataset template: @template
48
+ if @force
49
+ @dataset = newdataset
50
+ write_dataset template: @template, data: @dataset
51
+ else
52
+ raise "Dataset already collect for template : #{@template}"
53
+ end
54
+ @collected = true
55
+ elsif newdataset
56
+ @dataset = newdataset
57
+ write_dataset template: @template, data: @dataset
58
+ @collected = true
59
+ else
60
+ @dataset = nil
61
+ @collected = false
62
+ end
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -5,29 +5,31 @@ module Appifier
5
5
  class Generator
6
6
  attr_reader :src_paths, :src_files, :src_folders, :target_folders, :target_files
7
7
 
8
- def initialize(src_root:, target_root:)
8
+ extend Carioca::Injector
9
+ inject service: :output
10
+
11
+
12
+ def initialize(src_root:, target_root:, dataset: )
9
13
  @src_root = src_root
10
14
  @target_root = target_root
11
15
  @target_folders = []
12
16
  @target_files = []
13
- @data = { appname: 'test' }
17
+ @data = dataset
14
18
  @src_paths = Dir.glob("#{@src_root}/**/*", File::FNM_DOTMATCH)
15
19
  @src_paths.delete_if { |file| file =~ %r{/\.$} }
16
20
  @src_folders = @src_paths.select { |item| File.directory? item }
17
21
  @src_files = @src_paths.select { |item| File.file? item }
22
+ raise 'Application template not found' unless File.exist?(src_root)
18
23
  end
19
24
 
20
25
  def generate(dry_run: false, force: false)
21
- puts 'Running in dry_run' if dry_run
26
+ output.info 'Running in dry_run (operation will be SKIPPED)' if dry_run
22
27
  calculate
23
- if check_folder_already_exist && !force
24
- puts 'Folders and files already exist'
25
- return false
26
- end
28
+ raise 'Folders and files already exist' if check_folder_already_exist && !force
27
29
  FileUtils.rm_rf("#{@target_root}/#{@target_folders.first}") if force
28
- puts 'Generate folders'
30
+ output.info 'Generate folders'
29
31
  generate_folders dry_run: dry_run
30
- puts 'Generate files'
32
+ output.info 'Generate files'
31
33
  generate_files dry_run: dry_run
32
34
  end
33
35
 
@@ -43,19 +45,19 @@ module Appifier
43
45
  end
44
46
 
45
47
  def generate_folders(dry_run:)
46
- puts "Target path to create in #{@target_root} :"
48
+ output.info "Target path to create in #{@target_root} :"
47
49
  @target_folders.each do |path|
48
- action = dry_run ? '[SKIPPED]' : '[OK]'
50
+ action = dry_run ? :skipped : :ok
49
51
  FileUtils.mkdir_p "#{@target_root}/#{path}", noop: dry_run
50
- puts "#{action} #{path}"
52
+ output.send action, "#{path}"
51
53
  end
52
54
  end
53
55
 
54
56
  def generate_files(dry_run:)
55
- puts "Target files to create in #{@target_root} :"
57
+ output.info "Target files to create in #{@target_root} :"
56
58
  @src_files.each_with_index do |path, index|
57
59
  if dry_run
58
- result = '[SKIPPED]'
60
+ result = :skipped
59
61
  else
60
62
  begin
61
63
  template = Template.new strict: false,
@@ -64,12 +66,12 @@ module Appifier
64
66
  template.map(@data)
65
67
  content = template.output
66
68
  File.write("#{@target_root}/#{@target_files[index]}", content)
67
- result = '[OK]'
69
+ result = :ok
68
70
  rescue InvalidTokenList, NotAToken, NoTemplateFile
69
- result = '[KO]'
71
+ result = :ko
70
72
  end
71
73
  end
72
- puts "#{result} #{@target_files[index]}"
74
+ output.send result,"#{@target_files[index]}"
73
75
  end
74
76
  end
75
77
 
@@ -1,27 +1,33 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: false
2
2
 
3
3
  module Appifier
4
4
  module Actors
5
5
  module Retrivers
6
6
  class Git
7
- def self.get(origin:, destination:); end
7
+ def self.get(origin:, destination:);
8
+ raise 'not yest implemented'
9
+ end
8
10
  end
9
11
 
10
12
  class Archive
11
13
  def self.get(origin:, destination:)
14
+ raise "Archive : #{origin} not found" unless File::exist? origin
12
15
  untar_gz archive: origin, destination: destination
13
16
  end
14
17
  end
15
18
  end
16
19
 
17
20
  class Retriever
21
+ extend Carioca::Injector
22
+ inject service: :output
23
+
18
24
  TYPE = { archive: Appifier::Actors::Retrivers::Archive, git: Appifier::Actors::Retrivers::Git }
19
25
 
20
26
  def initialize(origin:, type: :archive, destination: File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH))
21
27
  @origin = origin
22
28
  @type = type
23
29
  @destination = destination
24
- puts "retrieving template from #{origin}"
30
+ output.info "retrieving template from #{origin}"
25
31
  end
26
32
 
27
33
  def get
@@ -4,18 +4,29 @@ module Appifier
4
4
  module CLI
5
5
  module Subcommands
6
6
  class Templates < ::Thor
7
+
8
+ def initialize(*args)
9
+ super
10
+ @output = Carioca::Registry.get.get_service name: :output
11
+ @finisher = Carioca::Registry.get.get_service name: :finisher
12
+ end
13
+
7
14
  # Thor method : list availables templates in user bundle
8
15
  desc 'ls', 'list templates availables in user bundle'
9
16
  def ls
10
- puts "List of avaible templates for user : #{current_user} :"
11
- list_bundled_templates
17
+ Appifier::Components::Templates::list
18
+ @finisher.terminate exit_case: :error_exit
12
19
  end
13
20
 
14
21
  # Thor method : remove a template from user bundle
15
22
  desc 'rm', 'rm templates from user bundle'
16
23
  def rm(template)
17
- puts "Removing template #{template} for user : #{current_user} :"
18
- rm_bundled_template(template)
24
+ begin
25
+ Appifier::Components::Templates::rm(template)
26
+ rescue RuntimeError => e
27
+ @output.error e.message
28
+ @finisher.terminate exit_case: :error_exit
29
+ end
19
30
  end
20
31
  end
21
32
  end
data/lib/appifier/cli.rb CHANGED
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: false
2
2
 
3
3
  require 'appifier'
4
4
  require 'thor'
@@ -8,7 +8,15 @@ Dir["#{File.dirname(__FILE__)}/cli/*.rb"].sort.each { |file| require file }
8
8
  module Appifier
9
9
  module CLI
10
10
  # The CLI Command structure for Thor
11
- class Command < Thor
11
+ class MainCommand < Thor
12
+
13
+
14
+ def initialize(*args)
15
+ super
16
+ @output = Carioca::Registry.get.get_service name: :output
17
+ @finisher = Carioca::Registry.get.get_service name: :finisher
18
+ end
19
+
12
20
  # callback for managing ARGV errors
13
21
  def self.exit_on_failure?
14
22
  true
@@ -24,33 +32,95 @@ module Appifier
24
32
  desc 'generate TEMPLATE [TARGET]', 'Generate application from bundled template'
25
33
  long_desc <<-LONGDESC
26
34
  Generate application from bundled template\n
27
- with --simulate, only simulate folders and files installed#{' '}
28
- with --force, force regeneration of application, remove old files [DANGER]#{' '}
35
+ with --simulate, only simulate folders and files installed
36
+ with --force, force regeneration of application, remove old files [DANGER]
29
37
  LONGDESC
30
38
  option :simulate, type: :boolean, aliases: '-s'
31
39
  option :force, type: :boolean, aliases: '-F'
32
40
  def generate(template, target = '.')
33
- source = "#{File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)}/#{template}"
34
- if File.exist?(source)
35
- generator = Appifier::Actors::Generator.new src_root: source, target_root: File.expand_path(target)
36
- generator.generate dry_run: options[:simulate], force: options[:force]
41
+ root = "#{File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)}/#{template}"
42
+ source = "#{root}/skeleton"
43
+
44
+ if File::exist? File::expand_path("#{DEFAULT_DATASETS_PATH}/#{template}.yml") then
45
+ dataset = open_dataset(template: template)
46
+ @output.info "Dataset file found for #{template}"
37
47
  else
38
- puts 'Application template not found'
48
+ @output.ko "Dataset file not found for #{template}"
49
+ @finisher.terminate exit_case: :error_exit
50
+ end
51
+
52
+ begin
53
+ generator = Appifier::Actors::Generator.new src_root: source, target_root: File.expand_path(target), dataset: dataset
54
+ generator.generate dry_run: options[:simulate], force: options[:force]
55
+ @finisher.terminate exit_case: :quiet_exit
56
+ rescue RuntimeError => e
57
+ @output.error e.message
58
+ @finisher.terminate exit_case: :error_exit
39
59
  end
40
60
  end
41
61
 
42
- # Thor method : running of Appifier reteive
62
+ # Thor method : running of Appifier retreive
43
63
  desc 'retrieve ORIGIN', 'Retrieve an application template in user templates bundle'
44
64
  long_desc <<-LONGDESC
45
65
  Retrieve an application template in user templates bundle\n
46
- with --type [RETRIEVER], precise retrieving type ex,builtin [:git,:archive]
66
+ with --type [RETRIEVER], precise retrieving type ex,builtin [:git,:archive] DEFAULT : :git
47
67
  LONGDESC
48
68
  option :type, type: :string, aliases: '-t', default: 'git'
49
69
  def retrieve(origin)
50
- type = options[:type].to_sym
51
- retriever = Appifier::Actors::Retriever.new type: type, origin: origin
52
- retriever.get
70
+ begin
71
+ type = options[:type].to_sym
72
+ retriever = Appifier::Actors::Retriever.new type: type, origin: origin
73
+ retriever.get
74
+ @finisher.terminate exit_case: :quiet_exit
75
+ rescue RuntimeError => e
76
+ @output.error e.message
77
+ @finisher.terminate exit_case: :error_exit
78
+ end
53
79
  end
80
+
81
+ # Thor method : running of Appifier Dataset Collector
82
+ desc 'collect TEMPLATE', 'Collect dataset for an application template in user templates bundle'
83
+ long_desc <<-LONGDESC
84
+ Collect dataset for an application template in user templates bundle\n
85
+ with --force => force collect, and destroy previous Dataset [DANGER]
86
+ with --file FILENAME get data from à YAML File
87
+ with --stdin get data from STDIN
88
+
89
+ LONGDESC
90
+ option :force, type: :boolean, aliases: '-F'
91
+ option :stdin, type: :boolean, aliases: '-S'
92
+ option :file, type: :string, aliases: '-f'
93
+ def collect(template)
94
+ data = nil
95
+ begin
96
+ raise "Options incompatibles --file and --stdin" if options[:stdin] and options[:file]
97
+ @output.info "Force mode, rewrite dataset if exist" if options[:force]
98
+ if options[:file]
99
+ Appifier::Actors::Collector.new template: template, dataset: open_yaml(filename: options[:file]), force: options[:force]
100
+ @output.info "Getting Dataset from file : #{options[:file]} for #{template}"
101
+ elsif options[:stdin]
102
+ @output.info "Getting Dataset from STDIN for #{template}"
103
+ begin
104
+ data = STDIN.readlines.join
105
+ rescue Interrupt
106
+ @output.error "Dataset input from STDIN cancelled"
107
+ @finisher.terminate exit_case: :interrupt
108
+ end
109
+ Appifier::Actors::Collector.new template: template, dataset: YAML::load(data), force: options[:force]
110
+ else
111
+ @output.info "Beginning interactive Dataset input for #{template}"
112
+ collector = Appifier::Actors::Collector.new template: template, force: options[:force]
113
+ collector.collect
114
+ end
115
+ @finisher.terminate exit_case: :quiet_exit
116
+ rescue RuntimeError => e
117
+ @output.error e.message
118
+ @finisher.terminate exit_case: :error_exit
119
+ rescue
120
+
121
+ end
122
+ end
123
+
54
124
  end
55
125
  end
56
126
  end
@@ -0,0 +1,35 @@
1
+ module Appifier
2
+ module Components
3
+ class Appifile
4
+
5
+ attr_reader :content
6
+
7
+ def initialize(path:)
8
+ @path = path
9
+ @content = {}
10
+ openfile
11
+ end
12
+
13
+ def dataset_rules
14
+ @content[:template][:dataset]
15
+ end
16
+
17
+ def actions
18
+ @content[:actions]
19
+ end
20
+
21
+ private
22
+ def openfile
23
+ raise 'Appifile not foud' unless File::exist? @path
24
+ begin
25
+ @content = YAML.load_file(@path)
26
+ rescue StandardError => e
27
+ raise e.message
28
+ end
29
+
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir["#{File.dirname(__FILE__)}/*.rb"].sort.each { |file| require file unless File.basename(file) == 'init.rb' }
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appifier
4
+ module Components
5
+ class Templates
6
+
7
+ extend Carioca::Injector
8
+ inject service: :output
9
+
10
+ def self.list
11
+ output.info "List of avaible templates for user : #{current_user} :"
12
+ template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
13
+ Dir.glob("#{template_path}/*").map { |item| item.delete_prefix("#{template_path}/") }.each do |template|
14
+ output.item "#{template}"
15
+ end
16
+ end
17
+
18
+ def self.rm(template)
19
+ output.info "Removing template #{template} for user : #{current_user} :"
20
+ template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
21
+ begin
22
+ if File::exist? "#{template_path}/#{template}"
23
+ FileUtils.rm_rf "#{template_path}/#{template}"
24
+ output.ok "Template #{template} deleted of bundle for user #{current_user}"
25
+ else
26
+ raise "Template #{template} not found in bundle for user #{current_user}"
27
+ end
28
+ rescue Errno::ENOENT
29
+ raise "Template #{template} not found in bundle for user #{current_user}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appifier
4
+ module Helpers
5
+ module Datasets
6
+ def open_dataset(template:)
7
+ path = File::expand_path("#{DEFAULT_DATASETS_PATH}/#{template}.yml")
8
+ raise 'Dataset not found' unless File::exist? path
9
+ begin
10
+ return YAML.load_file(path)
11
+ rescue StandardError => e
12
+ raise e.message
13
+ end
14
+ end
15
+
16
+ def check_dataset_defined?(template:)
17
+ return File::exist? File::expand_path("#{DEFAULT_DATASETS_PATH}/#{template}.yml")
18
+ end
19
+
20
+ def write_dataset(template:, data:)
21
+ path = File::expand_path("#{DEFAULT_DATASETS_PATH}/#{template}.yml")
22
+ File.open(path, 'w') { |file| file.write(data.to_yaml) }
23
+ end
24
+
25
+ def open_yaml(filename:)
26
+ raise 'File not found' unless File::exist? filename
27
+ begin
28
+ return YAML.load_file(filename)
29
+ rescue StandardError => e
30
+ raise e.message
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,52 @@
1
+ # coding: utf-8
2
+
3
+ # base Splash namespace
4
+ module Appifier
5
+
6
+ module Services
7
+ # Exiter namespace
8
+ class Finisher
9
+
10
+ extend Carioca::Injector
11
+ inject service: :configuration
12
+ inject service: :logger
13
+
14
+ EXIT_MAP= configuration.settings.exit_cases
15
+
16
+
17
+ def self.terminate(return_case: nil, exit_case: nil, more: nil )
18
+ raise "Case must a return or an exit" if return_case and exit_case
19
+ do_exit( exit_case: exit_case, more: more) if exit_case
20
+ do_return(return_case: return_case, more: more) if return_case
21
+ end
22
+
23
+ # exiter wrapper
24
+ # @param [Hash] options
25
+ # @option options [Symbol] :case an exit case
26
+ # @option options [String] :more a complementary string to display
27
+ def self.do_exit(exit_case: :quiet_exit, more: nil )
28
+
29
+ mess = ""
30
+ mess = EXIT_MAP[exit_case][:message] if EXIT_MAP[exit_case].include? :message
31
+ mess << " : " unless mess.empty? or not more
32
+ mess << "#{more}" if more
33
+ if EXIT_MAP[exit_case][:code] == 0 then
34
+ logger.success mess unless mess.empty?
35
+ exit 0
36
+ else
37
+ logger.fatal mess unless mess.empty?
38
+ exit EXIT_MAP[exit_case][:code]
39
+ end
40
+ end
41
+
42
+ def self.do_return(return_case: :status_ok, more: nil )
43
+
44
+ data = EXIT_MAP[return_case].clone
45
+ data[:status] = (data[:code]>0)? :failure : :success
46
+ data[:more] = more if more
47
+ return data
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir["#{File.dirname(__FILE__)}/*.rb"].sort.each { |file| require file unless File.basename(file) == 'init.rb' }
@@ -8,8 +8,11 @@ module Appifier
8
8
  else
9
9
  config_file = search_file_in_gem('appifier', 'config/settings.yml')
10
10
  path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
11
- FileUtils.mkdir_p File.expand_path(path)
12
- FileUtils.cp config_file, File.expand_path(Appifier::DEFAULT_PATH)
11
+ [Appifier::DEFAULT_TEMPLATES_PATH, Appifier::DEFAULT_LOGS_PATH, Appifier::DEFAULT_CONFIG_PATH, Appifier::DEFAULT_DATASETS_PATH].each do |path|
12
+ FileUtils.mkdir_p File.expand_path(path)
13
+ end
14
+ File.open(File.expand_path("#{Appifier::DEFAULT_LOGS_PATH}/#{Appifier::DEFAULT_LOG_FILENAME}"), 'w') { |file| file.write("# Appifier : beginning of log file") }
15
+ FileUtils.cp config_file, File.expand_path(Appifier::DEFAULT_CONFIG_PATH)
13
16
  puts '[OK] Building config folder and initialize settings'
14
17
  end
15
18
  end
data/lib/appifier.rb CHANGED
@@ -6,19 +6,27 @@ require 'fileutils'
6
6
  require 'etc'
7
7
 
8
8
  include Thot
9
+
10
+
11
+ require 'appifier/version'
12
+ require 'appifier/helpers/init'
13
+
9
14
  module Appifier
10
15
  DEFAULT_PATH = '~/.appifier'
11
16
  DEFAULT_TEMPLATES_PATH = "#{DEFAULT_PATH}/templates"
12
- DEFAULT_CONFIG_PATH = "#{DEFAULT_PATH}/settings.yml"
17
+ DEFAULT_CONFIG_PATH = "#{DEFAULT_PATH}/config/"
18
+ DEFAULT_LOGS_PATH = "#{DEFAULT_PATH}/logs"
19
+ DEFAULT_DATASETS_PATH = "#{DEFAULT_PATH}/datasets"
20
+ DEFAULT_LOG_FILENAME = "appifier.log"
21
+ DEFAULT_SETTINGS_FILENAME = "settings.yml"
22
+ DEFAULT_REGISTRY = "config/appifier.registry"
13
23
  end
14
24
 
15
- require 'appifier/version'
16
- require 'appifier/helpers/init'
17
-
18
25
  Appifier::Helpers.constants.select { |c| Appifier::Helpers.const_get(c).is_a? Module }
19
26
  .map { |item| item = "Appifier::Helpers::#{item}" }
20
27
  .each { |mod| include Object.const_get(mod) }
21
28
 
29
+
22
30
  require 'appifier/setup'
23
31
  require 'appifier/actors/init'
24
32
 
@@ -28,20 +36,26 @@ unless File.exist? File.expand_path(Appifier::DEFAULT_CONFIG_PATH)
28
36
  end
29
37
 
30
38
  Carioca::Registry.configure do |spec|
31
- spec.init_from_file = false
39
+ spec.filename = "#{search_file_in_gem('appifier', Appifier::DEFAULT_REGISTRY )}"
40
+ spec.init_from_file = true
32
41
  spec.debug = true if ENV['DEBUG']
33
- spec.log_file = '/tmp/appifier.log'
34
- spec.config_file = './config/settings.yml'
42
+ spec.log_file = File.expand_path("#{Appifier::DEFAULT_LOGS_PATH}/#{Appifier::DEFAULT_LOG_FILENAME}")
43
+ spec.config_file = File.expand_path("#{Appifier::DEFAULT_CONFIG_PATH}/#{Appifier::DEFAULT_SETTINGS_FILENAME}")
35
44
  spec.config_root = :appifier
36
45
  spec.environment = :production
37
- spec.default_locale = :fr
38
- spec.locales_load_path << Dir["#{File.expand_path('./config/locales')}/*.yml"]
46
+ spec.output_mode = :dual
47
+ spec.output_emoji = true
48
+ spec.output_colors = true
39
49
  end
40
50
 
51
+ require_relative 'appifier/services/init'
52
+
41
53
  module Appifier
42
54
  class Application < Carioca::Container
43
55
  inject service: :configuration
44
56
  inject service: :i18n
45
- logger.info(to_s) { 'Running Appifier' }
57
+ inject service: :terminator
46
58
  end
47
59
  end
60
+
61
+ require_relative 'appifier/components/init'
@@ -0,0 +1,12 @@
1
+ ---
2
+ :template:
3
+ :dataset:
4
+ :appname:
5
+ :description: The application name
6
+ :default: test_application
7
+ :format: \w+
8
+ :actions:
9
+ :deploy: {}
10
+ :run: {}
11
+ :build: {}
12
+ :publish: {}
data/samples/dummy.tgz CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Camille Paquet
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-10-19 00:00:00.000000000 Z
12
+ date: 2022-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: code_statistics
@@ -129,14 +129,14 @@ dependencies:
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '2.0'
132
+ version: 2.0.9
133
133
  type: :runtime
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '2.0'
139
+ version: 2.0.9
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: thor
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -151,6 +151,20 @@ dependencies:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
153
  version: '1.2'
154
+ - !ruby/object:Gem::Dependency
155
+ name: tty-prompt
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.23.1
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.23.1
154
168
  description: 'Appifier : Applications templating and management tools '
155
169
  email:
156
170
  - gems@ultragreen.net
@@ -169,29 +183,37 @@ files:
169
183
  - appifier.gemspec
170
184
  - bin/console
171
185
  - bin/setup
186
+ - config/appifier.registry
172
187
  - config/settings.yml
173
188
  - exe/appifier
174
189
  - lib/appifier.rb
190
+ - lib/appifier/actors/collector.rb
175
191
  - lib/appifier/actors/generator.rb
176
192
  - lib/appifier/actors/init.rb
177
193
  - lib/appifier/actors/retriever.rb
178
194
  - lib/appifier/cli.rb
179
195
  - lib/appifier/cli/configuration.rb
180
196
  - lib/appifier/cli/templates.rb
197
+ - lib/appifier/components/Appifile.rb
198
+ - lib/appifier/components/init.rb
199
+ - lib/appifier/components/templates.rb
181
200
  - lib/appifier/helpers/archives.rb
201
+ - lib/appifier/helpers/datasets.rb
182
202
  - lib/appifier/helpers/gem.rb
183
203
  - lib/appifier/helpers/init.rb
184
- - lib/appifier/helpers/templates.rb
185
204
  - lib/appifier/helpers/user.rb
205
+ - lib/appifier/services/finisher.rb
206
+ - lib/appifier/services/init.rb
186
207
  - lib/appifier/setup.rb
187
208
  - lib/appifier/version.rb
188
209
  - samples/dummy.tgz
189
- - samples/skeleton/%%APPNAME.downcase%%/.rspec
190
- - samples/skeleton/%%APPNAME.downcase%%/Rakefile
191
- - samples/skeleton/%%APPNAME.downcase%%/config.ru
192
- - samples/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%%
193
- - samples/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb
194
- - samples/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb
210
+ - samples/dummy/Appifile
211
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/.rspec
212
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/Rakefile
213
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/config.ru
214
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%%
215
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb
216
+ - samples/dummy/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb
195
217
  homepage: https://github.com/Ultragreen/appifier
196
218
  licenses:
197
219
  - MIT
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appifier
4
- module Helpers
5
- module Templates
6
- def list_bundled_templates
7
- template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
8
- Dir.glob("#{template_path}/*").map { |item| item.delete_prefix("#{template_path}/") }.each do |template|
9
- puts " * #{template}"
10
- end
11
- end
12
-
13
- def rm_bundled_template(template)
14
- template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
15
- begin
16
- if FileUtils.rm_rf "#{template_path}/#{template}"
17
- puts "[RM] Template #{template} deleted of bundle for user #{current_user}"
18
- else
19
- puts "[ERROR] Template #{template} not found in bundle for user #{current_user}"
20
- end
21
- rescue Errno::ENOENT
22
- puts "[ERROR] Template #{template} not found in bundle for user #{current_user}"
23
- end
24
- end
25
- end
26
- end
27
- end