pfrpg_import 0.0.1

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.
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