pointrb 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +40 -26
- data/README.md +1 -86
- data/Rakefile +5 -0
- data/TODO.md +35 -1
- data/bin/pointrb +35 -0
- data/cucumber.yml +3 -0
- data/features/create_layout.feature +96 -0
- data/features/create_new_project.feature +29 -0
- data/features/pointrb_setup.feature +22 -0
- data/features/step_definitions.rb +96 -0
- data/features/support/env.rb +26 -0
- data/features/support/helper.rb +62 -0
- data/features/test.feature +0 -0
- data/gemfiles/Gemfile.default +2 -1
- data/lib/bob_the_helper/command/command_result.rb +12 -0
- data/lib/bob_the_helper/command.rb +49 -0
- data/lib/bob_the_helper/environment.rb +27 -0
- data/lib/bob_the_helper/file_system/exceptions.rb +11 -0
- data/lib/bob_the_helper/file_system.rb +245 -0
- data/lib/bob_the_helper.rb +5 -0
- data/lib/pointrb/actions/check_if_pointrb_has_already_been_initialized.rb +15 -0
- data/lib/pointrb/actions/check_project_path.rb +15 -0
- data/lib/pointrb/actions/create_layout.rb +16 -0
- data/lib/pointrb/actions/create_project_wrapper.rb +15 -0
- data/lib/pointrb/actions/determine_layout_directory.rb +14 -0
- data/lib/pointrb/actions/error_handler_commandline.rb +39 -0
- data/lib/pointrb/actions/initialize_pointrb.rb +15 -0
- data/lib/pointrb/actions/retrieve_layout_files.rb +16 -0
- data/lib/pointrb/actions/retrieve_parsed_layout.rb +17 -0
- data/lib/pointrb/actions/set_project_name.rb +15 -0
- data/lib/pointrb/actions/show_pointrb_version.rb +14 -0
- data/lib/pointrb/api.rb +36 -0
- data/lib/pointrb/directory.rb +25 -0
- data/lib/pointrb/exceptions.rb +22 -0
- data/lib/pointrb/layout.rb +16 -0
- data/lib/pointrb/layout_constructor.rb +58 -0
- data/lib/pointrb/layout_file.rb +24 -0
- data/lib/pointrb/layout_manager.rb +32 -0
- data/lib/pointrb/layout_storage_manager.rb +40 -0
- data/lib/pointrb/layout_tree.rb +45 -0
- data/lib/pointrb/pointrb_file.rb +33 -0
- data/lib/pointrb/project.rb +11 -0
- data/lib/pointrb/version.rb +1 -1
- data/lib/pointrb.rb +32 -0
- data/pointrb.gemspec +3 -2
- data/script/terminal +1 -0
- data/spec/bob_the_helper/command/command_spec.rb +55 -0
- data/spec/bob_the_helper/environment/environment_spec.rb +15 -0
- data/spec/bob_the_helper/file_system/file_system_spec.rb +279 -0
- data/spec/directory/directory_spec.rb +30 -0
- data/spec/hooks.rb +5 -0
- data/spec/layout/layout_spec.rb +20 -0
- data/spec/layout_constructor/layout_constructor_spec.rb +122 -0
- data/spec/layout_file/layout_file_spec.rb +49 -0
- data/spec/layout_manager/layout_manager_spec.rb +47 -0
- data/spec/layout_storage_manager/layout_storage_manager_spec.rb +58 -0
- data/spec/layout_tree/layout_tree_spec.rb +70 -0
- data/spec/pointrb_file/pointrb_file_spec.rb +34 -0
- data/spec/project/project_spec.rb +19 -0
- data/spec/spec_helper.rb +9 -13
- data/spec/support/capture.rb +19 -0
- data/spec/support/env.rb +0 -0
- data/spec/support/helper.rb +8 -0
- data/spec/support/hooks.rb +5 -0
- metadata +104 -5
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
|
4
|
+
class Directory
|
5
|
+
|
6
|
+
attr_accessor :path, :base_dir
|
7
|
+
|
8
|
+
def initialize(path,base_dir="")
|
9
|
+
@path = path
|
10
|
+
@base_dir = base_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_path
|
14
|
+
if @path =~ /^\//
|
15
|
+
@path
|
16
|
+
else
|
17
|
+
File.join(@base_dir, @path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
FileUtils.mkdir_p full_path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
module Exceptions
|
4
|
+
# Raised if file does not exist
|
5
|
+
class FileNotFound < Exception; end
|
6
|
+
|
7
|
+
# Raised if requested layout was not
|
8
|
+
# available
|
9
|
+
class LayoutNotFound < Exception; end
|
10
|
+
|
11
|
+
# Raised if one has a layout with an
|
12
|
+
# invalid syntax
|
13
|
+
class SyntaxErrorInLayout < Exception; end
|
14
|
+
|
15
|
+
# Raised if project path exists
|
16
|
+
class ProjectPathExists < Exception; end
|
17
|
+
|
18
|
+
# Raised if one tries to initialize a system
|
19
|
+
# which has already been initialized
|
20
|
+
class Exceptions::PointRbWasAlreadInitialized < Exception; end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutConstructor
|
4
|
+
|
5
|
+
def initialize(project)
|
6
|
+
@project = project
|
7
|
+
@layout = Layout.new
|
8
|
+
|
9
|
+
#this is the root directory and will be used by all other
|
10
|
+
#child nodes
|
11
|
+
root_node = Directory.new(@project.path)
|
12
|
+
@tree = LayoutTree.new(root_node)
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_dsl(content, path)
|
16
|
+
|
17
|
+
begin
|
18
|
+
instance_eval(content, path)
|
19
|
+
rescue Exception => e
|
20
|
+
file, line_number = filter_file_and_line_number(e.backtrace.first)
|
21
|
+
raise Exceptions::SyntaxErrorInLayout, "Syntax error in layout-file \"#{file}\" at line #{line_number}."
|
22
|
+
end
|
23
|
+
|
24
|
+
@layout.actions = @tree.serialize do |node|
|
25
|
+
#set base_dir based on parent directory
|
26
|
+
node.content.base_dir = node.parent.content.full_path if node.parent
|
27
|
+
#return the Directory-object
|
28
|
+
node.content
|
29
|
+
end
|
30
|
+
|
31
|
+
@layout
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def filter_file_and_line_number(backtrace)
|
37
|
+
backtrace.split(':')[0..1]
|
38
|
+
end
|
39
|
+
|
40
|
+
def layout(name, &block)
|
41
|
+
@layout.name = name.to_sym
|
42
|
+
|
43
|
+
block.call
|
44
|
+
end
|
45
|
+
|
46
|
+
def directory(path, &block)
|
47
|
+
@tree.add_node Directory.new(path)
|
48
|
+
block.call if block
|
49
|
+
@tree.up
|
50
|
+
end
|
51
|
+
|
52
|
+
def file(path, &block)
|
53
|
+
content = block.call.to_s
|
54
|
+
@tree.add_node PointRbFile.new(path, content)
|
55
|
+
@tree.up
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
# layouts
|
4
|
+
class LayoutFile
|
5
|
+
|
6
|
+
include Comparable
|
7
|
+
|
8
|
+
attr_reader :path
|
9
|
+
|
10
|
+
def initialize(path)
|
11
|
+
raise Exceptions::FileNotFound, "You tell me to use '#{path}' as path to the layout. But this file does not exist." unless File.exists? path
|
12
|
+
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
|
16
|
+
def content
|
17
|
+
File.read(@path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def <=>(other)
|
21
|
+
self.path <=> other.path
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutManager
|
4
|
+
|
5
|
+
def initialize(layout_files, project)
|
6
|
+
@layout_files = layout_files
|
7
|
+
@project = project
|
8
|
+
|
9
|
+
@layout_contructor = LayoutConstructor.new(project)
|
10
|
+
@layouts = @layout_files.collect { |f| construct_layout(f.content, f.path) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def retrieve(name)
|
14
|
+
result_of_search = @layouts.find { |l| l.name == name }
|
15
|
+
|
16
|
+
raise Exceptions::LayoutNotFound, "Sorry I'm not able to find the requested layout file (#{name}). Please make sure it's avaiable at the layout directory." unless result_of_search
|
17
|
+
|
18
|
+
result_of_search
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def construct_layout(content, path)
|
24
|
+
@layout_contructor.parse_dsl(content, path)
|
25
|
+
end
|
26
|
+
|
27
|
+
#def retrieve_all
|
28
|
+
# @layouts
|
29
|
+
#end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutStorageManager
|
4
|
+
private
|
5
|
+
|
6
|
+
include BobTheHelper::FileSystem
|
7
|
+
|
8
|
+
public
|
9
|
+
|
10
|
+
def initialize(layout_directory, layout_file=LayoutFile)
|
11
|
+
@layout_directory = layout_directory
|
12
|
+
@layout_file_klass = layout_file
|
13
|
+
@layout_files = retrieve_layout_files('*.layout')
|
14
|
+
end
|
15
|
+
|
16
|
+
def retrieve(path)
|
17
|
+
@layout_files.find { |l| l.path == path}
|
18
|
+
end
|
19
|
+
|
20
|
+
def retrieve_all
|
21
|
+
@layout_files
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def retrieve_layout_files(filter)
|
27
|
+
pattern = File.join(working_directory, "#{filter}")
|
28
|
+
layout_files = Dir.glob(pattern)
|
29
|
+
layout_files.collect { |f| @layout_file_klass.new(f) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def root_directory
|
33
|
+
@layout_directory
|
34
|
+
end
|
35
|
+
|
36
|
+
def working_directory
|
37
|
+
root_directory
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutTree
|
4
|
+
|
5
|
+
attr_reader :tree, :active_node
|
6
|
+
|
7
|
+
def initialize(root_node)
|
8
|
+
@counter = -1
|
9
|
+
@tree = Tree::TreeNode.new(node_id, root_node)
|
10
|
+
@active_node = @tree
|
11
|
+
@prng = Random.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_node(node)
|
15
|
+
node = Tree::TreeNode.new(node_id, node)
|
16
|
+
@active_node << node
|
17
|
+
@active_node = node
|
18
|
+
end
|
19
|
+
|
20
|
+
def up
|
21
|
+
@active_node = @active_node.parent
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize(&block)
|
25
|
+
serialized_tree = []
|
26
|
+
|
27
|
+
#default action during serialize
|
28
|
+
block = lambda { |node| node.content } unless block
|
29
|
+
@tree.each do |node|
|
30
|
+
serialized_tree << block.call(node)
|
31
|
+
end
|
32
|
+
|
33
|
+
serialized_tree
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def node_id
|
39
|
+
@counter += 1
|
40
|
+
|
41
|
+
"node#{@counter}"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class PointRbFile
|
4
|
+
|
5
|
+
attr_accessor :path, :base_dir, :content
|
6
|
+
|
7
|
+
def initialize(path, content)
|
8
|
+
@path = path
|
9
|
+
@base_dir = ''
|
10
|
+
@content = canonize_string(content)
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_path
|
14
|
+
if @path =~ /^\//
|
15
|
+
@path
|
16
|
+
else
|
17
|
+
File.join(@base_dir, @path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
File.open(full_path, "wb") do |f|
|
23
|
+
f.write content
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def canonize_string(str)
|
30
|
+
str.strip_heredoc.gsub(/^\n/, '')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/pointrb/version.rb
CHANGED
data/lib/pointrb.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'tree'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'active_support/core_ext/string/strip'
|
4
|
+
require 'middleware'
|
5
|
+
|
6
|
+
require 'bob_the_helper'
|
7
|
+
|
8
|
+
require 'pointrb/version'
|
9
|
+
require 'pointrb/exceptions'
|
10
|
+
require 'pointrb/project'
|
11
|
+
require 'pointrb/directory'
|
12
|
+
require 'pointrb/pointrb_file'
|
13
|
+
require 'pointrb/layout_tree'
|
14
|
+
require 'pointrb/layout'
|
15
|
+
require 'pointrb/layout_file'
|
16
|
+
require 'pointrb/layout_storage_manager'
|
17
|
+
require 'pointrb/layout_constructor'
|
18
|
+
require 'pointrb/layout_manager'
|
19
|
+
|
20
|
+
require 'pointrb/actions/error_handler_commandline'
|
21
|
+
require 'pointrb/actions/create_project_wrapper'
|
22
|
+
require 'pointrb/actions/check_project_path'
|
23
|
+
require 'pointrb/actions/determine_layout_directory'
|
24
|
+
require 'pointrb/actions/retrieve_layout_files'
|
25
|
+
require 'pointrb/actions/retrieve_parsed_layout'
|
26
|
+
require 'pointrb/actions/create_layout'
|
27
|
+
require 'pointrb/actions/check_if_pointrb_has_already_been_initialized'
|
28
|
+
require 'pointrb/actions/initialize_pointrb'
|
29
|
+
require 'pointrb/actions/show_pointrb_version'
|
30
|
+
require 'pointrb/api'
|
31
|
+
|
32
|
+
module PointRb; end
|
data/pointrb.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = PointRb::VERSION
|
9
9
|
gem.authors = ["Max Meyer"]
|
10
10
|
gem.email = ["dev@fedux.org"]
|
11
|
-
gem.description = %q{Initialize project
|
11
|
+
gem.description = %q{Initialize project directory base on templates}
|
12
12
|
gem.summary = <<-EOF
|
13
13
|
PointRb is a project initializer which helps you to create a directory structure
|
14
14
|
for your project. It supports profiles so that you can use different layouts for
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
22
22
|
gem.require_paths = ["lib"]
|
23
23
|
|
24
|
-
gem.add_runtime_dependency '
|
24
|
+
gem.add_runtime_dependency 'activesupport'
|
25
25
|
gem.add_runtime_dependency 'middleware'
|
26
|
+
gem.add_runtime_dependency 'rubytree'
|
26
27
|
end
|
data/script/terminal
CHANGED
@@ -9,4 +9,5 @@ tmux.new_session(session_name: 'pointrb')
|
|
9
9
|
tmux.new_window(:name => 'code', :command => "zsh -c 'vim -p lib/**/*.rb'")
|
10
10
|
tmux.new_window(:name => 'spec', :command => "zsh -c 'vim -p spec/**/*.rb'")
|
11
11
|
tmux.new_window(:name => 'features', :command => "zsh -c 'vim -p features/**/*.{rb,feature}'")
|
12
|
+
tmux.new_window(:name => 'doc', :command => "zsh -c 'vim -p *.md'")
|
12
13
|
tmux.start
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BobTheHelper::Command do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
cleanup_working_directory
|
7
|
+
end
|
8
|
+
|
9
|
+
it "runs commands" do
|
10
|
+
stdout = 'hello world'
|
11
|
+
command = "echo #{stdout}"
|
12
|
+
search_path = [ '/usr/bin' ]
|
13
|
+
result = run_command(command, search_path: search_path)
|
14
|
+
|
15
|
+
expect(result.stdout).to eq(stdout + "\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "runs commands with default <root>/bin" do
|
19
|
+
end
|
20
|
+
|
21
|
+
it "takes input and run commands" do
|
22
|
+
stdin = 'hello world'
|
23
|
+
command = 'cat'
|
24
|
+
search_path = [ '/usr/bin' ]
|
25
|
+
result = run_command(command, stdin: stdin, search_path: search_path)
|
26
|
+
|
27
|
+
expect(result.stdout).to eq(stdin)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "makes use of ENV" do
|
31
|
+
env = { 'THIS_IS_A_LONG_VARIABLE' => 'hello_world' }
|
32
|
+
env_output = "THIS_IS_A_LONG_VARIABLE=hello_world\n"
|
33
|
+
search_path = [ '/usr/bin' ]
|
34
|
+
command = 'env | grep THIS_IS'
|
35
|
+
|
36
|
+
result = run_command(command, env: env, search_path: search_path)
|
37
|
+
expect(result.stdout).to eq(env_output)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "checks if a directory/file exists" do
|
41
|
+
file = 'blub123.txt'
|
42
|
+
|
43
|
+
switch_to_working_directory do
|
44
|
+
File.open(file, "wb") do |f|
|
45
|
+
f.write ''
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
result = path_exists? file
|
50
|
+
expect(result).to eq(true)
|
51
|
+
|
52
|
+
result = path_exists? 'asfdasdfsadf.txt'
|
53
|
+
expect(result).to eq(false)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BobTheHelper::Environment do
|
4
|
+
|
5
|
+
it "let you modify the environment of a process" do
|
6
|
+
env = { 'THIS_IS_A_LONG_VARIABLE' => 'hello_world' }
|
7
|
+
|
8
|
+
env_modified = {}
|
9
|
+
isolated_environment env do
|
10
|
+
env_modified = ENV.to_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
expect( env_modified['THIS_IS_A_LONG_VARIABLE'] ).to eq(env['THIS_IS_A_LONG_VARIABLE'] )
|
14
|
+
end
|
15
|
+
end
|