pfrpg_import 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: eef901a38955ad00b063ca4dfe85f2dca0cd539e
4
+ data.tar.gz: 04bf2cae3c528ff3025694a9c4a4c8270543d989
5
+ SHA512:
6
+ metadata.gz: 431f0c764701275b2f5cbb8cf128f47c0142c062c17ef1b68c85c8810673ed52f07599562639e3593cdb2efd982a7244c62c50136477046e843d8adefd7e01ee
7
+ data.tar.gz: 92de8d39a0f66e8fc1a0c77f0191ca3f057d978c791847b62833c70f5b50ecabcfb3647d10f5ca037f75334adc41586e7fedb0840d75e36a1dda3cda9ba2d2f1
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs.push "lib"
5
+ t.test_files = FileList['test/*_test.rb']
6
+ t.verbose = true
7
+ end
@@ -0,0 +1,31 @@
1
+ require 'active_support/inflector'
2
+
3
+ module PfrpgImport::CaseHelpers
4
+
5
+ class String
6
+ def underscore
7
+ self.gsub(/::/, '/').
8
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
9
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
10
+ tr("-", "_").
11
+ tr(" ", "_").
12
+ downcase
13
+ end
14
+ end
15
+
16
+ def camelized_title(title)
17
+ title.camelize.gsub(' ','')
18
+ end
19
+
20
+ def underscored_title(title)
21
+ title.underscore
22
+ end
23
+
24
+ def arrayify(string_list)
25
+ str = "["
26
+ string_list.each do |b|
27
+ str = str + "#{b},"
28
+ end
29
+ return str + ']'
30
+ end
31
+ end
@@ -0,0 +1,62 @@
1
+ module PfrpgImport
2
+ class FeatureWriter
3
+ include CaseHelpers
4
+ def initialize(features, filename, path='./imported/')
5
+ @features = features
6
+ @filename = filename
7
+ @path = path
8
+ end
9
+
10
+ def print_features
11
+ filename = "#{@path}#{underscored_title(@filename)}_feature.rb"
12
+ feature_name = "#{camelized_title(@filename)}Feature"
13
+ table = File.new(filename, "w")
14
+ str = <<-eos
15
+ class #{feature_name} < ClassFeature
16
+ def feature
17
+ #{feature_name}Info.by_name(self.ability_name)
18
+ end
19
+
20
+ def self.from_feature_info(feature_info)
21
+ c = #{feature_name}.new
22
+ c.ability_name = feature_info.name
23
+ c
24
+ end
25
+ end
26
+ eos
27
+ table.puts str
28
+ table.close
29
+ puts "Wrote #{filename}"
30
+
31
+ filename = "#{@path}#{underscored_title(@filename)}_feature_info.rb"
32
+ table = File.new(filename, "w")
33
+ str = <<-eos
34
+ class #{feature_name}InfoInfo
35
+
36
+ def self.by_name(name)
37
+ self.all.find { |x| x.name == name }
38
+ end
39
+
40
+ def self.all
41
+ [ ]
42
+ end
43
+
44
+ def feature_type
45
+ "#{feature_name}"
46
+ end
47
+ end
48
+ eos
49
+ table.puts str
50
+ table.close
51
+ puts "Wrote #{filename}"
52
+ end
53
+
54
+ def print_level_bonus
55
+ <<-eos
56
+ spells =
57
+ #{@spells}
58
+ spells[level-1]
59
+ eos
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,176 @@
1
+ module PfrpgImport
2
+ class HeroclassFacts
3
+ include CaseHelpers
4
+ attr_reader :friendly_name, :hit_die, :start_wealth, :starting_wealth_avg,
5
+ :alignment, :skills_per_level, :spells_bonus_attr, :description,
6
+ :class_skills, :starting_feats, :feature_type
7
+
8
+ def initialize(bundle)
9
+ @friendly_name = bundle[:heroclass_name]
10
+ @hit_die = bundle[:hit_die].gsub("d","")
11
+ @start_wealth = bundle[:starting_wealth]
12
+ @starting_wealth_average = bundle[:starting_wealth_avg]
13
+ @alignment = bundle[:alignment]
14
+ @skills_per_level = bundle[:skills_per]
15
+ @spells_bonus_attr = bundle[:spell_mod]
16
+ @description = bundle[:description]
17
+ @class_skills = bundle[:class_skills]
18
+ @starting_feats= bundle[:starting_feats]
19
+ @feature_type = get_feature_type(@friendly_name)
20
+ end
21
+
22
+ def title
23
+ @friendly_name.underscore
24
+ end
25
+
26
+ def get_feature_type(friendly_name)
27
+ "#{camelized_title(friendly_name)}Feature"
28
+ end
29
+
30
+ def print_name
31
+ <<-eos
32
+ def name
33
+ "#{@friendly_name}"
34
+ end
35
+
36
+ eos
37
+ end
38
+
39
+ def print_hit_die
40
+ <<-eos
41
+ def hit_die
42
+ Dice.new(1,#{@hit_die})
43
+ end
44
+
45
+ eos
46
+ end
47
+
48
+ def print_starting_wealth
49
+ <<-eos
50
+ def starting_wealth
51
+ Dice.new(5,6, multiplier = 10)
52
+ end
53
+
54
+ eos
55
+ end
56
+
57
+ def print_bonuses_for_level
58
+ <<-eos
59
+ def bonuses_for_level(level)
60
+ PfrpgTables::Heroclasses::#{@friendly_name}.level_bonus(level)
61
+ end
62
+
63
+ eos
64
+ end
65
+
66
+ def print_spells_per_day
67
+ <<-eos
68
+ def get_spells_table(level)
69
+ PfrpgTables::Spells::SpellsPerDay.#{@friendly_name}(level)
70
+ end
71
+
72
+ eos
73
+ end
74
+
75
+ def print_create_feature
76
+ <<-eos
77
+ def create_feature(f)
78
+ #{@feature_type}.new(:ability_name => f)
79
+ end
80
+
81
+ eos
82
+ end
83
+
84
+ def print_alignment
85
+ <<-eos
86
+ def alignment
87
+ #{alignment_string}
88
+ end
89
+
90
+ eos
91
+ end
92
+
93
+ def alignment_string
94
+ case @alignment
95
+ when 'any'
96
+ return 'Alignment.any'
97
+ else
98
+ return 'Alignment.any'
99
+ end
100
+ end
101
+
102
+ def print_skills_per_level
103
+ <<-eos
104
+ def skills_per_level
105
+ #{@skills_per_level}
106
+ end
107
+
108
+ eos
109
+ end
110
+
111
+ def print_spells_bonus_attr
112
+ <<-eos
113
+ def spells_bonus_attr
114
+ "#{@spells_bonus_attr}"
115
+ end
116
+
117
+ eos
118
+ end
119
+
120
+ def print_description
121
+ <<-eos
122
+ def description
123
+ "#{@description}"
124
+ end
125
+
126
+ eos
127
+ end
128
+
129
+ def print_skills
130
+ <<-eos
131
+ def skills
132
+ [ #{skills_string} ]
133
+ end
134
+
135
+ eos
136
+ end
137
+
138
+ def skills_string
139
+ str = ""
140
+ @class_skills.split(',').each do |s|
141
+ str = str + "Skill::#{get_skill_class(s)}.new, "
142
+ end
143
+ str
144
+ end
145
+
146
+ def get_skill_class(skill)
147
+ camelized_title(skill)
148
+ end
149
+
150
+ def print_feature_type
151
+ <<-eos
152
+ def feature_type
153
+ "#{feature_type}"
154
+ end
155
+
156
+ eos
157
+ end
158
+
159
+ def print_starting_feats
160
+ <<-eos
161
+ def starting_feats
162
+ [ #{feats_string} ]
163
+ end
164
+
165
+ eos
166
+ end
167
+
168
+ def feats_string
169
+ str = ""
170
+ @starting_feats.split(",").each do |feat|
171
+ str += "\'#{feat}',"
172
+ end
173
+ return str
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,43 @@
1
+ require 'csv'
2
+
3
+ module PfrpgImport
4
+ class HeroclassImporter
5
+
6
+ attr_reader :levels, :facts, :spells
7
+ def initialize(filename, path=nil)
8
+ @csv = CSV.read(filename)
9
+ @path = path
10
+ parser = HeroclassParser.new(@csv)
11
+ @levels = parser.levels
12
+ @facts = parser.facts
13
+ @spells = parser.spells
14
+ end
15
+
16
+ def import_heroclass
17
+ write_level_table
18
+ write_heroclass_file
19
+ write_feature_file
20
+ write_spell_file
21
+ end
22
+
23
+ def write_level_table
24
+ table = LevelWriter.new(@levels, @facts.title, @path)
25
+ table.print_class
26
+ end
27
+
28
+ def write_heroclass_file
29
+ heroclass = HeroclassWriter.new(@facts, @facts.title, @path)
30
+ heroclass.print_class
31
+ end
32
+
33
+ def write_feature_file
34
+ feature = FeatureWriter.new(@facts, @facts.title, @path)
35
+ feature.print_features
36
+ end
37
+
38
+ def write_spell_file
39
+ spell = SpellWriter.new(@spells, @facts.title, @path)
40
+ spell.print_spells
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ module PfrpgImport
2
+ class HeroclassLevels
3
+
4
+ attr_reader :levels
5
+ def initialize(csv_rows)
6
+ @levels = parse_levels(csv_rows)
7
+ end
8
+
9
+ def parse_levels(rows)
10
+ rows.map { |row| to_level(row) }
11
+ end
12
+
13
+ def to_level(row)
14
+ params = {
15
+ level: row[0],
16
+ bab: row[1],
17
+ fort_save: row[2],
18
+ ref_save: row[3],
19
+ will_save: row[4],
20
+ granted_features: row[5],
21
+ choices: nil
22
+ }
23
+ return Level.new(params)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ module PfrpgImport
2
+ class HeroclassParser
3
+ include CaseHelpers
4
+ attr_reader :facts, :levels, :spells, :filename_prefix
5
+ def initialize(csv)
6
+ factbundle = {
7
+ heroclass_name: csv[0][1],
8
+ description: csv[1][1],
9
+ class_skills: csv[2][1],
10
+ alignment: csv[3][1],
11
+ starting_wealth:csv[4][1],
12
+ hit_die: csv[5][1],
13
+ skills_per: csv[6][1],
14
+ spell_mod: csv[7][1],
15
+ starting_feats: csv[8][1]
16
+ }
17
+
18
+ @facts = HeroclassFacts.new(factbundle)
19
+ @levels = HeroclassLevels.new(csv[11..30]).levels
20
+ @spells = HeroclassSpells.new(csv[11..30]).spells
21
+ @filename_prefix = parse_filename
22
+ end
23
+
24
+ def parse_filename
25
+ underscored_title(@facts.friendly_name)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module PfrpgImport
2
+ class HeroclassSpells
3
+
4
+ attr_reader :spells
5
+ def initialize(csv_rows)
6
+ @spells = pretty_print(parse_spells(csv_rows))
7
+ end
8
+
9
+ def parse_spells(rows)
10
+ rows.map { |row| to_spell_row(row[6..15]) }
11
+ end
12
+
13
+ def to_spell_row(row)
14
+ spells = []
15
+ for i in 0..9
16
+ f = row[i] || "0"
17
+ f = f.gsub("—","0")
18
+ spells[i] = Integer(f)
19
+ end
20
+ return spells
21
+ end
22
+
23
+ def pretty_print(rows)
24
+ str = "[\n"
25
+ rows.each do |row|
26
+ str += "\t\t\t\t#{row},\n"
27
+ end
28
+ str += "\t\t\t]\n"
29
+ str
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ module PfrpgImport
2
+ class HeroclassWriter
3
+ include CaseHelpers
4
+
5
+ def initialize(facts, filename, path='./imported/')
6
+ @facts = facts
7
+ @filename = filename
8
+ @path = path
9
+ end
10
+
11
+ def print_class
12
+ filename = "#{@path}#{underscored_title(@filename)}.rb"
13
+ table = File.new(filename, "w")
14
+ str = "class PfrpgClasses::#{camelized_title(@filename)} < PfrpgClasses::Heroclass\n"
15
+ str += @facts.print_name
16
+ str += @facts.print_hit_die
17
+ str += @facts.print_starting_wealth
18
+ str += @facts.print_bonuses_for_level
19
+ str += @facts.print_create_feature
20
+ str += @facts.print_alignment
21
+ str += @facts.print_skills_per_level
22
+ str += @facts.print_spells_bonus_attr
23
+ str += @facts.print_spells_per_day
24
+ str += @facts.print_description
25
+ str += @facts.print_skills
26
+ str += @facts.print_feature_type
27
+ str += @facts.print_starting_feats
28
+ str += "end"
29
+ table.puts str
30
+ table.close
31
+ puts "Wrote #{filename}"
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,52 @@
1
+ module PfrpgImport
2
+ class Level
3
+ include CaseHelpers
4
+ attr_reader :level, :bab, :fort_save, :ref_save, :will_save,
5
+ :granted_features, :choices
6
+ def initialize(params)
7
+ @level = parse_level(params[:level])
8
+ @bab = parse_bab(params[:bab])
9
+ @fort_save = parse_save(params[:fort_save])
10
+ @ref_save = parse_save(params[:ref_save])
11
+ @will_save = parse_save(params[:will_save])
12
+ @granted_features = parse_features(params[:granted_features])
13
+ @choices = parse_choices(params[:choices])
14
+ end
15
+
16
+ def parse_level(level)
17
+ return Integer(level.gsub("nd","").gsub("th","").gsub("st","").gsub("rd",""))
18
+ end
19
+
20
+ def parse_bab(bab_string)
21
+ return arrayify(bab_string.gsub("+", "").split('/'))
22
+ end
23
+
24
+ def parse_save(save)
25
+ return save.gsub("+", "")
26
+ end
27
+
28
+ def parse_features(features)
29
+ return 'nil' if (!features || features.empty?)
30
+ return arrayify(features.split(',').map { |x| "\'#{x.underscore.downcase}\'" })
31
+ end
32
+
33
+ def parse_choices(choices)
34
+ return 'nil' if (!choices || choices.empty?)
35
+ return arrayify(choices)
36
+ end
37
+
38
+ def to_s(title)
39
+ <<-eos
40
+ when #{level}
41
+ bonus = { :base_attack_bonus => #{bab},
42
+ :fort_save => #{fort_save},
43
+ :ref_save => #{ref_save},
44
+ :will_save => #{will_save},
45
+ :granted_features => #{granted_features},
46
+ :choices => #{choices},
47
+ :spells_per_day => Tables::Spells::SpellsPerDay.#{title}(#{level})
48
+ }
49
+ eos
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ module PfrpgImport
2
+ class LevelBase
3
+ include CaseHelpers
4
+ def initialize(csv)
5
+ @csv = csv
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ module PfrpgImport
2
+ class LevelWriter
3
+ include PfrpgImport::CaseHelpers
4
+
5
+ def initialize(levels, filename, path='./imported/')
6
+ @levels = levels
7
+ @filename = filename
8
+ @path = path
9
+ end
10
+
11
+ def print_class
12
+ filename = "#{@path}#{underscored_title(@filename)}_table.rb"
13
+ table = File.new(filename, "w")
14
+ str = "class PfrpgTables::Tables::Heroclasses::#{camelized_title(@filename)}\n"
15
+ str += print_level_bonus
16
+ str += "end"
17
+ table.puts str
18
+ table.close
19
+ puts "Wrote #{filename}"
20
+ end
21
+
22
+ def print_level_bonus
23
+ level_string = ""
24
+ @levels.each do |level|
25
+ level_string += level.to_s(camelized_title(@filename))
26
+ end
27
+ return <<-eos
28
+ def self.level_bonus(level)
29
+ bonus = nil
30
+ case level
31
+ #{level_string}
32
+ end
33
+ return bonus
34
+ end
35
+ eos
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ module PfrpgImport
2
+ class SpellWriter
3
+ include CaseHelpers
4
+ def initialize(spells, filename, path='./imported/')
5
+ @spells = spells
6
+ @filename = filename
7
+ @path = path
8
+ end
9
+
10
+ def print_spells
11
+ filename = "#{@path}#{underscored_title(@filename)}_spells.rb"
12
+ table = File.new(filename, "w")
13
+ str = "class PfrpgTables::Tables::Spells::SpellsPerDay\n"
14
+ str += " def self.#{camelized_title(@filename)}(level)\n"
15
+ str += print_level_bonus
16
+ str += " end\n"
17
+ str += "end\n"
18
+ table.puts str
19
+ table.close
20
+ puts "Wrote #{filename}"
21
+ end
22
+
23
+ def print_level_bonus
24
+ <<-eos
25
+ spells =
26
+ #{@spells}
27
+ spells[level-1]
28
+ eos
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module PfrpgImport
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,17 @@
1
+ require 'pfrpg_import/case_helpers'
2
+ require 'pfrpg_import/level_writer'
3
+ require 'pfrpg_import/feature_writer'
4
+ require 'pfrpg_import/heroclass_writer'
5
+ require 'pfrpg_import/level_base'
6
+ require 'pfrpg_import/heroclass_importer'
7
+ require 'pfrpg_import/heroclass_levels'
8
+ require 'pfrpg_import/heroclass_facts'
9
+ require 'pfrpg_import/heroclass_spells'
10
+
11
+
12
+ Dir[File.expand_path(File.join(File.dirname(File.absolute_path(__FILE__)), 'pfrpg_import/')) + "/**/*.rb"].each do |file|
13
+ require file
14
+ end
15
+
16
+ module PfrpgImport
17
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Helper
2
+
3
+
4
+ end
@@ -0,0 +1,32 @@
1
+ require 'minitest/autorun'
2
+ require 'pfrpg_import'
3
+ require 'pfrpg_classes'
4
+ require 'pfrpg_tables'
5
+
6
+ class ImportTest < Minitest::Test
7
+
8
+ def setup
9
+ @path = './imported/test/'
10
+ if Dir.exists?("#{@path}")
11
+ FileUtils.rm_rf("#{@path}")
12
+ end
13
+ # Dir.mkdir("#{@path}") unless Dir.exists?("#{@path}")
14
+ Dir.mkdir("#{@path}")
15
+ end
16
+
17
+ def teardown
18
+
19
+ end
20
+
21
+ def test_import_adept_ruby
22
+ f = PfrpgImport::HeroclassImporter.new('adept.csv', @path)
23
+ f.import_heroclass
24
+ puts "Files present: #{Dir.glob(@path + "/*")}"
25
+ # ensure the files are valid ruby
26
+ assert load './imported/test/adept_table.rb'
27
+ assert load './imported/test/adept_spells.rb'
28
+ assert load './imported/test/adept_feature_info.rb'
29
+ assert load './imported/test/adept.rb'
30
+ end
31
+
32
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pfrpg_import
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jordan OMara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Import pfrpg modules suitable for herosheets
42
+ email:
43
+ - jordan@herosheets.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - Rakefile
49
+ - lib/pfrpg_import.rb
50
+ - lib/pfrpg_import/case_helpers.rb
51
+ - lib/pfrpg_import/feature_writer.rb
52
+ - lib/pfrpg_import/heroclass_facts.rb
53
+ - lib/pfrpg_import/heroclass_importer.rb
54
+ - lib/pfrpg_import/heroclass_levels.rb
55
+ - lib/pfrpg_import/heroclass_parser.rb
56
+ - lib/pfrpg_import/heroclass_spells.rb
57
+ - lib/pfrpg_import/heroclass_writer.rb
58
+ - lib/pfrpg_import/level.rb
59
+ - lib/pfrpg_import/level_base.rb
60
+ - lib/pfrpg_import/level_writer.rb
61
+ - lib/pfrpg_import/spell_writer.rb
62
+ - lib/pfrpg_import/version.rb
63
+ - test/helper.rb
64
+ - test/import_test.rb
65
+ homepage: http://herosheets.com
66
+ licenses: []
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.2.2
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: PFRPG Importer
88
+ test_files:
89
+ - test/helper.rb
90
+ - test/import_test.rb