yop 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f999a4178d91f2c183491af37837a814129fbc96
4
+ data.tar.gz: b5e0ecf6508e6f5635401878aee77745e28bc236
5
+ SHA512:
6
+ metadata.gz: 4b77f2388b91267826ad6bfe1fa3b6c5a3446be04ed41b417f49e470c224ea9322ccf654a0efda9896d9cc29d8716d4d2e20d8bb844ada5168a6e73ece27cb3a
7
+ data.tar.gz: afa79f8dd233a9b50177e999e3b54acb37f101cc91b22d3ab1a1ab55086deea802ee8130e8c5e3683f5f5315045631d755bce97ecb41e04bc5ec8d900d8cad53
checksums.yaml.gz.sig ADDED
Binary file
data/bin/yop ADDED
@@ -0,0 +1,50 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ # clean interrupt
5
+ trap("INT") { abort }
6
+
7
+ require "trollop"
8
+ require "yop"
9
+
10
+ Yop.init
11
+
12
+ opts = Trollop.options do
13
+ version "yop #{Yop.version}"
14
+ banner <<-EOS
15
+ Yop bootstraps your projects with predefined templates.
16
+
17
+ Usage:
18
+ yop [options] <template> <directory>
19
+
20
+ * <template> is a template name. Use --templates to list all of them
21
+ * <directory> is any directory. It’ll be created if it doesn’t exist
22
+
23
+ Options:
24
+ EOS
25
+
26
+ opt :templates, "List all available templates", default: false
27
+ end
28
+
29
+ if opts[:templates]
30
+ require "pathname"
31
+
32
+ puts "Templates:"
33
+ Yop.templates.each do |t|
34
+ puts "* #{Pathname.new(t).basename}"
35
+ end
36
+ exit 0
37
+ end
38
+
39
+ Trollop.educate unless ARGV.length == 2
40
+
41
+ template, directory = ARGV
42
+
43
+ puts "Applying template '#{template}' on #{directory}..."
44
+ begin
45
+ Yop.bootstrap(template, directory)
46
+ rescue NonExistentTemplate => e
47
+ puts "ERROR: The template '#{e}' doesn’t exist."
48
+ exit 1
49
+ end
50
+ puts "Done!"
@@ -0,0 +1,16 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require_relative "templates"
4
+
5
+ module Yop
6
+ class << self
7
+ # Bootstrap a project (which will be) located in `directory` with the
8
+ # template `template`
9
+ # @param template [String] the template name
10
+ # @param directory [String] the directory path
11
+ # @return nil
12
+ def bootstrap(template, directory)
13
+ get_template(template).apply directory
14
+ end
15
+ end
16
+ end
data/lib/yop/config.rb ADDED
@@ -0,0 +1,43 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require "yaml"
4
+
5
+ require_relative "home"
6
+
7
+ module Yop
8
+ class << self
9
+ # Get the local Yop config. If no argument is given the whole config is
10
+ # returned. If one is given, the corresponding value is returned.
11
+ # @param key [Any] the key to lookup
12
+ # @return [Any] either the whole config or the value for `key`
13
+ def config(key = nil)
14
+ read_config unless @conf
15
+
16
+ if !key.nil?
17
+ @conf[key]
18
+ else
19
+ @conf
20
+ end
21
+ end
22
+
23
+ # Set variables in the local Yop config.
24
+ # @param opts [Hash] an hash which will be merged into the local config
25
+ # @return nil
26
+ def config!(opts = {})
27
+ @conf.update(opts)
28
+ save_config
29
+ end
30
+
31
+ private
32
+
33
+ def read_config
34
+ @conf = YAML.load_file(home("config.yml")) || {}
35
+ end
36
+
37
+ def save_config
38
+ File.open(home("config.yml"), "w") do |f|
39
+ f.write YAML.dump(@conf)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,4 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ # This exception is raised when get_template fails to find a template
4
+ class NonExistentTemplate < Exception; end
data/lib/yop/home.rb ADDED
@@ -0,0 +1,23 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require "fileutils"
4
+
5
+ module Yop
6
+ class << self
7
+ # Return the local Yop directory location. If an argument is given, it
8
+ # assumes it's a Yop subcomponent and returns its location.
9
+ # @param subcomponent [String] the subcomponent to look for
10
+ # @return [String] the path to the local Yop directory or its subcomponent
11
+ def home(subcomponent = "")
12
+ File.expand_path("~/.yop/#{subcomponent}")
13
+ end
14
+
15
+ # Initialize Yop's local directory
16
+ # @return nil
17
+ def init
18
+ FileUtils.mkdir_p home
19
+ FileUtils.mkdir_p home("templates")
20
+ FileUtils.touch home("config.yml")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,96 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require "fileutils"
4
+
5
+ require_relative "home"
6
+ require_relative "config"
7
+ require_relative "exceptions"
8
+
9
+ module Yop
10
+ class << self
11
+ # @return [Array] all the available templates
12
+ def templates
13
+ Dir["#{Yop.home("templates")}/*"]
14
+ end
15
+
16
+ # Retrieve a template from its name, or raise a `NonExistentTemplate`
17
+ # exception if it doesn't exist
18
+ # @param name [String] the template name
19
+ # @return [Yop::Template]
20
+ def get_template(name)
21
+ dirs = Dir["#{Yop.home("templates")}/#{name}"]
22
+ fail NonExistentTemplate, name if dirs.empty?
23
+ Template.new(dirs.first, config(:vars) || {})
24
+ end
25
+ end
26
+
27
+ # A Yop Template, which consists of a base directory and an hash of variables
28
+ class Template
29
+ include FileUtils
30
+
31
+ # Create a new template from a base directory
32
+ # @param base_directory [String] a path to an existing directory which will
33
+ # be used as a source when this template
34
+ # will be applied
35
+ # @param vars [Hash]
36
+ def initialize(base_directory, vars = {})
37
+ @base = base_directory
38
+ @vars = vars
39
+ end
40
+
41
+ # Apply the template on a directory. It creates it if it doesn't exist,
42
+ # then recursively copies itself in it
43
+ # @param directory [String] the directory in which to copy
44
+ # @return nil
45
+ def apply(directory)
46
+ mkdir_p directory
47
+
48
+ # get relative paths
49
+ sources = []
50
+ cd(@base) { sources = Dir["**/*", "**/.*"] }
51
+
52
+ cd directory do
53
+ sources.each do |path|
54
+ next if skip? path
55
+
56
+ source = "#{@base}/#{path}"
57
+
58
+ if File.directory? source
59
+ mkdir_p path
60
+ elsif File.file? source
61
+ File.open(path, "w") do |f|
62
+ content = replace_vars source
63
+ f.write(content)
64
+ end
65
+ else
66
+ puts "Warning: unsupported file: #{source}"
67
+ next
68
+ end
69
+ mirror_perms source, path
70
+ end
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def ignore_extension?(path)
77
+ %w[.swp .swo .pyc .class].any? { |e| path.end_with?(e) }
78
+ end
79
+
80
+ def skip?(path)
81
+ return true if ignore_extension? path
82
+
83
+ [/\.git/, /.~$/, /__pycache__/].any? { |reg| path =~ reg }
84
+ end
85
+
86
+ def replace_vars(source)
87
+ # TODO
88
+ File.read(source)
89
+ end
90
+
91
+ def mirror_perms(source, target)
92
+ mode = File.new(source).stat.mode
93
+ File.chmod(mode, target)
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,8 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ module Yop
4
+ # @return [String] the current gem's version
5
+ def self.version
6
+ "0.0.1"
7
+ end
8
+ end
data/lib/yop.rb ADDED
@@ -0,0 +1,9 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ # Base module for Yop
4
+ module Yop; end
5
+
6
+ require_relative "yop/bootstrap"
7
+ require_relative "yop/home"
8
+ require_relative "yop/templates"
9
+ require_relative "yop/version"
data/tests/tests.rb ADDED
@@ -0,0 +1,32 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ require "coveralls"
5
+ Coveralls.wear!
6
+
7
+ require "test/unit"
8
+ require "simplecov"
9
+
10
+ test_dir = File.expand_path(File.dirname(__FILE__))
11
+
12
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
13
+ SimpleCov.start { add_filter "/tests/" }
14
+
15
+ require "yop"
16
+
17
+ for t in Dir[File.join(test_dir, "*_tests.rb")]
18
+ require t
19
+ end
20
+
21
+ class YopTests < Test::Unit::TestCase
22
+
23
+ # == #version == #
24
+
25
+ def test_version
26
+ assert(Yop.version =~ /^\d+\.\d+\.\d+/)
27
+ end
28
+
29
+ end
30
+
31
+
32
+ exit Test::Unit::AutoRunner.run
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yop
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Baptiste Fontaine
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MRAwDgYDVQQDDAdiYXRp
14
+ Zm9uMRUwEwYKCZImiZPyLGQBGRYFeWFob28xEjAQBgoJkiaJk/IsZAEZFgJmcjAe
15
+ Fw0xNDA4MjQxMTM5NTJaFw0xNTA4MjQxMTM5NTJaMD0xEDAOBgNVBAMMB2JhdGlm
16
+ b24xFTATBgoJkiaJk/IsZAEZFgV5YWhvbzESMBAGCgmSJomT8ixkARkWAmZyMIIB
17
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn3uOgWl+FwXIjDdCay28i6cK
18
+ FxHWhHoS/mH9pkXzSGVctEKP2fulie6MkIvrLCP5M6TpByeaBjcJjZPadrou1FIc
19
+ Yc/O14jYjaKTqfMxpzgNfGzDdBgBo0QZ9rcHjORetdIZdUSDaZjPtI1aGS6eBMsh
20
+ W2X6GxL4UQ1kH0Lyg7iPYAH5RHnD3+G+S28iOPFfRLFzm4fwJp1k7URiiSyOHTDp
21
+ B0ZehKKrW/ibCaRMYp2VoCamcim4de1VA6CTOaYSShueqThE18n1HM6aprihziyM
22
+ 04yIpo80/unO6JxlsUFdBjsb5d7oJSqPJ6/OfcFnyXa/VRm+Ed9d6PTwZvL7YwID
23
+ AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUWyH3xMx1
24
+ 8I5NLncgNEC0ZlDRKegwGwYDVR0RBBQwEoEQYmF0aWZvbkB5YWhvby5mcjAbBgNV
25
+ HRIEFDASgRBiYXRpZm9uQHlhaG9vLmZyMA0GCSqGSIb3DQEBBQUAA4IBAQAaTVya
26
+ CGgojxBwUoadCCIsFheGsXvSFhikkXYNXy0VxEYr8BaTfGwzYh9c9T5N+Y5Mu5MW
27
+ WegqwIwRhIu6Rg7huqJ7TK50pVDF0yrZcsxvWjOfd3clblBHjKGQx5Mbu7LVNGKE
28
+ +QNdTAwYVTAA8wXHpxk200cHb9xz4e9ANpb4lonGuPz8jKmb/A7Z1M5QD6zStG8l
29
+ sTlVAhA/LZiC9gL9LtW8Iq7o7xRFhxNPKWHu6JVThH9i16eli+JignOJbGna7C40
30
+ QnOQb8zHyNL+gq2m/mnZGrSehx+6AujokjOfHbmivYMfDATOQQx0eIBI18IhacZm
31
+ 42WxhhIV2bwDtd77
32
+ -----END CERTIFICATE-----
33
+ date: 2015-01-31 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: trollop
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.1'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '2.1'
49
+ - !ruby/object:Gem::Dependency
50
+ name: simplecov
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.7'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.7'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '10.1'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '10.1'
77
+ - !ruby/object:Gem::Dependency
78
+ name: test-unit
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.5'
84
+ type: :development
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '2.5'
91
+ - !ruby/object:Gem::Dependency
92
+ name: fakeweb
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.3'
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.3'
105
+ - !ruby/object:Gem::Dependency
106
+ name: coveralls
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0.7'
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0.7'
119
+ - !ruby/object:Gem::Dependency
120
+ name: rubocop
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0.28'
126
+ type: :development
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '0.28'
133
+ description: Yop bootstraps your projects from pre-defined templates
134
+ email: b@ptistefontaine.fr
135
+ executables:
136
+ - yop
137
+ extensions: []
138
+ extra_rdoc_files: []
139
+ files:
140
+ - bin/yop
141
+ - lib/yop.rb
142
+ - lib/yop/bootstrap.rb
143
+ - lib/yop/config.rb
144
+ - lib/yop/exceptions.rb
145
+ - lib/yop/home.rb
146
+ - lib/yop/templates.rb
147
+ - lib/yop/version.rb
148
+ - tests/tests.rb
149
+ homepage: https://github.com/bfontaine/Yop
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.4.4
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: Templates-based projects manager
173
+ test_files:
174
+ - tests/tests.rb
175
+ has_rdoc:
metadata.gz.sig ADDED
Binary file