fox 0.0.2 → 0.4.0

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +196 -14
  3. data/bin/fox +28 -8
  4. data/fox.gemspec +41 -3
  5. data/lib/fox.rb +23 -10
  6. data/lib/fox/cli.rb +17 -0
  7. data/lib/fox/configuration.rb +48 -0
  8. data/lib/fox/core_ext.rb +8 -0
  9. data/lib/fox/core_ext/array.rb +51 -0
  10. data/lib/fox/core_ext/hash.rb +17 -0
  11. data/lib/fox/core_ext/io_binary_read.rb +20 -0
  12. data/lib/fox/error.rb +8 -0
  13. data/lib/fox/error/errors.rb +232 -0
  14. data/lib/fox/interface/thor/all.rb +34 -0
  15. data/lib/fox/interface/thor/configuration.rb +71 -0
  16. data/lib/fox/interface/thor/create.rb +49 -0
  17. data/lib/fox/interface/thor/default.rb +67 -0
  18. data/lib/fox/interface/thor/init.rb +57 -0
  19. data/lib/fox/interface/thor/mixin/config_choice.rb +3 -3
  20. data/lib/fox/interface/thor/mixin/configuration.rb +1 -1
  21. data/lib/fox/interface/thor/mixin/database.rb +129 -0
  22. data/lib/fox/interface/thor/mixin/default.rb +6 -0
  23. data/lib/fox/interface/thor/mixin/default_model.rb +13 -0
  24. data/lib/fox/interface/thor/mixin/generators/base_generator.rb +35 -0
  25. data/lib/fox/interface/thor/mixin/generators/structure.rb +41 -0
  26. data/lib/fox/interface/thor/mixin/generators/template_loader.rb +48 -0
  27. data/lib/fox/interface/thor/mixin/history.rb +12 -0
  28. data/lib/fox/interface/thor/mixin/logger.rb +2 -2
  29. data/lib/fox/interface/thor/mixin/model.rb +19 -0
  30. data/lib/fox/interface/thor/new.thor +74 -0
  31. data/lib/fox/interface/thor/version.rb +59 -0
  32. data/lib/fox/library/choice.rb +160 -0
  33. data/lib/fox/library/logger.rb +175 -0
  34. data/lib/fox/library/project_builder.rb +83 -0
  35. data/lib/fox/library/secure_config.rb +114 -0
  36. metadata +298 -7
  37. data/lib/fox/interface/thor/version.thor +0 -33
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # System include
4
+ require 'thor'
5
+
6
+ # Custom include
7
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/default' )
8
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/logger' )
9
+
10
+ # require File.expand_path(File.dirname(__FILE__) + '/mixin/generators/java_generator')
11
+
12
+
13
+ # @class class Create
14
+ # @brief Generate scaffolded output
15
+ class Create < Thor
16
+
17
+ # Include various partials
18
+ include ::Mixin::Default
19
+ include ::Mixin::Logger
20
+
21
+ default_task :create
22
+
23
+ GENS = Mixin::Generators
24
+
25
+ # # @fn def create file {{{
26
+ # # @brief FIXME
27
+ # #
28
+ # desc "create FOLDER", "generate from thrift `FILE` a template for `languages`, and write result into `output` directory (gen-* packages)"
29
+ # option :output, :aliases => :o, :type => :string, :default => Dir.pwd
30
+ # option :version, :aliases => :v, :type => :string, :default => "0.0.1"
31
+ # option :java
32
+
33
+ # def create file
34
+ # @logger.message :info, "Running Fox #create for #{file.to_s}"
35
+ #
36
+ # output = options["output"]
37
+ # version = options["version"]
38
+ #
39
+ # langs = options.keys & languages
40
+ #
41
+ # langs.each do |lang|
42
+ # klass = Object.const_get("#{GENS}::JavaGenerator")
43
+ # klass.generate( file, version, output )
44
+ # end
45
+ # end # def create # }}}
46
+
47
+ end # of class CreateCommand
48
+
49
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # System include
4
+ require 'thor'
5
+ require 'data_mapper'
6
+
7
+ # Custom include
8
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/default' )
9
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/logger' )
10
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/database' )
11
+ require File.expand_path( File.dirname( __FILE__ ) + '/version' )
12
+
13
+ # @class class Default
14
+ # @brief work with user Structures
15
+ class Default < Thor
16
+
17
+ # Include various partials
18
+ include ::Mixin::Default
19
+ include ::Mixin::Logger
20
+ include ::Mixin::Database
21
+
22
+ default_task :set
23
+
24
+ # @fn def set version {{{
25
+ # @brief set default Model for work
26
+ #
27
+ # @param [String] - version number
28
+ desc "set MODEL VERSION", "set default MODEL and VERSION for work"
29
+ def set model, version = nil
30
+ @logger.message :info, "Running Fox #default for #{model}"
31
+
32
+ models = all_models.map(&:name)
33
+ if models.map(&:downcase).include?(model.downcase)
34
+ set_default_model model
35
+ @logger.message :info, "Set '#{model.to_s.capitalize}' model as default Structure for work"
36
+
37
+ if version
38
+ Version.new.set(version)
39
+ end
40
+
41
+ else
42
+ abort(%Q(Model '#{model.capitalize}' not found.\n Available models:\n#{models.sort.join("\n")}))
43
+ end
44
+ end # of def set # }}}
45
+
46
+ # @fn def now {{{
47
+ desc "now", "return default Model"
48
+ def now
49
+ @logger.message :info, "Running Fox Default#now"
50
+ default_model = get_default_model
51
+
52
+ if default_model.nil?
53
+ puts "Default model not set"
54
+ puts "Set with `fox default set <ModelName>`"
55
+ else
56
+ version = if default_model.version.nil?
57
+ "\nversion not defined. Define with `fox version set <Version>`"
58
+ else
59
+ "version: #{default_model.version}"
60
+ end
61
+ puts "Default Model: #{default_model.name} #{version}"
62
+ end
63
+ end # of def now
64
+
65
+ end # of class Default
66
+
67
+
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # System includes
4
+ require 'thor'
5
+ require 'data_mapper'
6
+ require 'dm-migrations'
7
+ require 'fileutils'
8
+
9
+ # Custom includes
10
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/default' )
11
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/logger' )
12
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/history' )
13
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/model' )
14
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/default_model' )
15
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/database' )
16
+
17
+
18
+ # @class class Init < Thor
19
+ # @brief Initializes project default config environment
20
+ class Init < Thor
21
+
22
+ # Include various partials
23
+ include ::Mixin::Default
24
+ include ::Mixin::Logger
25
+ include ::Mixin::Database
26
+
27
+ default_task :init
28
+
29
+ # @fn def init # {{{
30
+ # @brief initialize project, create database for project
31
+ desc 'init', 'initialize project'
32
+ option :force, :aliases => :f
33
+ def init
34
+
35
+ path_to_db_folder = "#{Dir.pwd}/.fox"
36
+ db_path = "#{path_to_db_folder}/#{default_db_name}"
37
+
38
+ # if database exist need stop
39
+ abort("(EE) Found $PWD/.fox - Project already initialized, aborting") if( File.exist?(db_path) && !options['force'] )
40
+
41
+ FileUtils.mkdir_p("#{path_to_db_folder}")
42
+
43
+ DataMapper.setup(:default, %Q(sqlite:///#{db_path}))
44
+ DataMapper.auto_migrate!
45
+ DataMapper.finalize
46
+
47
+ puts "(II) Project initialized"
48
+ end # of def init }}}
49
+
50
+ private
51
+ def default_db_name
52
+ "fox.db"
53
+ end
54
+
55
+ end # if class Init
56
+
57
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -9,8 +9,8 @@ module Mixin
9
9
  module ConfigChoice
10
10
 
11
11
  def config_choice
12
- defaults = YAML.load_file(File.expand_path( File.dirname( __FILE__ ) + '/../../../template/default_values.yml'))
13
- defaults['jason'].each_key { |key| choice_option(defaults['jason'], key) }
12
+ defaults = YAML.load_file(File.expand_path( File.dirname( __FILE__ ) + '/../../../template/config/default_values.yml'))
13
+ defaults['fox'].each_key { |key| choice_option(defaults['fox'], key) }
14
14
  defaults
15
15
  end
16
16
 
@@ -24,4 +24,4 @@ module Mixin
24
24
  end # of module Mixin
25
25
 
26
26
 
27
- # vim:ts=2:tw=100:wm=100:syntax=ruby
27
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -16,7 +16,7 @@ module Mixin
16
16
  def initialize *args
17
17
  super
18
18
  unless File.exist?("~/.fox/config.yaml")
19
- abort("Could not find configuration file in ~/fox/config.yaml. Please run 'fox config:generate' to generate it.")
19
+ abort("Could not find configuration file in ~/.fox/config.yaml. Please run 'fox config:generate' to generate it.")
20
20
  end
21
21
  end # }}}
22
22
 
@@ -0,0 +1,129 @@
1
+ # System includes
2
+ require 'data_mapper'
3
+
4
+ # Custom includes
5
+ require File.expand_path( File.dirname( __FILE__ ) + '/history' )
6
+ require File.expand_path( File.dirname( __FILE__ ) + '/model' )
7
+ require File.expand_path( File.dirname( __FILE__ ) + '/default_model' )
8
+
9
+ # @module module Mixin
10
+ # @brief Mixin module contains various functions to be used in other components
11
+ module Mixin
12
+
13
+ # @module Database Module
14
+ # @brief Module wrapper around database tasks
15
+ module Database
16
+ extend self
17
+
18
+ DataMapper.setup(:default, %Q(sqlite:///#{Dir.pwd}/.fox/fox.db))
19
+
20
+ # @fn def write command # {{{
21
+ # @brief save command in database
22
+ #
23
+ # @param [String] command - command name
24
+ #
25
+ # @param [Array] arguments - arguments for command
26
+ def add_command command, *arguments
27
+ history = History.new
28
+ history.command = command
29
+ history.arguments = arguments.join(" ")
30
+ history.save
31
+ end # of def write }}}
32
+
33
+ # @fn def add_model model_name, version, uuid # {{{
34
+ # @brief save Model into database
35
+ #
36
+ # @param [String] model_name - name of Structure
37
+ #
38
+ # @param [String] version - version of Structure
39
+ #
40
+ # @param [String] uuid - uuid of Structure
41
+ def add_model model_name, version, uuid
42
+ model = Model.new
43
+ model.name = model_name
44
+ model.version = version
45
+ model.uuid = uuid
46
+
47
+ model.save
48
+ end # of def add_model }}}
49
+
50
+ # @fn def set_default_model model_name # {{{
51
+ # @brief Set default Model for usage
52
+ #
53
+ # @param [String] - model_name - name of Structure
54
+ def set_default_model model_name
55
+ # clear all models, when set default
56
+ DefaultModel.destroy!
57
+ default_model = DefaultModel.new
58
+ default_model.name = model_name
59
+ default_model.save
60
+ end # of set_default_model }}}
61
+
62
+ # @fn def get_default_model # {{{
63
+ # @brief return current default model
64
+ def get_default_model
65
+ DefaultModel.first
66
+ end # of def get_default_model }}}
67
+
68
+ # @fn def clear_default_model # {{{
69
+ # @brief remove default model
70
+ def clear_default_model
71
+ DefaultModel.destroy!
72
+ end # of def clear_default_model # }}}
73
+
74
+ # @fn def set_default_model_version version # {{{
75
+ # @brief Set default Model version for usage
76
+ #
77
+ # @param [String] - model_name - version of Structure
78
+ def set_default_model_version version
79
+ default_model = DefaultModel.first
80
+ default_model.version = version
81
+ model = Model.all(:conditions => { :name => default_model.name, :version => version}).first
82
+ #should save with uuid
83
+ default_model.uuid = model.uuid
84
+ default_model.save
85
+ end # of def set_default_model_version }}}
86
+
87
+ # @fn def all_models {{{
88
+ # @brief Get all Models in database
89
+ #
90
+ def all_models
91
+ Model.all
92
+ end # of def all_models }}}
93
+
94
+ # @fn def check_if_version_available_for_model model, version # {{{
95
+ # @brief check if model exist with given version
96
+ #
97
+ # @param [String] model - model name
98
+ #
99
+ # @param [String] version - version number
100
+ #
101
+ # @return [Boolean] true, when model exist, otherwise - false
102
+ def check_if_version_available_for_model model, version
103
+ model = Model.all(:conditions => { :name => model, :version => version}).first
104
+ if model.nil?
105
+ false
106
+ else
107
+ true
108
+ end
109
+ end # of def check_if_version_available_for_model }}}
110
+
111
+ # @fn def default_model_defined? # {{{
112
+ # @brief check if model name for default is set
113
+ #
114
+ # @return [Boolean] true, when defined
115
+ def default_model_defined?
116
+ default_model = DefaultModel.first
117
+ if default_model.nil?
118
+ false
119
+ else
120
+ true
121
+ end
122
+ end # of def default_model_defined? # }}}
123
+
124
+ end # of Module Database
125
+
126
+ end # of module Mixin
127
+
128
+
129
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -22,6 +22,12 @@ module Mixin
22
22
  super
23
23
  end # }}}
24
24
 
25
+ # @fn def languages {{{
26
+ # @brief return supported languges at the current moment
27
+ def languages
28
+ %w{java}
29
+ end # of def languages
30
+
25
31
  end # of module Default
26
32
 
27
33
  end # of module Mixin
@@ -0,0 +1,13 @@
1
+ require 'data_mapper'
2
+
3
+ # @class class Model
4
+ # @brief mapper for Model table, save information about all created Models
5
+ class DefaultModel
6
+ include DataMapper::Resource
7
+
8
+ property :id, Serial
9
+ property :name, String
10
+ property :version, String
11
+ property :uuid, String
12
+ end # of class Model
13
+
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # System includes
4
+ require 'fileutils'
5
+ require 'tmpdir'
6
+
7
+ # Custom include
8
+ require File.expand_path( File.dirname( __FILE__ ) + '/template_loader' )
9
+
10
+
11
+ module Mixin
12
+
13
+ # @module module Generators
14
+ # @brief Default Namespace for all Generators
15
+ module Generators
16
+
17
+ # @module module BaseGenerator
18
+ # @brief Contain shared methods which will be used in other Generators
19
+ module BaseGenerator
20
+
21
+ # @fn def load_template language {{{
22
+ # @brief load template for target language
23
+ #
24
+ # @param [String] - target language
25
+ #
26
+ # @return [String] - loaded template for target language
27
+ def load_template language
28
+ TemplateLoader.load(language)
29
+ end # def load_template }}}
30
+
31
+ end # of module BaseGenerator
32
+ end # of module Generators
33
+ end # of module Fox
34
+
35
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #!/usr/bin/env ruby
4
+
5
+
6
+ module Mixin
7
+
8
+ # @module module Generators
9
+ # @brief Default Namespace for all Generators
10
+ module Generators
11
+
12
+ # @class class Structure
13
+ # @brief map thrift structure to ruby class
14
+ class Structure
15
+
16
+ # @attribute [w] - structure_name [Symbol] from generated ruby code
17
+ # @attribute [w] - params [Hash] with types and names of params arguments
18
+ # @attribute [w] - structure type
19
+ attr_accessor :structure_name, :params, :type
20
+
21
+ # @fn def initialize structure_name, params {{{
22
+ # @brief Structure constructor
23
+ #
24
+ # @param [Symbol] type Type of Structure (class, enum)
25
+ # @param [String] structure_name Name for structure
26
+ # @param [Hash] params Fields for user defined structure
27
+ def initialize type, structure_name, params
28
+ @type = type
29
+ if @type == :class
30
+ raise RuntimeException.new("Params for #{structure_name} empty") if params.size == 0
31
+ @structure_name, @params = structure_name, params
32
+ else
33
+ @structure_name = structure_name
34
+ end
35
+ end # def initialize }}}
36
+
37
+ end # of class Structure
38
+ end # of module Generators
39
+ end # of module Mixin
40
+
41
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox/error/errors'
4
+
5
+ module Mixin
6
+
7
+ # @module module Generators
8
+ # @brief Default Namespace for all Generators
9
+ module Generators
10
+ # @module TemplateLoader
11
+ # @brief module for load template for target language
12
+ module TemplateLoader
13
+
14
+ extend self
15
+
16
+ # default template directory
17
+ TEMPLATE_DIR = 'template'
18
+
19
+ # @fn def load language {{{
20
+ # @brief Load template for target language
21
+ #
22
+ # @param [String] Target language
23
+ #
24
+ # @return [String] Result template source
25
+ def load language
26
+ file = templates.find { |file| File.basename(file).start_with?(language) }
27
+
28
+ raise Fox::LoadTemplateError.new("Template for #{language} not found") if file.nil?
29
+
30
+ File.read(file)
31
+ end
32
+
33
+ # of def load }}}
34
+
35
+ # @fn def templates {{{
36
+ # @brief Get list of all templates from `TEMPLATE_DIR`
37
+ #
38
+ # @return [Array<String>] List of all templates
39
+ def templates
40
+ path = File.expand_path( File.dirname( __FILE__ ) + '../../../../../')
41
+ Dir["#{path}/#{TEMPLATE_DIR}/*_template.erb"]
42
+ end # of def templates }}}
43
+
44
+ end # of module TemplateLoader
45
+ end # of module Generators
46
+ end # of Mixin
47
+
48
+ # vim:ts=2:tw=100:wm=100:syntax=ruby