npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fam-parser

v0.0.18

Published

FAM file parser

Downloads

5

Readme

FAM file parser

A library for parsing FAM files from Python or Javascript.

Python library

Installation:

pip install fam-parser

Use as a library:

import sys
from fam_parser import FamParser

parser = FamParser()
parser.read(open(example.fam'))
parser.write(sys.stdout)

Command line invocation:

fam_parser example.fam -

You can also invoke it directly from the repository root directory without installation:

python -m python.fam_parser example.fam -

Javascript library

Installation:

npm install fam-parser

Installation from source:

npm install
npm run dist

Use as a library:

var FamParser = require('fam-parser');

var parser = new FamParser(fs.readFileSync(
  'example.fam').toString('binary')
);

parser.getMembers().forEach(function(member) {
  console.log(member.SURNAME);
});

Command line invocation:

./node_modules/.bin/fam-parser example.fam

(Or, if you installed globally using npm install -g, the fam-parser binary should be in your $PATH.)

You can also invoke it directly from the repository root directory without installation:

node javascript/cli.js example.fam

Development of the FAM parser

We use the Python implementation for most of the development as it includes more debugging functionality. Any changes are later lifted to the Javascript implementation.

Preparations

First, make sure that wine is installed and that your CPU allows execution of 16-bit instructions:

echo 1 > /proc/sys/abi/ldt16

Reverse engineering

Run Cyrillic:

wine cyrillic.exe

And start editing a pedigree. Use xxd and watch to find differences:

while true; do watch --differences=permanent xxd pedigree.fam; done

Press Ctrl+c to clear the highlights.

Debugging

If something is wrong, then probably a skipped field is now assumed to be of fixed size, while it should be of variable size. To find the offending field, add the following line to the function _set_field:

print name

The offending field is probably one of the unnamed fields above the one you found, hopefully the nearest one.

Now you can give the unnamed field a name so you can inspect its content.

while true; do
  watch --differences=permanent \
    "fam_parser -d pedigree.fam - | tail -100 | head -50"
done

Vary the values for head and tail to focus on the part of the output you want to inspect.