picky 1.0.0 → 1.1.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.
- data/bin/picky +4 -4
- data/lib/picky/application.rb +1 -1
- data/lib/picky/cli.rb +58 -0
- data/lib/picky/extensions/array.rb +2 -0
- data/lib/picky/loader.rb +0 -4
- data/lib/picky/query/weigher.rb +2 -0
- data/lib/picky/query/weights.rb +1 -1
- data/lib/picky/sources/db.rb +9 -8
- data/lib/picky/tokenizers/base.rb +5 -4
- data/lib/picky/tokenizers/index.rb +9 -9
- data/lib/tasks/server.rake +0 -2
- data/spec/lib/rack/harakiri_spec.rb +1 -0
- data/spec/lib/sources/db_spec.rb +43 -49
- metadata +4 -17
- data/lib/picky/generator.rb +0 -198
- data/project_prototype/Gemfile +0 -30
- data/project_prototype/Rakefile +0 -11
- data/project_prototype/app/README +0 -5
- data/project_prototype/app/application.rb +0 -50
- data/project_prototype/app/db.yml +0 -13
- data/project_prototype/app/library.csv +0 -540
- data/project_prototype/app/logging.rb +0 -20
- data/project_prototype/config.ru +0 -35
- data/project_prototype/log/README +0 -1
- data/project_prototype/script/console +0 -34
- data/project_prototype/tmp/README +0 -0
- data/project_prototype/tmp/pids/README +0 -0
- data/project_prototype/unicorn.ru +0 -15
data/bin/picky
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
#
|
3
3
|
|
4
4
|
begin
|
5
|
-
require 'picky/
|
5
|
+
require 'picky/cli'
|
6
6
|
rescue LoadError => e
|
7
7
|
require 'rubygems'
|
8
8
|
picky_path = File.expand_path '../../lib', __FILE__
|
9
9
|
$:.unshift(picky_path) if File.directory?(picky_path) && !$:.include?(picky_path)
|
10
|
-
require 'picky/
|
10
|
+
require 'picky/cli'
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
cli = Picky::CLI.new
|
14
|
+
cli.execute *ARGV
|
data/lib/picky/application.rb
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
# # Your configuration goes here.
|
10
10
|
# end
|
11
11
|
# The generator
|
12
|
-
# $ picky
|
12
|
+
# $ picky generate unicorn_server project_name
|
13
13
|
# will generate an example <tt>project_name/app/application.rb</tt> file for you
|
14
14
|
# with some example code inside.
|
15
15
|
#
|
data/lib/picky/cli.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
module Picky
|
2
|
+
|
3
|
+
# A very simple CLI selector.
|
4
|
+
#
|
5
|
+
class CLI # :nodoc:all
|
6
|
+
|
7
|
+
def self.mapping
|
8
|
+
@@mapping
|
9
|
+
end
|
10
|
+
|
11
|
+
# Execute a command.
|
12
|
+
#
|
13
|
+
# Note: By default, help is displayed. I.e. when no command is given.
|
14
|
+
#
|
15
|
+
def execute selector = nil, *args
|
16
|
+
executor_class, *params = selector && @@mapping[selector.to_sym] || Help
|
17
|
+
executor = executor_class.new
|
18
|
+
executor.execute selector, args, params
|
19
|
+
end
|
20
|
+
|
21
|
+
class Base
|
22
|
+
def usage name, params
|
23
|
+
puts "Usage\n picky #{name} #{params_to_s(params)}"
|
24
|
+
end
|
25
|
+
def params_to_s params
|
26
|
+
params.map { |param| "<#{param}>" }.join(' ') if params
|
27
|
+
end
|
28
|
+
end
|
29
|
+
class Generate < Base
|
30
|
+
def execute name, args, params
|
31
|
+
system "picky-generate #{args.join(' ')}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
class Help < Base
|
35
|
+
# Displays usage information.
|
36
|
+
#
|
37
|
+
def execute name, args, params
|
38
|
+
commands = Picky::CLI.mapping.map do |command, object_and_params|
|
39
|
+
_, *params = object_and_params
|
40
|
+
" picky #{command} #{params_to_s(params)}"
|
41
|
+
end.join(?\n)
|
42
|
+
|
43
|
+
puts "Possible commands:\n" + commands
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Maps commands to the other gem's command.
|
48
|
+
#
|
49
|
+
# TODO Add optional params.
|
50
|
+
#
|
51
|
+
@@mapping = {
|
52
|
+
:generate => [Generate, 'thing_to_generate: e.g. "unicorn_server"', :parameters],
|
53
|
+
:help => [Help]
|
54
|
+
}
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/lib/picky/loader.rb
CHANGED
data/lib/picky/query/weigher.rb
CHANGED
data/lib/picky/query/weights.rb
CHANGED
@@ -38,7 +38,7 @@ module Query
|
|
38
38
|
# Note: Cache this if more complicated weighings become necessary.
|
39
39
|
#
|
40
40
|
def score combinations
|
41
|
-
# TODO Beautify?
|
41
|
+
# TODO Beautify? Use categories for weights?
|
42
42
|
#
|
43
43
|
# weight_for combinations.map(&:category).clustered_uniq_fast.map!(&:name)
|
44
44
|
|
data/lib/picky/sources/db.rb
CHANGED
@@ -107,22 +107,23 @@ module Sources
|
|
107
107
|
|
108
108
|
# Harvests the data to index in chunks.
|
109
109
|
#
|
110
|
-
def harvest type, category
|
110
|
+
def harvest type, category, &block
|
111
111
|
connect_backend
|
112
112
|
|
113
113
|
(0..count(type)).step(chunksize) do |offset|
|
114
|
-
get_data
|
115
|
-
next unless text
|
116
|
-
text.force_encoding 'utf-8' # TODO Still needed?
|
117
|
-
yield indexed_id, text
|
118
|
-
end
|
114
|
+
get_data type, category, offset, &block
|
119
115
|
end
|
120
116
|
end
|
121
117
|
|
122
118
|
# Gets the data from the backend.
|
123
119
|
#
|
124
|
-
def get_data type, category, offset # :nodoc:
|
125
|
-
|
120
|
+
def get_data type, category, offset, &block # :nodoc:
|
121
|
+
select_statement = harvest_statement_with_offset(type, category, offset)
|
122
|
+
database.connection.execute(select_statement).each do |indexed_id, text|
|
123
|
+
next unless text
|
124
|
+
text.force_encoding 'utf-8' # TODO Still needed? Or move to backend?
|
125
|
+
yield indexed_id, text
|
126
|
+
end
|
126
127
|
end
|
127
128
|
|
128
129
|
# Builds a harvest statement for getting data to index.
|
@@ -4,8 +4,9 @@ module Tokenizers # :nodoc:all
|
|
4
4
|
#
|
5
5
|
class Base
|
6
6
|
|
7
|
-
# TODO
|
7
|
+
# TODO Move EMPTY_STRING top level.
|
8
8
|
#
|
9
|
+
EMPTY_STRING = ''.freeze
|
9
10
|
|
10
11
|
# Stopwords.
|
11
12
|
#
|
@@ -13,7 +14,7 @@ module Tokenizers # :nodoc:all
|
|
13
14
|
@remove_stopwords_regexp = regexp
|
14
15
|
end
|
15
16
|
def remove_stopwords text
|
16
|
-
text.gsub! @remove_stopwords_regexp,
|
17
|
+
text.gsub! @remove_stopwords_regexp, EMPTY_STRING if @remove_stopwords_regexp
|
17
18
|
text
|
18
19
|
end
|
19
20
|
@@non_single_stopword_regexp = /^\b[\w:]+?\b[\.\*\~]?\s?$/
|
@@ -30,7 +31,7 @@ module Tokenizers # :nodoc:all
|
|
30
31
|
@removes_characters_regexp = regexp
|
31
32
|
end
|
32
33
|
def remove_illegals text
|
33
|
-
text.gsub! @removes_characters_regexp,
|
34
|
+
text.gsub! @removes_characters_regexp, EMPTY_STRING if @removes_characters_regexp
|
34
35
|
text
|
35
36
|
end
|
36
37
|
|
@@ -66,7 +67,7 @@ module Tokenizers # :nodoc:all
|
|
66
67
|
@removes_characters_after_splitting_regexp = regexp
|
67
68
|
end
|
68
69
|
def remove_after_normalizing_illegals text
|
69
|
-
text.gsub! @removes_characters_after_splitting_regexp,
|
70
|
+
text.gsub! @removes_characters_after_splitting_regexp, EMPTY_STRING if @removes_characters_after_splitting_regexp
|
70
71
|
end
|
71
72
|
|
72
73
|
# Substitute Characters with this substituter.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Tokenizers
|
2
|
+
|
2
3
|
# The base indexing tokenizer.
|
3
4
|
#
|
4
5
|
# Override in indexing subclasses and define in configuration.
|
@@ -15,11 +16,10 @@ module Tokenizers
|
|
15
16
|
# Default indexing preprocessing hook.
|
16
17
|
#
|
17
18
|
# Does:
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# 5. Remove non-single stopwords. (Stopwords that occur with other words)
|
19
|
+
# 1. Character substitution.
|
20
|
+
# 2. Downcasing.
|
21
|
+
# 3. Remove illegal expressions.
|
22
|
+
# 4. Remove non-single stopwords. (Stopwords that occur with other words)
|
23
23
|
#
|
24
24
|
def preprocess text
|
25
25
|
text = substitute_characters text
|
@@ -27,7 +27,7 @@ module Tokenizers
|
|
27
27
|
remove_illegals text
|
28
28
|
# we do not remove single stopwords for an entirely different
|
29
29
|
# reason than in the query tokenizer.
|
30
|
-
# An indexed thing with just name "UND" (a stopword) should not lose its name.
|
30
|
+
# An indexed thing with just name "UND" (a possible stopword) should not lose its name.
|
31
31
|
#
|
32
32
|
remove_non_single_stopwords text
|
33
33
|
text
|
@@ -36,8 +36,8 @@ module Tokenizers
|
|
36
36
|
# Default indexing pretokenizing hook.
|
37
37
|
#
|
38
38
|
# Does:
|
39
|
-
#
|
40
|
-
#
|
39
|
+
# 1. Split the text into words.
|
40
|
+
# 2. Normalize each word.
|
41
41
|
#
|
42
42
|
# TODO Rename into wordize? Or somesuch?
|
43
43
|
#
|
@@ -60,7 +60,7 @@ module Tokenizers
|
|
60
60
|
#
|
61
61
|
# Override in subclasses to redefine behaviour.
|
62
62
|
#
|
63
|
-
# TODO Make parametrizable! reject { |token| }
|
63
|
+
# TODO TODO TODO Make parametrizable! reject { |token| }
|
64
64
|
#
|
65
65
|
def reject tokens
|
66
66
|
tokens.reject! &:blank?
|
data/lib/tasks/server.rake
CHANGED
@@ -14,7 +14,6 @@ namespace :server do
|
|
14
14
|
# desc "Start the unicorns. (Wehee!)"
|
15
15
|
task :start => :framework do
|
16
16
|
chdir_to_root
|
17
|
-
# Rake::Task[:"solr:start"].invoke # TODO Move to better place.
|
18
17
|
daemonize = PICKY_ENVIRONMENT == 'production' ? '-D' : ''
|
19
18
|
command = "export PICKY_ENV=#{PICKY_ENVIRONMENT}; unicorn -c unicorn.ru #{daemonize}".strip
|
20
19
|
puts "Running \`#{command}\`."
|
@@ -24,7 +23,6 @@ namespace :server do
|
|
24
23
|
# desc "Stop the unicorns. (Blam!)"
|
25
24
|
task :stop => :framework do
|
26
25
|
`kill -QUIT #{current_pid}` if current_pid
|
27
|
-
# Rake::Task[:"solr:stop"].invoke # TODO Move to better place.
|
28
26
|
end
|
29
27
|
|
30
28
|
# desc "Restart the unicorns."
|
data/spec/lib/sources/db_spec.rb
CHANGED
@@ -17,13 +17,33 @@ describe Sources::DB do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
describe "get_data" do
|
20
|
-
|
21
|
-
type = stub :type, :name => :some_type
|
22
|
-
category = stub :category, :from => :some_category
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
before(:each) do
|
21
|
+
@type = stub :type, :name => :some_type
|
22
|
+
@category = stub :category, :from => :some_category
|
23
|
+
end
|
24
|
+
context 'no data' do
|
25
|
+
it "delegates to the connection" do
|
26
|
+
|
27
|
+
@connection.should_receive(:execute).
|
28
|
+
once.
|
29
|
+
with('SELECT indexed_id, some_category FROM some_type_type_index st WHERE st.id > some_offset LIMIT 25000').
|
30
|
+
and_return []
|
31
|
+
|
32
|
+
@source.get_data @type, @category, :some_offset
|
33
|
+
end
|
34
|
+
end
|
35
|
+
context 'with data' do
|
36
|
+
it 'yields to the caller' do
|
37
|
+
@connection.should_receive(:execute).
|
38
|
+
any_number_of_times.
|
39
|
+
with('SELECT indexed_id, some_category FROM some_type_type_index st WHERE st.id > some_offset LIMIT 25000').
|
40
|
+
and_return [[1, 'text']]
|
41
|
+
|
42
|
+
@source.get_data @type, @category, :some_offset do |id, text|
|
43
|
+
id.should == 1
|
44
|
+
text.should == 'text'
|
45
|
+
end
|
46
|
+
end
|
27
47
|
end
|
28
48
|
end
|
29
49
|
|
@@ -67,48 +87,22 @@ describe Sources::DB do
|
|
67
87
|
end
|
68
88
|
end
|
69
89
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# @source.stub! :select_statement => 'bla WHERE blu'
|
87
|
-
# end
|
88
|
-
# it "should connect" do
|
89
|
-
# @source.should_receive(:connect_backend).once.with
|
90
|
-
# end
|
91
|
-
# it "should call the harvest statement with an offset" do
|
92
|
-
# @source.should_receive(:harvest_statement_with_offset).once.with :some_type, :some_field, :some_offset
|
93
|
-
# end
|
94
|
-
# end
|
95
|
-
# context "without WHERE" do
|
96
|
-
# it "should connect" do
|
97
|
-
# @adapter.should_receive(:connect).once.with
|
98
|
-
# end
|
99
|
-
# it "should call the harvest statement with an offset" do
|
100
|
-
# @source.should_receive(:harvest_statement_with_offset).once.with :some_type, :some_field, :some_offset
|
101
|
-
# end
|
102
|
-
# end
|
103
|
-
# end
|
104
|
-
# context 'returns' do
|
105
|
-
# it "should return whatever the execute statement returns" do
|
106
|
-
# @connection.stub! :execute => :some_result
|
107
|
-
#
|
108
|
-
# @source.harvest(:some_type, :some_field).should == :some_result
|
109
|
-
# end
|
110
|
-
# end
|
111
|
-
# end
|
90
|
+
describe 'harvest' do
|
91
|
+
before(:each) do
|
92
|
+
@type = stub :type, :name => :some_type
|
93
|
+
@category = stub :category, :name => :some_category
|
94
|
+
|
95
|
+
@source.should_receive(:get_data).any_number_of_times.and_return [[:some_id, 'some_text']].cycle
|
96
|
+
@source.stub! :count => 17
|
97
|
+
end
|
98
|
+
it 'calls connect_backend' do
|
99
|
+
@source.should_receive(:connect_backend).once.with()
|
100
|
+
|
101
|
+
@source.harvest @type, @category do |id, text|
|
102
|
+
p [id, text]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
112
106
|
|
113
107
|
describe "harvest_statement_with_offset" do
|
114
108
|
before(:each) do
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 1.0.0
|
9
|
+
version: 1.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Florian Hanke
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-12 00:00:00 +01:00
|
18
18
|
default_executable: picky
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/picky/cacher/weights_generator.rb
|
64
64
|
- lib/picky/calculations/location.rb
|
65
65
|
- lib/picky/character_substituters/west_european.rb
|
66
|
+
- lib/picky/cli.rb
|
66
67
|
- lib/picky/configuration/index.rb
|
67
68
|
- lib/picky/cores.rb
|
68
69
|
- lib/picky/ext/maybe_compile.rb
|
@@ -72,7 +73,6 @@ files:
|
|
72
73
|
- lib/picky/extensions/module.rb
|
73
74
|
- lib/picky/extensions/object.rb
|
74
75
|
- lib/picky/extensions/symbol.rb
|
75
|
-
- lib/picky/generator.rb
|
76
76
|
- lib/picky/helpers/cache.rb
|
77
77
|
- lib/picky/helpers/gc.rb
|
78
78
|
- lib/picky/helpers/measuring.rb
|
@@ -147,19 +147,6 @@ files:
|
|
147
147
|
- lib/tasks/statistics.rake
|
148
148
|
- lib/tasks/try.rake
|
149
149
|
- lib/picky/ext/ruby19/performant.c
|
150
|
-
- project_prototype/app/application.rb
|
151
|
-
- project_prototype/app/db.yml
|
152
|
-
- project_prototype/app/library.csv
|
153
|
-
- project_prototype/app/logging.rb
|
154
|
-
- project_prototype/app/README
|
155
|
-
- project_prototype/config.ru
|
156
|
-
- project_prototype/Gemfile
|
157
|
-
- project_prototype/log/README
|
158
|
-
- project_prototype/Rakefile
|
159
|
-
- project_prototype/script/console
|
160
|
-
- project_prototype/tmp/pids/README
|
161
|
-
- project_prototype/tmp/README
|
162
|
-
- project_prototype/unicorn.ru
|
163
150
|
- spec/ext/performant_spec.rb
|
164
151
|
- spec/lib/application_spec.rb
|
165
152
|
- spec/lib/cacher/cacher_strategy_spec.rb
|
data/lib/picky/generator.rb
DELETED
@@ -1,198 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
module Picky
|
6
|
-
|
7
|
-
# Thrown when no generator for the command
|
8
|
-
# picky <command> <options>
|
9
|
-
# is found.
|
10
|
-
#
|
11
|
-
class NoGeneratorError < StandardError # :nodoc:all
|
12
|
-
|
13
|
-
def initialize generator
|
14
|
-
super usage + possible_commands(generator.types)
|
15
|
-
end
|
16
|
-
|
17
|
-
def usage
|
18
|
-
"\nUsage:\n" +
|
19
|
-
"picky <command> <params>\n" +
|
20
|
-
?\n
|
21
|
-
end
|
22
|
-
|
23
|
-
def possible_commands types
|
24
|
-
"Possible commands:\n" +
|
25
|
-
types.map do |name, klass_params|
|
26
|
-
result = "picky #{name}"
|
27
|
-
_, params = *klass_params
|
28
|
-
result << ' ' << [*params].map { |param| "<#{param}>" }.join(' ') if params
|
29
|
-
result
|
30
|
-
end.join(?\n) + ?\n
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
# This is a very simple project generator.
|
36
|
-
# Not at all like Padrino's or Rails'.
|
37
|
-
# (No diss, just by way of a faster explanation)
|
38
|
-
#
|
39
|
-
# Basically copies a prototype project into a newly generated directory.
|
40
|
-
#
|
41
|
-
class Generator # :nodoc:all
|
42
|
-
|
43
|
-
attr_reader :types
|
44
|
-
|
45
|
-
def initialize
|
46
|
-
@types = {
|
47
|
-
project: [Project, :project_name]
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
# Run the generators with this command.
|
52
|
-
#
|
53
|
-
# This will "route" the commands to the right specific generator.
|
54
|
-
#
|
55
|
-
def generate args
|
56
|
-
generator = generator_for *args
|
57
|
-
generator.generate
|
58
|
-
end
|
59
|
-
|
60
|
-
#
|
61
|
-
#
|
62
|
-
def generator_for identifier, *args
|
63
|
-
generator_info = types[identifier.to_sym]
|
64
|
-
raise NoGeneratorError.new(self) unless generator_info
|
65
|
-
generator_class = generator_info.first
|
66
|
-
generator_for_class generator_class, identifier, *args
|
67
|
-
end
|
68
|
-
|
69
|
-
#
|
70
|
-
#
|
71
|
-
def generator_for_class klass, *args
|
72
|
-
klass.new *args
|
73
|
-
end
|
74
|
-
|
75
|
-
# Generates a new Picky project.
|
76
|
-
#
|
77
|
-
# Example:
|
78
|
-
# > picky project my_lovely_project
|
79
|
-
#
|
80
|
-
class Project
|
81
|
-
|
82
|
-
attr_reader :name, :project_prototype_basedir
|
83
|
-
|
84
|
-
def initialize identifier, name, *args
|
85
|
-
@name = name
|
86
|
-
@project_prototype_basedir = File.expand_path '../../../project_prototype', __FILE__
|
87
|
-
end
|
88
|
-
|
89
|
-
#
|
90
|
-
#
|
91
|
-
def generate
|
92
|
-
exclaim "Setting up Picky project \"#{name}\"."
|
93
|
-
create_target_directory
|
94
|
-
copy_all_files
|
95
|
-
exclaim "\"#{name}\" is a great project name! Have fun :)\n"
|
96
|
-
exclaim ""
|
97
|
-
exclaim "Next steps:"
|
98
|
-
exclaim "1. cd #{name}"
|
99
|
-
exclaim "2. bundle install"
|
100
|
-
exclaim "3. rake index"
|
101
|
-
exclaim "4. rake start"
|
102
|
-
exclaim "5. rake # (optional) shows you where Picky needs input from you"
|
103
|
-
exclaim " # if you want to define your own search."
|
104
|
-
end
|
105
|
-
|
106
|
-
#
|
107
|
-
#
|
108
|
-
def create_target_directory
|
109
|
-
if File.exists?(target_directory)
|
110
|
-
exists target_directory
|
111
|
-
else
|
112
|
-
FileUtils.mkdir target_directory
|
113
|
-
created target_directory
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
#
|
118
|
-
#
|
119
|
-
def copy_all_files
|
120
|
-
all_prototype_files.each do |filename|
|
121
|
-
next if filename.match(/\.textile$/)
|
122
|
-
copy_single_file filename
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
#
|
127
|
-
#
|
128
|
-
def target_filename_for filename
|
129
|
-
filename.gsub(%r{#{project_prototype_basedir}}, target_directory)
|
130
|
-
end
|
131
|
-
#
|
132
|
-
#
|
133
|
-
def copy_single_file filename
|
134
|
-
target = target_filename_for filename
|
135
|
-
if File.exists? target
|
136
|
-
exists target
|
137
|
-
else
|
138
|
-
smart_copy filename, target
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
# Well, "smart" ;)
|
143
|
-
#
|
144
|
-
def smart_copy filename, target
|
145
|
-
# p "Trying to copy #{filename} -> #{target}"
|
146
|
-
FileUtils.copy_file filename, target
|
147
|
-
created target
|
148
|
-
rescue Errno::EISDIR
|
149
|
-
# p "EISDIR #{filename} -> #{target}"
|
150
|
-
FileUtils.rm target
|
151
|
-
FileUtils.mkdir_p target unless Dir.exists?(target)
|
152
|
-
created target
|
153
|
-
rescue Errno::EEXIST
|
154
|
-
# p "EEXIST #{filename} -> #{target}"
|
155
|
-
exists target
|
156
|
-
rescue Errno::ENOTDIR
|
157
|
-
# p "ENOTDIR #{filename} -> #{target}"
|
158
|
-
FileUtils.mkdir_p File.dirname(target) rescue nil
|
159
|
-
retry
|
160
|
-
rescue Errno::ENOENT => e
|
161
|
-
# p "ENOENT #{filename} -> #{target}"
|
162
|
-
if File.exists? filename
|
163
|
-
FileUtils.mkdir_p File.dirname(target)
|
164
|
-
retry
|
165
|
-
else
|
166
|
-
raise e
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
#
|
171
|
-
#
|
172
|
-
def all_prototype_files
|
173
|
-
Dir[File.join(project_prototype_basedir, '**', '*')]
|
174
|
-
end
|
175
|
-
|
176
|
-
#
|
177
|
-
#
|
178
|
-
def target_directory
|
179
|
-
File.expand_path name, Dir.pwd
|
180
|
-
end
|
181
|
-
|
182
|
-
def created entry
|
183
|
-
exclaim "#{entry} \x1b[32mcreated\x1b[m."
|
184
|
-
end
|
185
|
-
|
186
|
-
def exists entry
|
187
|
-
exclaim "#{entry} \x1b[31mexists\x1b[m, skipping."
|
188
|
-
end
|
189
|
-
|
190
|
-
def exclaim something
|
191
|
-
puts something
|
192
|
-
end
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
end
|
197
|
-
|
198
|
-
end
|
data/project_prototype/Gemfile
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
source :gemcutter
|
2
|
-
|
3
|
-
# Gems required by Picky.
|
4
|
-
#
|
5
|
-
gem 'picky', '~> 1.0.0'
|
6
|
-
gem 'rake'
|
7
|
-
gem 'bundler'
|
8
|
-
gem 'rack', '~> 1.2.1'
|
9
|
-
gem 'rack-mount', '~> 0.6.9'
|
10
|
-
gem 'text', '~> 0.2.0'
|
11
|
-
gem 'yajl-ruby', '~> 0.7.8', :require => 'yajl'
|
12
|
-
|
13
|
-
# Should be optional, but isn't yet. Sorry.
|
14
|
-
#
|
15
|
-
gem 'activerecord', '~> 2.3.8', :require => 'active_record'
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
# Optional. Makes rack faster.
|
21
|
-
#
|
22
|
-
gem 'rack_fast_escape', '2009.06.24'
|
23
|
-
|
24
|
-
# Optional. Use your preferred web server.
|
25
|
-
#
|
26
|
-
gem 'unicorn'
|
27
|
-
|
28
|
-
# Optional. Use your preferred database adapter.
|
29
|
-
#
|
30
|
-
# gem 'mysql'
|
data/project_prototype/Rakefile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'picky-tasks'
|
2
|
-
|
3
|
-
desc "Finds where Picky still needs input from you."
|
4
|
-
task :todo do
|
5
|
-
if system "grep -e 'TO#{}DO.*' -n --color=always -R *"
|
6
|
-
puts "Picky needs a bit of input from you there. Thanks."
|
7
|
-
else
|
8
|
-
puts "Picky seems to be fine (no TO#{}DOs found)."
|
9
|
-
end
|
10
|
-
end
|
11
|
-
task :default => :todo
|